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

其他游戏

开发平台:

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 HKSCENEDATA_MESH_HKXVERTEXDESCRIPTION__H
  9. #define HKSCENEDATA_MESH_HKXVERTEXDESCRIPTION__H
  10. /// hkxVertexDescription meta information
  11. extern const class hkClass hkxVertexDescriptionClass;
  12. /// This structure describes the memory layout and format of a vertex buffer.
  13. class hkxVertexDescription
  14. {
  15. public:
  16. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SCENE_DATA, hkxVertexDescription );
  17. HK_DECLARE_REFLECTION();
  18. /// Default constructor
  19. inline hkxVertexDescription();
  20. enum DataType
  21. {
  22. HKX_DT_NONE = 0,
  23. HKX_DT_UINT8, // only used for four contiguous hkUint8s, hkUint8[4]
  24. HKX_DT_INT16, // only used for old style quantized tcoords (0x7fff maps to 10.0f), so div by 3276.7f to get the float tcoords. Deprecated.
  25. HKX_DT_UINT32,
  26. HKX_DT_FLOAT,
  27. HKX_DT_FLOAT2, // for tex coords 
  28. HKX_DT_FLOAT3, // will always be 16byte aligned, so you can treat as a hkVector4 (with undefined w, with SIMD enabled etc)
  29. HKX_DT_FLOAT4  // will always be 16byte aligned, so you can treat as a hkVector4 (with SIMD enabled etc)
  30. };
  31. enum DataUsage
  32. {
  33. HKX_DU_NONE = 0,
  34. HKX_DU_POSITION = 1,
  35. HKX_DU_COLOR = 2,    // first color always can be assumed to be per vertex Diffuse, then per vertex Specular (rare)
  36. HKX_DU_NORMAL = 4,
  37. HKX_DU_TANGENT = 8,
  38. HKX_DU_BINORMAL = 16, // aka BITANGENT
  39. HKX_DU_TEXCOORD = 32, // in order, 0,1,2, etc of the texture channels. Assumed to be 2D, [u,v], in most cases
  40. HKX_DU_BLENDWEIGHTS = 64,  // usually 4 weights, but 3 can be stored with 1 implied. Can be stored as 4*uint8, so quantized where 1.0f => 0xff (255),
  41. HKX_DU_BLENDINDICES = 128, // usually 4 hkUint8s in a row. So can reference 256 blend transforms (bones)
  42. HKX_DU_USERDATA = 256
  43. };
  44. struct ElementDecl
  45. {
  46. HK_DECLARE_REFLECTION();
  47. hkUint32 m_byteOffset; // from start of a vertex
  48. hkEnum<DataType,  hkUint16> m_type;
  49. hkEnum<DataUsage, hkUint16> m_usage;
  50. };
  51. inline hkUint32 getUsageCount( DataUsage usage ) const; // 0 if not used.
  52. inline const ElementDecl* getElementDeclByIndex( int index ) const; //Will return NULL on error
  53. inline const ElementDecl* getElementDecl( DataUsage usage, int index ) const; // index == cardinal of that usage, eg TexCoord0, TexCoord1 etc. Will return NULL on error
  54. inline ElementDecl* getElementDeclByIndex( int index ); //Will return NULL on error
  55. inline ElementDecl* getElementDecl( DataUsage usage, int index ); // index == cardinal of that usage, eg TexCoord0, TexCoord1 etc. Will return NULL on error
  56. // as used quite often:
  57. inline hkUint32 getElementByteOffset( DataUsage usage, int index ) const; 
  58. inline DataType getElementType( DataUsage usage, int index ) const; 
  59. inline hkUint32 getMask() const;
  60. // Gets the vertex class that will match the decl (as best it can). Will remove the Elems that it was not able to cater for
  61. // with the limited vertex formats we have compiled in to support easy serialization.
  62. static const hkClass* HK_CALL getBuiltInVertexClass( const hkArray<hkxVertexDescription::DataUsage>& desiredElems, hkArray<ElementDecl>& classElems );
  63. static void HK_CALL getClassElements( const hkClass* klass, const hkArray<hkxVertexDescription::DataUsage>& desiredElems, hkArray<ElementDecl>& classElems );
  64. public:
  65. /// The byte offsets between two consecutive vertices
  66. hkUint32 m_stride;
  67. /// The vertex layout
  68. hkArray<struct ElementDecl> m_decls;
  69. };
  70. // The types are set for the common built in types, so you just get to choose the data usage (num tex coords, tangents etc)
  71. static hkxVertexDescription* HK_CALL hkxCreateSerializableVertexDescription( const hkArray<hkxVertexDescription::DataUsage>& desiredElems );
  72. #include <Common/SceneData/Mesh/hkxVertexDescription.inl>
  73. #endif // HKSCENEDATA_MESH_HKXVERTEXDESCRIPTION__H
  74. /*
  75. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  76. * Confidential Information of Havok.  (C) Copyright 1999-2009
  77. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  78. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  79. * rights, and intellectual property rights in the Havok software remain in
  80. * Havok and/or its suppliers.
  81. * Use of this software for evaluation purposes is subject to and indicates
  82. * acceptance of the End User licence Agreement for this product. A copy of
  83. * the license is included with this software and is also available at www.havok.com/tryhavok.
  84. */