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

其他游戏

开发平台:

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_MESH_SHAPE_H
  9. #define HK_MESH_SHAPE_H
  10. class hkMeshVertexBuffer;
  11. struct hkVertexFormat;
  12. extern const hkClass hkMeshMaterialClass;
  13. /// A material used with a mesh
  14. ///
  15. /// This interface is used to represent a graphics engines specific implementation of a material. In this context a
  16. /// 'material' means how a geometric primitive is rasterized in terms of lighting, texture mapping and so forth.
  17. /// The mesh system doesn't need any direct details on how an engines material works, just a handle to tell an implementation
  18. /// which internal material to use.
  19. ///
  20. /// The interface has methods which allow determination of if vertex buffers/formats are suitable for a material. For example
  21. /// a material may require vertex normals to render correctly - these methods provide a way for the material to communicate
  22. /// with utilities about such requirements, in doing so allow such elements to be created as needed.
  23. ///
  24. /// The createCompatibleVertexBuffer() is part of the interface as well as createCompatibleVertexFormat(), because an implementation
  25. /// may have a method of rapidly converting a vertex buffer into an appropriate format for the material, or perhaps the vertex
  26. /// buffer needs to have vertex elements generated which the standard tools do not know about. For example a material may require
  27. /// a channel to hold a certain type of noise - the tools could not generate this but the material may be able to.
  28. ///
  29. /// sa hkMeshShape hkMeshMaterialRegistry
  30. class hkMeshMaterial: public hkReferencedObject
  31. {
  32. public:
  33. HK_DECLARE_REFLECTION();
  34. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SCENE_DATA);
  35. /// Returns a vertex buffer format that is compatible with this material
  36. virtual hkResult createCompatibleVertexFormat(const hkVertexFormat& format, hkVertexFormat& compatibleFormat) = 0;
  37. /// Constructs a suitable vertex buffer based on the input.
  38. /// If the input is suitable, may return the input ref'd.
  39. virtual hkMeshVertexBuffer* createCompatibleVertexBuffer(hkMeshVertexBuffer* buffer) = 0;
  40. /// Returns true if this vertex buffer is suitable for this material
  41. virtual bool isCompatible(const hkMeshVertexBuffer* buffer) = 0;
  42. virtual const char* getName() const { return HK_NULL; }
  43. };
  44. /// A mesh section is a collection of render primitives which all use the same material and vertex buffer.
  45. ///
  46. /// A mesh section is made up of a vertex buffer (potentially shared between multiple mesh sections, and shapes), a
  47. /// (potentially shared) material and a list of primitives. Primitives are not shared, although they will typically
  48. /// be shared with every hkMeshBody instantiation of a hkMeshShape.
  49. ///
  50. /// A mesh section may or may not have indices associated with it. If there aren't indices associated then
  51. /// the primitive will just use the vertices starting from m_vertexStartIndex to make up the primitive types.
  52. /// Also note that it is possible for each mesh section to have its own transform - which can be independently set.
  53. /// If the mesh is using an indexed transform the m_transformIndex will specify which transform will be used. The final
  54. /// transform of the vertices will the indexed transform followed by the hkMeshBodys transform.
  55. ///
  56. /// sa hkMeshShape hkMeshBody
  57. struct hkMeshSection
  58. {
  59. HK_DECLARE_REFLECTION();
  60.     HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SCENE_DATA, hkMeshSection );
  61. /// The different index types
  62. enum MeshSectionIndexType
  63. {
  64.         INDEX_TYPE_NONE,                    ///
  65. INDEX_TYPE_UINT16, ///
  66. INDEX_TYPE_UINT32 ///
  67. };
  68. /// The different primitive types
  69. enum PrimitiveType
  70. {
  71. PRIMITIVE_TYPE_UNKNOWN, ///
  72. PRIMITIVE_TYPE_POINT_LIST, ///
  73. PRIMITIVE_TYPE_LINE_LIST, ///
  74. PRIMITIVE_TYPE_TRIANGLE_LIST, ///
  75. PRIMITIVE_TYPE_TRIANGLE_STRIP  ///
  76. };
  77. hkEnum<PrimitiveType,hkUint8> m_primitiveType;     ///
  78.     int m_numPrimitives;                    ///
  79.     int m_numIndices;                       ///
  80.     int m_vertexStartIndex;                 ///
  81.     int m_transformIndex;                   ///
  82.     hkEnum<MeshSectionIndexType,hkUint8> m_indexType;  ///
  83. /// The indices (will be HK_NULL if there are no indices, or if a lockMeshSection didn't request the indices).
  84. /// NOTE the indices order and type may be different to that specified in the hkMeshSectionCinfo
  85.     const void* m_indices;
  86.     hkMeshVertexBuffer* m_vertexBuffer; ///
  87.     hkMeshMaterial* m_material;             ///
  88.     int m_sectionIndex;                     ///
  89. };
  90. /// Structure for describing mesh sections for construction
  91. ///
  92. /// A hkMeshShape is made up of one or more mesh sections. The hkMeshSectionCinfo structure describes each mesh
  93. /// section for construction of the shape.
  94. ///
  95. /// A mesh section can consist of a vertex buffer (potentially shared), a material (potentially shared) and a number of
  96. /// primitives - indexed or not. Note that the vertex buffer can only be a vertex buffer constructed on the hkMeshSystem
  97. /// where the shape is being constructed. Also note that vertex buffers returned from a hkMeshBody should NOT be used
  98. /// to construct a hkMeshShape either.
  99. ///
  100. /// A primitive type specifies what kind of primitive this mesh section will draw. Currently only points, lines and
  101. /// triangles are supported.
  102. ///
  103. /// Each mesh section can be associated with an indexed transform which can be set on the hkMeshBody. To use this feature
  104. /// ALL of the mesh sections associated with the hkMeshShape must have a m_transformIndex >= 0.
  105. ///
  106. /// It is possible to define a mesh section without indices - set the m_indices member to HK_NULL, and set the m_vertexStartIndex
  107. /// to the vertex start index for the primitive to be drawn. The primitive will use vertex indices increasing from this value for
  108. /// each additional point.
  109. ///
  110. /// sa hkMeshShape
  111. struct hkMeshSectionCinfo
  112. {
  113. HK_DECLARE_REFLECTION();
  114.     HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SCENE_DATA, hkMeshSectionCinfo );
  115.     hkMeshVertexBuffer* m_vertexBuffer; ///
  116.     hkMeshMaterial* m_material; ///
  117.     hkEnum<hkMeshSection::PrimitiveType, hkUint8> m_primitiveType;  ///
  118.     int m_numPrimitives; ///
  119.     hkEnum<hkMeshSection::MeshSectionIndexType,hkUint8> m_indexType; ///
  120.     const void* m_indices; ///
  121.     int m_vertexStartIndex; ///
  122.     int m_transformIndex; ///
  123. };
  124. extern const hkClass hkMeshShapeClass;
  125. /// This interface defines geometrically how a graphics entity will appear.
  126. ///
  127. /// A mesh shape consists of one or more mesh sections. A mesh section consists of a
  128. ///   - reference to a vertex buffer
  129. ///   - a material
  130. ///   - triangle indices.
  131. /// Basic information about a mesh section can be determined by calling lockMeshSection.
  132. ///
  133. /// It is implementation specific how index information is stored internally. Therefore it is NOT guaranteed that the
  134. /// index, order, primitive type will be the same once the hkMeshShape has been constructed. This allows an implementation to
  135. /// use indexing information for best memory usage/performance.
  136. ///
  137. /// If a mesh section does not have any indices ( this can be determined if m_vertexStartIndex >= 0 in the hkMeshSection
  138. /// structure returned by getMeshSection), then the m_indices member of hkMeshSection will be HK_NULL.
  139. ///
  140. /// In order to make access of the primitives more simple there are utilities such as hkMeshPrimitiveUtil which will
  141. /// convert a mesh sections primitives (if possible) into an indexed triangle list more simple processing.
  142. ///
  143. /// To draw a mesh, you need an instance of a hkMeshBody referencing the hkMeshShape.
  144. /// In order for the body (and therefore shape) to be drawn the hkMeshBody has to be
  145. /// added to the hkMeshSystem.
  146. ///
  147. /// sa hkMeshBody hkMeshMaterial hkMeshSystem
  148. class hkMeshShape: public hkReferencedObject
  149. {
  150. public:
  151. HK_DECLARE_REFLECTION();
  152. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SCENE_DATA);
  153. hkMeshShape() {}
  154. hkMeshShape( hkFinishLoadedObjectFlag flag ): hkReferencedObject(flag) {}
  155.         enum AccessFlags
  156.         {
  157.             ACCESS_INDICES = 0x1,               ///
  158.             ACCESS_VERTEX_BUFFER = 0x2          ///
  159.         };
  160. /// Returns the amount of sections
  161. virtual int getNumSections() const = 0;
  162. /// Gets information about a section
  163.             ///
  164.             /// Must be balanced with unlockSection calls. NOTE there can be multiple locks active at one time.
  165.             /// Forgetting to call unlockSection may lead to memory leaks, and other problems.
  166.             /// Also the contents of the hkMeshSection structure are only guarenteed to be valid in between
  167.             /// lock/unlockSection. To keep a vertex buffer in scope - you can addReference(). The only exception
  168.             /// is the hkMeshMaterial which will remain in scope.
  169.         virtual void lockSection(int sectionIndex, hkUint8 accessFlags, hkMeshSection& sectionOut) const = 0;
  170.             /// Unlocks a mesh section. Must be given exactly the same structure contents as was returned from a lockSection
  171.             /// otherwise behavior is undefined.
  172.         virtual void unlockSection(const hkMeshSection& section) const = 0;
  173. /// Returns an optional name of the mesh shape
  174. virtual const char* getName() const { return HK_NULL; }
  175. /// Sets an optional name
  176. virtual void setName(const char* n) const { }
  177. };
  178. #endif // HK_MESH_SHAPE_H
  179. /*
  180. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  181. * Confidential Information of Havok.  (C) Copyright 1999-2009
  182. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  183. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  184. * rights, and intellectual property rights in the Havok software remain in
  185. * Havok and/or its suppliers.
  186. * Use of this software for evaluation purposes is subject to and indicates
  187. * acceptance of the End User licence Agreement for this product. A copy of
  188. * the license is included with this software and is also available at www.havok.com/tryhavok.
  189. */