MeshBinary.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. // WARNING: This file is auto generated.
  6. #pragma once
  7. #include <AnKi/Resource/Common.h>
  8. #include <AnKi/Math.h>
  9. #include <AnKi/Gr/Common.h>
  10. namespace anki {
  11. /// @addtogroup resource
  12. /// @{
  13. inline constexpr const char* kMeshMagic = "ANKIMES8";
  14. enum class MeshBinaryFlag : U32
  15. {
  16. kNone = 0,
  17. kConvex = 1 << 0,
  18. kAll = kConvex,
  19. };
  20. ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(MeshBinaryFlag)
  21. /// Vertex buffer info.
  22. class MeshBinaryVertexBuffer
  23. {
  24. public:
  25. /// The size of the vertex. It's zero if the buffer is not present.
  26. U32 m_vertexStride;
  27. template<typename TSerializer, typename TClass>
  28. static void serializeCommon(TSerializer& s, TClass self)
  29. {
  30. s.doValue("m_vertexStride", offsetof(MeshBinaryVertexBuffer, m_vertexStride), self.m_vertexStride);
  31. }
  32. template<typename TDeserializer>
  33. void deserialize(TDeserializer& deserializer)
  34. {
  35. serializeCommon<TDeserializer, MeshBinaryVertexBuffer&>(deserializer, *this);
  36. }
  37. template<typename TSerializer>
  38. void serialize(TSerializer& serializer) const
  39. {
  40. serializeCommon<TSerializer, const MeshBinaryVertexBuffer&>(serializer, *this);
  41. }
  42. };
  43. /// Vertex attribute.
  44. class MeshBinaryVertexAttribute
  45. {
  46. public:
  47. U32 m_bufferIndex;
  48. /// If the format is kNone then the attribute is not present.
  49. Format m_format;
  50. U32 m_relativeOffset;
  51. /// Attribute is compressed and needs to be scaled.
  52. Array<F32, 4> m_scale;
  53. /// Attribute is compressed and needs to be translated.
  54. Array<F32, 4> m_translation;
  55. template<typename TSerializer, typename TClass>
  56. static void serializeCommon(TSerializer& s, TClass self)
  57. {
  58. s.doValue("m_bufferIndex", offsetof(MeshBinaryVertexAttribute, m_bufferIndex), self.m_bufferIndex);
  59. s.doValue("m_format", offsetof(MeshBinaryVertexAttribute, m_format), self.m_format);
  60. s.doValue("m_relativeOffset", offsetof(MeshBinaryVertexAttribute, m_relativeOffset), self.m_relativeOffset);
  61. s.doArray("m_scale", offsetof(MeshBinaryVertexAttribute, m_scale), &self.m_scale[0], self.m_scale.getSize());
  62. s.doArray("m_translation", offsetof(MeshBinaryVertexAttribute, m_translation), &self.m_translation[0], self.m_translation.getSize());
  63. }
  64. template<typename TDeserializer>
  65. void deserialize(TDeserializer& deserializer)
  66. {
  67. serializeCommon<TDeserializer, MeshBinaryVertexAttribute&>(deserializer, *this);
  68. }
  69. template<typename TSerializer>
  70. void serialize(TSerializer& serializer) const
  71. {
  72. serializeCommon<TSerializer, const MeshBinaryVertexAttribute&>(serializer, *this);
  73. }
  74. };
  75. /// Bounding volume info.
  76. class MeshBinaryBoundingVolume
  77. {
  78. public:
  79. /// Bounding box min.
  80. Vec3 m_aabbMin;
  81. /// Bounding box max.
  82. Vec3 m_aabbMax;
  83. /// Bounding sphere center.
  84. Vec3 m_sphereCenter;
  85. /// Bounding sphere radius.
  86. F32 m_sphereRadius;
  87. template<typename TSerializer, typename TClass>
  88. static void serializeCommon(TSerializer& s, TClass self)
  89. {
  90. s.doValue("m_aabbMin", offsetof(MeshBinaryBoundingVolume, m_aabbMin), self.m_aabbMin);
  91. s.doValue("m_aabbMax", offsetof(MeshBinaryBoundingVolume, m_aabbMax), self.m_aabbMax);
  92. s.doValue("m_sphereCenter", offsetof(MeshBinaryBoundingVolume, m_sphereCenter), self.m_sphereCenter);
  93. s.doValue("m_sphereRadius", offsetof(MeshBinaryBoundingVolume, m_sphereRadius), self.m_sphereRadius);
  94. }
  95. template<typename TDeserializer>
  96. void deserialize(TDeserializer& deserializer)
  97. {
  98. serializeCommon<TDeserializer, MeshBinaryBoundingVolume&>(deserializer, *this);
  99. }
  100. template<typename TSerializer>
  101. void serialize(TSerializer& serializer) const
  102. {
  103. serializeCommon<TSerializer, const MeshBinaryBoundingVolume&>(serializer, *this);
  104. }
  105. };
  106. /// MeshBinarySubMeshLod class.
  107. class MeshBinarySubMeshLod
  108. {
  109. public:
  110. /// Offset in sizeof(indexType) to the global indices buffer of the LOD this belongs to.
  111. U32 m_firstIndex;
  112. U32 m_indexCount;
  113. U32 m_firstMeshlet;
  114. U32 m_meshletCount;
  115. template<typename TSerializer, typename TClass>
  116. static void serializeCommon(TSerializer& s, TClass self)
  117. {
  118. s.doValue("m_firstIndex", offsetof(MeshBinarySubMeshLod, m_firstIndex), self.m_firstIndex);
  119. s.doValue("m_indexCount", offsetof(MeshBinarySubMeshLod, m_indexCount), self.m_indexCount);
  120. s.doValue("m_firstMeshlet", offsetof(MeshBinarySubMeshLod, m_firstMeshlet), self.m_firstMeshlet);
  121. s.doValue("m_meshletCount", offsetof(MeshBinarySubMeshLod, m_meshletCount), self.m_meshletCount);
  122. }
  123. template<typename TDeserializer>
  124. void deserialize(TDeserializer& deserializer)
  125. {
  126. serializeCommon<TDeserializer, MeshBinarySubMeshLod&>(deserializer, *this);
  127. }
  128. template<typename TSerializer>
  129. void serialize(TSerializer& serializer) const
  130. {
  131. serializeCommon<TSerializer, const MeshBinarySubMeshLod&>(serializer, *this);
  132. }
  133. };
  134. /// The 1st thing that appears in a mesh binary.
  135. class MeshBinaryHeader
  136. {
  137. public:
  138. Array<U8, 8> m_magic;
  139. MeshBinaryFlag m_flags;
  140. Array<MeshBinaryVertexBuffer, U32(VertexAttributeSemantic::kCount)> m_vertexBuffers;
  141. Array<MeshBinaryVertexAttribute, U32(VertexAttributeSemantic::kCount)> m_vertexAttributes;
  142. IndexType m_indexType;
  143. Array<U8, 3> m_padding;
  144. /// The format of the 3 indices that make a primitive.
  145. Format m_meshletPrimitiveFormat;
  146. Array<U32, kMaxLodCount> m_indexCounts;
  147. Array<U32, kMaxLodCount> m_vertexCounts;
  148. Array<U32, kMaxLodCount> m_meshletPrimitiveCounts;
  149. Array<U32, kMaxLodCount> m_meshletCounts;
  150. U32 m_subMeshCount;
  151. U32 m_lodCount;
  152. U32 m_maxPrimitivesPerMeshlet;
  153. U32 m_maxVerticesPerMeshlet;
  154. MeshBinaryBoundingVolume m_boundingVolume;
  155. template<typename TSerializer, typename TClass>
  156. static void serializeCommon(TSerializer& s, TClass self)
  157. {
  158. s.doArray("m_magic", offsetof(MeshBinaryHeader, m_magic), &self.m_magic[0], self.m_magic.getSize());
  159. s.doValue("m_flags", offsetof(MeshBinaryHeader, m_flags), self.m_flags);
  160. s.doArray("m_vertexBuffers", offsetof(MeshBinaryHeader, m_vertexBuffers), &self.m_vertexBuffers[0], self.m_vertexBuffers.getSize());
  161. s.doArray("m_vertexAttributes", offsetof(MeshBinaryHeader, m_vertexAttributes), &self.m_vertexAttributes[0],
  162. self.m_vertexAttributes.getSize());
  163. s.doValue("m_indexType", offsetof(MeshBinaryHeader, m_indexType), self.m_indexType);
  164. s.doArray("m_padding", offsetof(MeshBinaryHeader, m_padding), &self.m_padding[0], self.m_padding.getSize());
  165. s.doValue("m_meshletPrimitiveFormat", offsetof(MeshBinaryHeader, m_meshletPrimitiveFormat), self.m_meshletPrimitiveFormat);
  166. s.doArray("m_indexCounts", offsetof(MeshBinaryHeader, m_indexCounts), &self.m_indexCounts[0], self.m_indexCounts.getSize());
  167. s.doArray("m_vertexCounts", offsetof(MeshBinaryHeader, m_vertexCounts), &self.m_vertexCounts[0], self.m_vertexCounts.getSize());
  168. s.doArray("m_meshletPrimitiveCounts", offsetof(MeshBinaryHeader, m_meshletPrimitiveCounts), &self.m_meshletPrimitiveCounts[0],
  169. self.m_meshletPrimitiveCounts.getSize());
  170. s.doArray("m_meshletCounts", offsetof(MeshBinaryHeader, m_meshletCounts), &self.m_meshletCounts[0], self.m_meshletCounts.getSize());
  171. s.doValue("m_subMeshCount", offsetof(MeshBinaryHeader, m_subMeshCount), self.m_subMeshCount);
  172. s.doValue("m_lodCount", offsetof(MeshBinaryHeader, m_lodCount), self.m_lodCount);
  173. s.doValue("m_maxPrimitivesPerMeshlet", offsetof(MeshBinaryHeader, m_maxPrimitivesPerMeshlet), self.m_maxPrimitivesPerMeshlet);
  174. s.doValue("m_maxVerticesPerMeshlet", offsetof(MeshBinaryHeader, m_maxVerticesPerMeshlet), self.m_maxVerticesPerMeshlet);
  175. s.doValue("m_boundingVolume", offsetof(MeshBinaryHeader, m_boundingVolume), self.m_boundingVolume);
  176. }
  177. template<typename TDeserializer>
  178. void deserialize(TDeserializer& deserializer)
  179. {
  180. serializeCommon<TDeserializer, MeshBinaryHeader&>(deserializer, *this);
  181. }
  182. template<typename TSerializer>
  183. void serialize(TSerializer& serializer) const
  184. {
  185. serializeCommon<TSerializer, const MeshBinaryHeader&>(serializer, *this);
  186. }
  187. };
  188. /// The 2nd thing that appears in a mesh binary.
  189. class MeshBinarySubMesh
  190. {
  191. public:
  192. Array<MeshBinarySubMeshLod, kMaxLodCount> m_lods;
  193. MeshBinaryBoundingVolume m_boundingVolume;
  194. template<typename TSerializer, typename TClass>
  195. static void serializeCommon(TSerializer& s, TClass self)
  196. {
  197. s.doArray("m_lods", offsetof(MeshBinarySubMesh, m_lods), &self.m_lods[0], self.m_lods.getSize());
  198. s.doValue("m_boundingVolume", offsetof(MeshBinarySubMesh, m_boundingVolume), self.m_boundingVolume);
  199. }
  200. template<typename TDeserializer>
  201. void deserialize(TDeserializer& deserializer)
  202. {
  203. serializeCommon<TDeserializer, MeshBinarySubMesh&>(deserializer, *this);
  204. }
  205. template<typename TSerializer>
  206. void serialize(TSerializer& serializer) const
  207. {
  208. serializeCommon<TSerializer, const MeshBinarySubMesh&>(serializer, *this);
  209. }
  210. };
  211. /// The 3rd thing that appears in a mesh binary.
  212. class MeshBinaryMeshlet
  213. {
  214. public:
  215. /// Index of the 1st primitive.
  216. U32 m_firstPrimitive;
  217. U32 m_primitiveCount;
  218. /// Index of the first vertex.
  219. U32 m_firstVertex;
  220. U32 m_vertexCount;
  221. MeshBinaryBoundingVolume m_boundingVolume;
  222. Vec3 m_coneApex;
  223. Vec3 m_coneDirection;
  224. F32 m_coneAngle;
  225. template<typename TSerializer, typename TClass>
  226. static void serializeCommon(TSerializer& s, TClass self)
  227. {
  228. s.doValue("m_firstPrimitive", offsetof(MeshBinaryMeshlet, m_firstPrimitive), self.m_firstPrimitive);
  229. s.doValue("m_primitiveCount", offsetof(MeshBinaryMeshlet, m_primitiveCount), self.m_primitiveCount);
  230. s.doValue("m_firstVertex", offsetof(MeshBinaryMeshlet, m_firstVertex), self.m_firstVertex);
  231. s.doValue("m_vertexCount", offsetof(MeshBinaryMeshlet, m_vertexCount), self.m_vertexCount);
  232. s.doValue("m_boundingVolume", offsetof(MeshBinaryMeshlet, m_boundingVolume), self.m_boundingVolume);
  233. s.doValue("m_coneApex", offsetof(MeshBinaryMeshlet, m_coneApex), self.m_coneApex);
  234. s.doValue("m_coneDirection", offsetof(MeshBinaryMeshlet, m_coneDirection), self.m_coneDirection);
  235. s.doValue("m_coneAngle", offsetof(MeshBinaryMeshlet, m_coneAngle), self.m_coneAngle);
  236. }
  237. template<typename TDeserializer>
  238. void deserialize(TDeserializer& deserializer)
  239. {
  240. serializeCommon<TDeserializer, MeshBinaryMeshlet&>(deserializer, *this);
  241. }
  242. template<typename TSerializer>
  243. void serialize(TSerializer& serializer) const
  244. {
  245. serializeCommon<TSerializer, const MeshBinaryMeshlet&>(serializer, *this);
  246. }
  247. };
  248. /// @}
  249. } // end namespace anki