MeshBinary.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // Copyright (C) 2009-2021, 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. namespace anki {
  10. /// @addtogroup resource
  11. /// @{
  12. static constexpr const char* MESH_MAGIC = "ANKIMES5";
  13. constexpr U32 MESH_BINARY_BUFFER_ALIGNMENT = 16;
  14. enum class MeshBinaryFlag : U32
  15. {
  16. NONE = 0,
  17. QUAD = 1 << 0,
  18. CONVEX = 1 << 1,
  19. ALL = QUAD | CONVEX,
  20. };
  21. ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(MeshBinaryFlag)
  22. /// Vertex buffer info. The size of the buffer is m_vertexStride*MeshBinaryHeader::m_totalVertexCount aligned to
  23. /// MESH_BINARY_BUFFER_ALIGNMENT.
  24. class MeshBinaryVertexBuffer
  25. {
  26. public:
  27. /// The size of the vertex.
  28. U32 m_vertexStride;
  29. template<typename TSerializer, typename TClass>
  30. static void serializeCommon(TSerializer& s, TClass self)
  31. {
  32. s.doValue("m_vertexStride", offsetof(MeshBinaryVertexBuffer, m_vertexStride), self.m_vertexStride);
  33. }
  34. template<typename TDeserializer>
  35. void deserialize(TDeserializer& deserializer)
  36. {
  37. serializeCommon<TDeserializer, MeshBinaryVertexBuffer&>(deserializer, *this);
  38. }
  39. template<typename TSerializer>
  40. void serialize(TSerializer& serializer) const
  41. {
  42. serializeCommon<TSerializer, const MeshBinaryVertexBuffer&>(serializer, *this);
  43. }
  44. };
  45. /// Vertex attribute.
  46. class MeshBinaryVertexAttribute
  47. {
  48. public:
  49. U32 m_bufferBinding;
  50. /// If the format is NONE then the attribute is not present.
  51. Format m_format;
  52. U32 m_relativeOffset;
  53. F32 m_scale;
  54. template<typename TSerializer, typename TClass>
  55. static void serializeCommon(TSerializer& s, TClass self)
  56. {
  57. s.doValue("m_bufferBinding", offsetof(MeshBinaryVertexAttribute, m_bufferBinding), self.m_bufferBinding);
  58. s.doValue("m_format", offsetof(MeshBinaryVertexAttribute, m_format), self.m_format);
  59. s.doValue("m_relativeOffset", offsetof(MeshBinaryVertexAttribute, m_relativeOffset), self.m_relativeOffset);
  60. s.doValue("m_scale", offsetof(MeshBinaryVertexAttribute, m_scale), self.m_scale);
  61. }
  62. template<typename TDeserializer>
  63. void deserialize(TDeserializer& deserializer)
  64. {
  65. serializeCommon<TDeserializer, MeshBinaryVertexAttribute&>(deserializer, *this);
  66. }
  67. template<typename TSerializer>
  68. void serialize(TSerializer& serializer) const
  69. {
  70. serializeCommon<TSerializer, const MeshBinaryVertexAttribute&>(serializer, *this);
  71. }
  72. };
  73. /// MeshBinarySubMesh class.
  74. class MeshBinarySubMesh
  75. {
  76. public:
  77. U32 m_firstIndex;
  78. U32 m_indexCount;
  79. /// Bounding box min.
  80. Vec3 m_aabbMin;
  81. /// Bounding box max.
  82. Vec3 m_aabbMax;
  83. template<typename TSerializer, typename TClass>
  84. static void serializeCommon(TSerializer& s, TClass self)
  85. {
  86. s.doValue("m_firstIndex", offsetof(MeshBinarySubMesh, m_firstIndex), self.m_firstIndex);
  87. s.doValue("m_indexCount", offsetof(MeshBinarySubMesh, m_indexCount), self.m_indexCount);
  88. s.doValue("m_aabbMin", offsetof(MeshBinarySubMesh, m_aabbMin), self.m_aabbMin);
  89. s.doValue("m_aabbMax", offsetof(MeshBinarySubMesh, m_aabbMax), self.m_aabbMax);
  90. }
  91. template<typename TDeserializer>
  92. void deserialize(TDeserializer& deserializer)
  93. {
  94. serializeCommon<TDeserializer, MeshBinarySubMesh&>(deserializer, *this);
  95. }
  96. template<typename TSerializer>
  97. void serialize(TSerializer& serializer) const
  98. {
  99. serializeCommon<TSerializer, const MeshBinarySubMesh&>(serializer, *this);
  100. }
  101. };
  102. /// The 1st things that appears in a mesh binary. @note The index and vertex buffers are aligned to
  103. /// MESH_BINARY_BUFFER_ALIGNMENT bytes.
  104. class MeshBinaryHeader
  105. {
  106. public:
  107. Array<U8, 8> m_magic;
  108. MeshBinaryFlag m_flags;
  109. Array<MeshBinaryVertexBuffer, U32(VertexAttributeId::COUNT)> m_vertexBuffers;
  110. U32 m_vertexBufferCount;
  111. Array<MeshBinaryVertexAttribute, U32(VertexAttributeId::COUNT)> m_vertexAttributes;
  112. IndexType m_indexType;
  113. Array<U8, 3> m_padding;
  114. U32 m_totalIndexCount;
  115. U32 m_totalVertexCount;
  116. U32 m_subMeshCount;
  117. /// Bounding box min.
  118. Vec3 m_aabbMin;
  119. /// Bounding box max.
  120. Vec3 m_aabbMax;
  121. template<typename TSerializer, typename TClass>
  122. static void serializeCommon(TSerializer& s, TClass self)
  123. {
  124. s.doArray("m_magic", offsetof(MeshBinaryHeader, m_magic), &self.m_magic[0], self.m_magic.getSize());
  125. s.doValue("m_flags", offsetof(MeshBinaryHeader, m_flags), self.m_flags);
  126. s.doArray("m_vertexBuffers", offsetof(MeshBinaryHeader, m_vertexBuffers), &self.m_vertexBuffers[0],
  127. self.m_vertexBuffers.getSize());
  128. s.doValue("m_vertexBufferCount", offsetof(MeshBinaryHeader, m_vertexBufferCount), self.m_vertexBufferCount);
  129. s.doArray("m_vertexAttributes", offsetof(MeshBinaryHeader, m_vertexAttributes), &self.m_vertexAttributes[0],
  130. self.m_vertexAttributes.getSize());
  131. s.doValue("m_indexType", offsetof(MeshBinaryHeader, m_indexType), self.m_indexType);
  132. s.doArray("m_padding", offsetof(MeshBinaryHeader, m_padding), &self.m_padding[0], self.m_padding.getSize());
  133. s.doValue("m_totalIndexCount", offsetof(MeshBinaryHeader, m_totalIndexCount), self.m_totalIndexCount);
  134. s.doValue("m_totalVertexCount", offsetof(MeshBinaryHeader, m_totalVertexCount), self.m_totalVertexCount);
  135. s.doValue("m_subMeshCount", offsetof(MeshBinaryHeader, m_subMeshCount), self.m_subMeshCount);
  136. s.doValue("m_aabbMin", offsetof(MeshBinaryHeader, m_aabbMin), self.m_aabbMin);
  137. s.doValue("m_aabbMax", offsetof(MeshBinaryHeader, m_aabbMax), self.m_aabbMax);
  138. }
  139. template<typename TDeserializer>
  140. void deserialize(TDeserializer& deserializer)
  141. {
  142. serializeCommon<TDeserializer, MeshBinaryHeader&>(deserializer, *this);
  143. }
  144. template<typename TSerializer>
  145. void serialize(TSerializer& serializer) const
  146. {
  147. serializeCommon<TSerializer, const MeshBinaryHeader&>(serializer, *this);
  148. }
  149. };
  150. /// @}
  151. } // end namespace anki