MeshBinary.h 5.6 KB

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