hctUserChannelUtil.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 HK_USER_CHANNEL_UTIL_H
  9. #define HK_USER_CHANNEL_UTIL_H
  10. #include <Common/Base/Container/Array/hkObjectArray.h>
  11. /// This class stores component data (vertex, edge, triangle selection and data) using global indices for the components.
  12. /// Then, with the help of maps between section indices and global indices, it creates and stores that data in the sections
  13. /// of an hkxMesh.
  14. /// This is used by all exporters to easily map between data in the modeller to user channels in the hkxMesh sections
  15. class hctUserChannelUtil
  16. {
  17. public:
  18. /// Defined the type of global component data. Currently only "CT_VERTEX_SELECTION" is supported.
  19. /// Note that FACE channels will become TRIANGLE channels.
  20. enum ChannelType
  21. {
  22. CT_INVALID = -1,
  23. CT_VERTEX_SELECTION =0,
  24. CT_VERTEX_FLOAT,            // floats per vertex counting duplicated vertices as identical
  25. CT_SAMPLE_FLOAT,            // floats per vertex counting duplicated vertices separately
  26. CT_VERTEX_INT, // not implemented yet
  27. CT_VERTEX_VECTOR, // not implemented yet
  28. CT_EDGE_SELECTION = 10 , // not implemented yet
  29. CT_FACE_SELECTION = 20
  30. };
  31. enum ChannelDimensions
  32. {
  33. CD_INVALID = -1,
  34. CD_FLOAT = 0,
  35. CD_DISTANCE,
  36. CD_ANGLE
  37. };
  38. /// Union of index, int, float and vector elements (depending on the type of component data)
  39. union ChannelDataItem
  40. {
  41. int m_index;
  42. int m_integer;
  43. float m_float;
  44. float m_vector[4];
  45. };
  46. /// Data describing a channel for component data. Indices are global.
  47. struct GlobalChannel
  48. {
  49. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_EXPORT, GlobalChannel );
  50. hkString m_channelName;
  51. ChannelType m_channelType;
  52. ChannelDimensions m_channelDimensions;
  53. hkArray<ChannelDataItem> m_channelData;
  54. GlobalChannel (const GlobalChannel& other)
  55. {
  56. m_channelName = other.m_channelName;
  57. m_channelType = other.m_channelType;
  58. m_channelDimensions = other.m_channelDimensions;
  59. m_channelData = other.m_channelData;
  60. }
  61. GlobalChannel () : m_channelName (""), m_channelType (CT_INVALID) {}
  62. };
  63. /// A map between the indices of this section and the original indices of the global mesh
  64. struct SectionToGlobalMap
  65. {
  66. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_EXPORT, SectionToGlobalMap );
  67. // Maps vertices in the section to vertices in the mesh, counting duplicated vertices as identical
  68. hkArray<int> m_sectionVertexIdToGlobalVertexId; 
  69. // Maps vertices in the section to vertices in the mesh, counting duplicated vertices separately
  70. hkArray<int> m_sectionVertexIdToGlobalSampleId; 
  71. hkArray<int> m_sectionTriangleIdToGlobalFaceId;
  72. SectionToGlobalMap (const SectionToGlobalMap& other)
  73. {
  74. m_sectionVertexIdToGlobalVertexId = other.m_sectionVertexIdToGlobalVertexId;
  75. m_sectionVertexIdToGlobalSampleId = other.m_sectionVertexIdToGlobalSampleId;
  76. m_sectionTriangleIdToGlobalFaceId = other.m_sectionTriangleIdToGlobalFaceId;
  77. }
  78. SectionToGlobalMap () {}
  79. };
  80. /// Add a new user channel to the mesh
  81. void addGlobalChannel (const GlobalChannel& globalChannel);
  82. /// Register a new section in the mesh and provide a map between indices in the section and indices in the original mesh
  83. void registerSection (const SectionToGlobalMap& sectionMap);
  84. /// Converts the stored global channels to individual per-section channels, which are added to the hkxMeshSections of the
  85. /// given mesh. Allocations are done using the given hctFilterMemoryTracker object.
  86. void storeChannelsInMesh (hkxMesh* theMesh,  class hctFilterMemoryTracker* memoryTracker);
  87. /// Clears all the stored data. Useful if the object is reused for multiple meshes
  88. void clear();
  89. private:
  90. hkObjectArray<GlobalChannel> m_globalChannels;
  91. hkObjectArray<SectionToGlobalMap> m_sectionMaps;
  92. void processVertexSelection (class hctFilterMemoryTracker* memory, int channelNumber, int sectionNumber, hkxMesh* theMesh) const;
  93. void processFaceSelection (class hctFilterMemoryTracker* memory, int channelNumber, int sectionNumber, hkxMesh* theMesh) const;
  94. void processFloatData (class hctFilterMemoryTracker* memory, int ChannelNumber, int sectionNumber, hkxMesh* theMesh) const;
  95. };
  96. #endif // HK_USER_CHANNEL_UTIL_H
  97. /*
  98. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  99. * Confidential Information of Havok.  (C) Copyright 1999-2009
  100. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  101. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  102. * rights, and intellectual property rights in the Havok software remain in
  103. * Havok and/or its suppliers.
  104. * Use of this software for evaluation purposes is subject to and indicates
  105. * acceptance of the End User licence Agreement for this product. A copy of
  106. * the license is included with this software and is also available at www.havok.com/tryhavok.
  107. */