hkDefaultCompoundMeshShape.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:8k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HK_DEFAULT_COMPOUND_MESH_SHAPE_H
  9. #define HK_DEFAULT_COMPOUND_MESH_SHAPE_H
  10. #include <Common/GeometryUtilities/Mesh/hkMeshShape.h>
  11. #include <Common/GeometryUtilities/Mesh/hkMeshBody.h>
  12. #include <Common/GeometryUtilities/Mesh/IndexedTransformSet/hkIndexedTransformSet.h>
  13. class hkMeshSystem;
  14. extern const hkClass hkDefaultCompoundMeshShapeClass;
  15. /// A simple default implementation of hkMeshShape, which could be used as a default implementation for compound shapes
  16. ///
  17. /// When using an hkMeshSystem, there is the method 'createCompoundShape' which creates a new shape out of a combination
  18. /// of pre-existing shapes. Each of the contained shapes is controlled via a unique transform in the transform set.
  19. ///
  20. /// The default compound mesh shape, provides a simple way of implementing this functionality, in that it will use the
  21. /// functionality that has already been implemented in for normal shapes on hkMeshSystem to emulate the compound shape
  22. /// result.
  23. ///
  24. /// In order to make this work in an implementation of hkMeshSystem, when a body is constructed from a hkDefaultCompoundMeshShape,
  25. /// a hkDefaultCompoundMeshBody should be created. This will then manufacture hkMeshBodys for all of the contained hkMeshShapes.
  26. /// When a hkDefaultCompoundMeshBody is added to a hkMeshSystem, the addToSystem method should be called. When it is removed the
  27. /// addFromSystem should be called. These methods will add and remove all of the contained hkMeshBodys respectively.
  28. ///
  29. /// In an implementation of hkMeshSystem - identification of the shape or bodies type so an appropriate code route can be
  30. /// taken can be achieved by using the getClassType method.
  31. ///
  32. /// sa hkMeshShape
  33. class hkDefaultCompoundMeshShape: public hkMeshShape
  34. {
  35.     public:
  36.         HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SCENE_DATA);
  37.             // Ctor
  38. hkDefaultCompoundMeshShape( const hkMeshShape*const * shapes, const hkMatrix4* transforms, int numShapes);
  39.             // Dtor
  40.         virtual ~hkDefaultCompoundMeshShape();
  41.             // hkMeshShape implementation
  42.         virtual int getNumSections() const;
  43.             // hkMeshShape implementation
  44. virtual void lockSection(int sectionIndex, hkUint8 accessFlags, hkMeshSection& sectionOut) const;
  45.             // hkMeshShape implementation
  46. virtual void unlockSection(const hkMeshSection& section) const;
  47.             // hkReferencedObjectImplementation
  48.         virtual const hkClass* getClassType() const { return &hkDefaultCompoundMeshShapeClass; }
  49.             // hkReferencedObjectImplementation
  50.         virtual void calcContentStatistics( hkStatisticsCollector* collector,const hkClass* cls ) const;
  51.             /// Create a list of shapes (ref'd) for each transform index
  52.         static void HK_CALL createTransformIndexedShapeList(hkMeshSystem* meshSystem,  const hkMeshSectionCinfo* sectionsIn, int numSections, hkArray<const hkMeshShape*>& shapesOut);
  53.             /// Returns true if all of the sections have a transform index.
  54.         static hkBool HK_CALL hasIndexTransforms(const hkMeshSectionCinfo* sections, int numSections);
  55.             /// Will create a compound shape, made up of shapes which have the same transform index
  56.         static hkDefaultCompoundMeshShape* HK_CALL createTransformIndexedShape(hkMeshSystem* meshSystem,  const hkMeshSectionCinfo* sectionsIn, int numSections);
  57. public:
  58. //
  59. // Members
  60. //
  61.         struct MeshSection
  62.         {
  63.             int m_shapeIndex;
  64.             int m_sectionIndex;
  65.         };
  66.         hkArray<const hkMeshShape*> m_shapes; ///
  67. hkArray<hkMatrix4> m_defaultChildTransforms;  ///
  68.         hkArray<MeshSection> m_sections; ///
  69. };
  70. extern const hkClass hkDefaultCompoundMeshBodyClass;
  71. /// A simple implementation of hkMeshBody - which simulates a compound body using multiple contained bodies.
  72. ///
  73. /// This class should be used with the hkDefaultCompoundMeshShape class. It holds the hkMeshBody objects that
  74. /// are constructed from the contained shapes from the hkDefaultCompoundMeshShape.
  75. ///
  76. /// To make function correctly in an implementation of hkMeshSystem, the method addToSystem and removeFromSystem
  77. /// should be called when the hkDefaultCompoundMeshBody is added or removed from the world. Use the getClassType
  78. /// method to identity the type of object in the implementation of addBody/removeBody on the hkMeshSystem.
  79. ///
  80. /// For an implementation of this - look at the hkgMeshSystem implementation.
  81. ///
  82. /// sa hkMeshBody
  83. class hkDefaultCompoundMeshBody: public hkMeshBody
  84. {
  85.     public:
  86.         HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SCENE_DATA);
  87. /// Ctor
  88. hkDefaultCompoundMeshBody(hkMeshSystem* meshSystem, const hkDefaultCompoundMeshShape* shape, const hkMatrix4& transform, hkIndexedTransformSetCinfo* transformSetCinfo);
  89. // Dtor
  90. virtual ~hkDefaultCompoundMeshBody();
  91.             // hkReferencedObjectImplementation
  92.         virtual const hkClass* getClassType() const { return &hkDefaultCompoundMeshBodyClass; }
  93.             // hkReferencedObjectImplementation
  94.         virtual void calcContentStatistics( hkStatisticsCollector* collector,const hkClass* cls ) const;
  95.             // hkMeshBody implementation
  96.         virtual const hkMeshShape* getMeshShape() const;
  97.             // hkMeshBody implementation
  98.         virtual void getTransform( hkMatrix4& transform ) const;
  99.             // hkMeshBody implementation
  100.         virtual void setTransform(const hkMatrix4& matrix);
  101.             // hkMeshBody implementation
  102.         virtual hkResult setPickingData(int id, void* data);
  103.             // hkMeshBody implementation
  104.         virtual hkMeshVertexBuffer* getVertexBuffer(int sectionIndex);
  105.             // hkMeshBody implementation
  106.         virtual int getNumIndexedTransforms() { return m_transformSet ? m_transformSet->getNumMatrices() : 0; }
  107.             // hkMeshBody implementation
  108.         virtual void setIndexedTransforms(int startIndex, const hkMatrix4* matrices, int numMatrices);
  109.             // hkMeshBody implementation
  110.         virtual void getIndexedTransforms(int startIndex, hkMatrix4* matrices, int numMatrices) { HK_ASSERT(0x423432, m_transformSet); m_transformSet->getMatrices(startIndex, matrices, numMatrices); }
  111.             // hkMeshBody implementation
  112.         virtual void getIndexedInverseTransforms(int startIndex, hkMatrix4* matrices, int numMatrices) { HK_ASSERT(0x34243206, m_transformSet); m_transformSet->getInverseMatrices(startIndex, matrices, numMatrices); }
  113.             // hkMeshBody implementation
  114.         virtual void completeUpdate();
  115.         void addToSystem(hkMeshSystem* meshSystem);
  116.         void removeFromSystem(hkMeshSystem* meshSystem);
  117. const hkArray<hkMeshBody*>& getChildBodies() const { return m_bodies; }
  118.     protected:
  119. void _update();
  120. //
  121. // Members
  122. //
  123. protected:
  124.         // With a compound shape, there are multiple contained shapes, otherwise there is just one
  125.         hkArray<hkMeshBody*> m_bodies;
  126.         hkMatrix4 m_transform;
  127.         // The shape this has been created from
  128.         const hkDefaultCompoundMeshShape* m_shape;
  129.         hkRefPtr<hkIndexedTransformSet> m_transformSet;
  130.         //
  131. hkBool m_transformIsDirty;
  132. hkBool m_transformSetUpdated;
  133. };
  134. #endif // HK_DEFAULT_COMPOUND_MESH_SHAPE_H
  135. /*
  136. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  137. * Confidential Information of Havok.  (C) Copyright 1999-2009
  138. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  139. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  140. * rights, and intellectual property rights in the Havok software remain in
  141. * Havok and/or its suppliers.
  142. * Use of this software for evaluation purposes is subject to and indicates
  143. * acceptance of the End User licence Agreement for this product. A copy of
  144. * the license is included with this software and is also available at www.havok.com/tryhavok.
  145. */