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

其他游戏

开发平台:

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_VERTEX_BUFFER_H
  9. #define HK_MESH_VERTEX_BUFFER_H
  10. /// The hkVertexFormat defines the 'elements' which make up a vertex.
  11. ///
  12. /// An element in this context is a usage and associated type. For example a vertex buffer which has positional
  13. /// and normal information would consist of two elements. An element for position (USAGE_POSITION), of 3 floats (TYPE_FLOAT32, 3 values),
  14. /// and another for the normal (USAGE_NORMAL) or 3 floats (TYPE_FLOAT32, 3 values)
  15. ///
  16. /// Each element has a usage, and sub usage. The usage and sub usage values should uniquely identify an element in a vertex
  17. /// format. The sub usage allows you to have more than one element with the same usage. A simple example of this could be
  18. /// with texture coordinates - the sub usage identifies the channel for the texture coordinates.
  19. ///
  20. /// You can build a vertex format by adding elements, specifying their usage, types and flags.
  21. /// In order to simplify processing of vertex formats, the elements must always be in a well defined order before they are
  22. /// used for anything. This order is usage / sub usage order. You can either add the elements in this order, or when you've
  23. /// added all of the elements call makeCanonicalOrder to automatically sort the elements into the appropriate order. Using
  24. /// makeCanonicalOrder is the recommended way of producing a valid vertex format, as it is future proof. If elements have
  25. /// been added in order, makeCanonicalOrder operates particularly rapidly.
  26. ///
  27. /// The flags deserve particular note in they can have a significant effect the vertex buffers behavior. The flag FLAG_NOT_SHARED
  28. /// is important - as it defines which components of a vertex buffer should be 'per instance'. If the vertex buffer is cloned
  29. /// these elements will be deep copied. Elements without the flag may be shared by both the original vertex buffer and the
  30. /// new vertex buffer.
  31. ///
  32. /// NOTE that behavior is undefined if you try to modify a shared component of shared vertex buffer. This gives an implementation
  33. /// of a vertex buffer more flexibility. In particular a simple implementation could deep copy all components if a single
  34. /// component is shared.
  35. ///
  36. /// sa hkMeshVertexBuffer
  37. struct hkVertexFormat
  38. {
  39. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SCENE_DATA, hkVertexFormat );
  40. enum { MAX_ELEMENTS  = 32 }; ///
  41. /// How the data is stored
  42. enum DataType
  43.     {
  44.         // Do not change order unless the s_dataTypeToSize array is altered
  45. TYPE_NONE = 0,
  46. TYPE_INT8,
  47. TYPE_UINT8,
  48. TYPE_INT16,
  49. TYPE_UINT16,
  50. TYPE_INT32,
  51. TYPE_UINT32,
  52.         TYPE_UINT8_DWORD,                   ///
  53. TYPE_ARGB32, ///
  54. TYPE_FLOAT16,
  55. TYPE_FLOAT32,
  56. TYPE_VECTOR4, /// Havok Vector4 type - 16 byte aligned (useful for memory vertex buffer formats)
  57. TYPE_LAST
  58. };
  59. /// What the data is used for
  60. enum DataUsage
  61. {
  62. USAGE_NONE = 0,
  63. USAGE_POSITION = 1, ///
  64. USAGE_NORMAL, ///
  65.         USAGE_COLOR,                        ///
  66. USAGE_TANGENT, ///
  67. USAGE_BINORMAL, ///
  68. USAGE_BLEND_MATRIX_INDEX, ///
  69. USAGE_BLEND_WEIGHTS, ///
  70. USAGE_BLEND_WEIGHTS_LAST_IMPLIED, ///
  71.         USAGE_TEX_COORD,                    ///
  72.         USAGE_POINT_SIZE,                   ///
  73.         USAGE_USER,                         ///
  74. USAGE_LAST
  75. };
  76. /// Extra hints which allow for optimized creation of vertex buffers
  77. enum HintFlags
  78. {
  79. FLAG_READ = 0x1, ///
  80. FLAG_WRITE = 0x2, ///
  81. FLAG_DYNAMIC = 0x4, ///
  82.         FLAG_NOT_SHARED = 0x8                   ///
  83. };
  84. /// Sharing hints
  85.     enum SharingType
  86.     {
  87.         SHARING_ALL_SHARED,                     
  88.         SHARING_ALL_NOT_SHARED,                 
  89.         SHARING_MIXTURE                         
  90.     };
  91. /// An element describes one component of a vertex
  92. struct Element
  93. {
  94. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SCENE_DATA, hkVertexFormat::Element );
  95.             /// Returns true if two elements are equal
  96.         HK_FORCE_INLINE bool operator==(const Element& rhs) const;
  97.             /// Returns true if two elements are not equal
  98.         HK_FORCE_INLINE bool operator!=(const Element& rhs) const;
  99. /// Set up an element
  100. HK_FORCE_INLINE void set(DataUsage usage, DataType dataType, int numValues, int subUsage = 0, int flags = 0);
  101.             /// Returns the size of the element in bytes (dword aligned)
  102.         HK_FORCE_INLINE int calculateAlignedSize() const;
  103.             /// Calculates the size of the element in bytes
  104.         HK_FORCE_INLINE int calculateSize() const;
  105.         hkEnum<DataType,  hkUint8>          m_dataType;         ///
  106.         hkUint8                             m_numValues;        ///
  107.         hkEnum<DataUsage, hkUint8>          m_usage;            ///
  108.         hkUint8                             m_subUsage;         ///
  109.         hkFlags<HintFlags, hkUint8>         m_flags;            ///
  110.         hkUint8                             m_pad[3];           ///
  111. };
  112. /// Default constructor
  113. hkVertexFormat();
  114. /// Copy ctor
  115. hkVertexFormat(const hkVertexFormat& rhs);
  116. /// Dtor -> needed to make hkVertexFormat work in hkObjectArray
  117. HK_FORCE_INLINE ~hkVertexFormat() {}
  118.         /// Returns true if the vertex formats are equal. They must be in canonical order
  119.     bool operator==(const hkVertexFormat& rhs) const;
  120.         /// Returns true if the vertex formats are not equal. They must be in canonical order.
  121.     HK_FORCE_INLINE bool operator!=(const hkVertexFormat& rhs) const;
  122.         /// Sets to the same format
  123.     void set(const hkVertexFormat& rhs);
  124.         /// Assignment
  125.     void operator=(const hkVertexFormat& rhs);
  126.         /// Removes all of the elements
  127.     HK_FORCE_INLINE void clear();
  128.         /// Vertex formats must be in 'canonical' order in order to be used. The order
  129.         /// is that each element is increasingly large usage type, and if of the same usage, increasing subUsage
  130.         /// It is invalid to have two elements with the same usage/subUsage
  131.         /// The format can either be constructed so that the order is correct, or after all the elements
  132.         /// are added this method can be called.
  133.     void makeCanonicalOrder();
  134. /// Returns true if the elements are in canonical order. If isCanonicalOrder() fails after makeCanonicalOrder() call
  135.         /// then the format is badly formed (more than one element with the same usage/subUsage for example)
  136.     bool isCanonicalOrder() const;
  137.         /// Returns the element index which has the semantic and subusage passed in. Returns -1 if not found.
  138.     int findElementIndex(DataUsage dataUsage, int subUsage) const;
  139.         /// For a given usage, finds the next free subUsage (ie. one larger than the largest subUsage). Returns 0 if there
  140.         /// are no elements of the usage.
  141.     int findNextSubUsage(DataUsage usage) const;
  142.         /// Add an element. The usage subUsage will be the next available subUsage
  143.     void addElement(DataUsage usage, DataType type, int numValues = 1, int flags = FLAG_READ | FLAG_WRITE);
  144. /// Add an element
  145. void addElement(const Element& element);
  146.         /// Finds out the mix of shared/unshared elements
  147.     SharingType calculateSharingType() const;
  148. //
  149. // Members
  150. //
  151.     struct Element m_elements[hkVertexFormat::MAX_ELEMENTS];    ///
  152.     int m_numElements;                                          ///
  153.     static const hkUint8 s_dataTypeToSize[];                    ///
  154. };
  155. extern const hkClass hkMeshVertexBufferClass;
  156. /// This is an abstract interface to a vertex buffer
  157. ///
  158. /// A vertex buffer contains an array of vertices in the format defined by the hkVertexFormat
  159. ///
  160. /// sa hkMeshShape hkVertexFormat
  161. class hkMeshVertexBuffer: public hkReferencedObject
  162. {
  163. public:
  164. HK_DECLARE_REFLECTION();
  165.         HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SCENE_DATA);
  166. /// This structure holds pointers to the in memory representation of the vertex buffer after locking it
  167. struct LockedVertices
  168.         {
  169. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SCENE_DATA, hkMeshVertexBuffer::LockedVertices);
  170.                 /// Finds the buffer index, -1 if not found
  171.             int findBufferIndex(hkVertexFormat::DataUsage usage, int subUsage) const;
  172. /// The buffer structures returned will always be in the same order as the elements
  173. /// either specified in a partial lock, or in the vertex format
  174. struct Buffer
  175. {
  176. /// Steps start to the next element
  177. HK_FORCE_INLINE void next();
  178. void* m_start; ///
  179. int   m_stride; ///
  180. struct hkVertexFormat::Element m_element; ///
  181. };
  182. struct Buffer m_buffers[ hkVertexFormat::MAX_ELEMENTS ]; ///
  183. int m_numBuffers; ///
  184. int m_numVertices; ///
  185. /// If true then the data has been returned in an interleaved format,
  186. /// meaning all the strides are the same, and all of the pointers are offsets into a single vertex.
  187. /// The data may not be contiguous (there may be gaps)
  188. hkBool m_isInterleaved;
  189. };
  190. /// Extra flags
  191. enum Flags
  192. {
  193.             ACCESS_READ = 1,                ///
  194.             ACCESS_WRITE = 2,               ///
  195. ACCESS_READ_WRITE = 3,          ///
  196. ACCESS_WRITE_DISCARD = 4, ///
  197. ACCESS_ELEMENT_ARRAY = 8  ///
  198. };
  199. /// Return values from a lock
  200. enum LockResult
  201. {
  202. RESULT_FAILURE = 0,
  203. RESULT_SUCCESS = 1,
  204. RESULT_IN_USE = 2
  205. };
  206.             /// Input structure for lock() and partialLock()
  207. struct LockInput
  208. {
  209. HK_FORCE_INLINE LockInput();
  210. int m_startVertex; ///
  211.             int m_numVertices;                                  ///
  212. hkBool m_noWait; ///
  213. hkBool m_contiguousAccess; ///
  214. int m_lockFlags; ///
  215. };
  216. /// Partial Lock input information
  217. struct PartialLockInput
  218. {
  219. HK_FORCE_INLINE PartialLockInput();
  220. int m_numLockFlags; ///
  221. int m_elementIndices[hkVertexFormat::MAX_ELEMENTS]; ///
  222. hkUint8 m_lockFlags[hkVertexFormat::MAX_ELEMENTS]; ///
  223. };
  224. /// Specifies the groups that should be shared. An implementation may share or just copy the data.
  225.         virtual hkMeshVertexBuffer* clone() = 0;
  226.             /// Returns true if all of the data is sharable - ie. if all data is sharable doing a clone will just return a ref count of this object
  227.             /// NOTE! That a format that says all the members are SHARABLE, doesn't mean this will return true - as an underlying implementation
  228.             /// may require per instance data (for example when software skinning)
  229.         virtual bool isSharable() = 0;
  230. /// Gets the vertex format and stores the result in formatOut
  231. virtual void getVertexFormat( hkVertexFormat& formatOut ) = 0;
  232. /// The total number of vertices in the vertex buffer
  233. virtual int getNumVertices() = 0;
  234. /// Lock all of the elements in a vertex buffer.
  235. /// Only one lock can be active on the vertex buffer at any time
  236. virtual LockResult lock( const LockInput& input, LockedVertices& lockedVerticesOut ) = 0;
  237. /// Perform a partial lock - locks a subset of elements.
  238. /// Only one lock can be active on the vertex buffer at any time.
  239. virtual LockResult partialLock( const LockInput& input, const PartialLockInput& partialInput, LockedVertices& lockedOut) = 0;
  240. /// Fetches elements into a vector4 array doing conversions as needed. Does not convert integral types.
  241. /// The elements being extracted must have been previously been locked with lock/partialLock.
  242. virtual void getElementVectorArray(const LockedVertices& lockedVertices, int elementIndex, hkVector4* compData) = 0;
  243. /// Sets the elements of an array doing conversions from hkVector4s as needed. Does not convert integral types
  244. /// The elements being set must have previously have been locked with lock/partialLock.
  245. virtual void setElementVectorArray(const LockedVertices& lockedVertices, int elementIndex, const hkVector4* compData) = 0;
  246. /// Sets the elements of an array doing conversions from integers as needed. Converts only integral types.
  247. /// The elements being extracted must have been previously been locked with lock/partialLock.
  248. virtual void getElementIntArray(const LockedVertices& lockedVertices, int elementIndex, int* compData) = 0;
  249. /// Sets the elements of an array doing conversions from integers as needed. Converts only integral types.
  250. /// The elements being set must have previously have been locked with lock/partialLock.
  251. virtual void setElementIntArray(const LockedVertices& lockedVertices, int elementIndex, const int* compData) = 0;
  252.             /// Unlock a previously locked vertex buffer. The lockedVertices structure that was set in 'lock' or 'partialLock'
  253. /// should be passed into the unlock. Undefined behavior results if lockedVertices contains any different values than
  254. /// were returned from the lock/partialLock call.
  255.         virtual void unlock( const LockedVertices& lockedVertices ) = 0;
  256. };
  257. #include <Common/GeometryUtilities/Mesh/hkMeshVertexBuffer.inl>
  258. #endif // HK_MESH_VERTEX_BUFFER_H
  259. /*
  260. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  261. * Confidential Information of Havok.  (C) Copyright 1999-2009
  262. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  263. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  264. * rights, and intellectual property rights in the Havok software remain in
  265. * Havok and/or its suppliers.
  266. * Use of this software for evaluation purposes is subject to and indicates
  267. * acceptance of the End User licence Agreement for this product. A copy of
  268. * the license is included with this software and is also available at www.havok.com/tryhavok.
  269. */