ge_spm_buffer.hpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #ifndef HEADER_GE_SPM_BUFFER_HPP
  2. #define HEADER_GE_SPM_BUFFER_HPP
  3. #include <array>
  4. #include <cstddef>
  5. #include <vector>
  6. #include "IMeshBuffer.h"
  7. #include "ge_vma.hpp"
  8. #include "vulkan_wrapper.h"
  9. namespace GE
  10. {
  11. class GESPMBuffer : public irr::scene::IMeshBuffer
  12. {
  13. protected:
  14. irr::video::SMaterial m_material;
  15. std::vector<irr::video::S3DVertexSkinnedMesh> m_vertices;
  16. std::vector<irr::u16> m_indices;
  17. private:
  18. irr::core::aabbox3d<irr::f32> m_bounding_box;
  19. size_t m_vbo_offset;
  20. size_t m_ibo_offset;
  21. size_t m_skinning_vbo_offset;
  22. VkBuffer m_buffer;
  23. VmaAllocation m_memory;
  24. bool m_has_skinning;
  25. public:
  26. // ------------------------------------------------------------------------
  27. GESPMBuffer()
  28. {
  29. m_vbo_offset = 0;
  30. m_ibo_offset = 0;
  31. m_skinning_vbo_offset = 0;
  32. m_buffer = VK_NULL_HANDLE;
  33. m_memory = VK_NULL_HANDLE;
  34. m_has_skinning = false;
  35. }
  36. // ------------------------------------------------------------------------
  37. ~GESPMBuffer() { destroyVertexIndexBuffer(); }
  38. // ------------------------------------------------------------------------
  39. virtual const irr::video::SMaterial& getMaterial() const
  40. { return m_material; }
  41. // ------------------------------------------------------------------------
  42. virtual irr::video::SMaterial& getMaterial() { return m_material; }
  43. // ------------------------------------------------------------------------
  44. virtual const void* getVertices() const { return m_vertices.data(); }
  45. // ------------------------------------------------------------------------
  46. virtual void* getVertices() { return m_vertices.data(); }
  47. // ------------------------------------------------------------------------
  48. virtual irr::u32 getVertexCount() const { return m_vertices.size(); }
  49. // ------------------------------------------------------------------------
  50. virtual irr::video::E_INDEX_TYPE getIndexType() const
  51. { return irr::video::EIT_16BIT; }
  52. // ------------------------------------------------------------------------
  53. virtual const irr::u16* getIndices() const { return m_indices.data(); }
  54. // ------------------------------------------------------------------------
  55. virtual irr::u16* getIndices() { return m_indices.data(); }
  56. // ------------------------------------------------------------------------
  57. virtual irr::u32 getIndexCount() const { return m_indices.size(); }
  58. // ------------------------------------------------------------------------
  59. virtual const irr::core::aabbox3d<irr::f32>& getBoundingBox() const
  60. { return m_bounding_box; }
  61. // ------------------------------------------------------------------------
  62. virtual void setBoundingBox(const irr::core::aabbox3df& box)
  63. { m_bounding_box = box; }
  64. // ------------------------------------------------------------------------
  65. virtual void recalculateBoundingBox()
  66. {
  67. if (m_vertices.empty())
  68. m_bounding_box.reset(0, 0, 0);
  69. else
  70. {
  71. m_bounding_box.reset(m_vertices[0].m_position);
  72. for (irr::u32 i = 1; i < m_vertices.size(); i++)
  73. m_bounding_box.addInternalPoint(m_vertices[i].m_position);
  74. }
  75. }
  76. // ------------------------------------------------------------------------
  77. virtual irr::video::E_VERTEX_TYPE getVertexType() const
  78. { return irr::video::EVT_SKINNED_MESH; }
  79. // ------------------------------------------------------------------------
  80. virtual const irr::core::vector3df& getPosition(irr::u32 i) const
  81. { return m_vertices[i].m_position; }
  82. // ------------------------------------------------------------------------
  83. virtual irr::core::vector3df& getPosition(irr::u32 i)
  84. { return m_vertices[i].m_position; }
  85. // ------------------------------------------------------------------------
  86. virtual const irr::core::vector3df& getNormal(irr::u32 i) const
  87. {
  88. static irr::core::vector3df unused;
  89. return unused;
  90. }
  91. // ------------------------------------------------------------------------
  92. virtual irr::core::vector3df& getNormal(irr::u32 i)
  93. {
  94. static irr::core::vector3df unused;
  95. return unused;
  96. }
  97. // ------------------------------------------------------------------------
  98. virtual void setNormal(irr::u32 i, const irr::core::vector3df& normal);
  99. // ------------------------------------------------------------------------
  100. virtual const irr::core::vector2df& getTCoords(irr::u32 i) const
  101. {
  102. static irr::core::vector2df unused;
  103. return unused;
  104. }
  105. // ------------------------------------------------------------------------
  106. virtual irr::core::vector2df& getTCoords(irr::u32 i)
  107. {
  108. static irr::core::vector2df unused;
  109. return unused;
  110. }
  111. // ------------------------------------------------------------------------
  112. virtual void setTCoords(irr::u32 i, const irr::core::vector2df& tcoords);
  113. // ------------------------------------------------------------------------
  114. virtual irr::scene::E_PRIMITIVE_TYPE getPrimitiveType() const
  115. { return irr::scene::EPT_TRIANGLES; }
  116. // ------------------------------------------------------------------------
  117. virtual void append(const void* const vertices, irr::u32 num_vertices,
  118. const irr::u16* const indices, irr::u32 num_indices)
  119. {
  120. if (vertices == getVertices())
  121. return;
  122. irr::u32 vertex_count = getVertexCount();
  123. m_vertices.reserve(vertex_count + num_vertices);
  124. for (irr::u32 i = 0; i < num_vertices; i++)
  125. {
  126. m_vertices.push_back(reinterpret_cast<
  127. const irr::video::S3DVertexSkinnedMesh*>(vertices)[i]);
  128. m_bounding_box.addInternalPoint(reinterpret_cast<
  129. const irr::video::S3DVertexSkinnedMesh*>(vertices)[i].m_position);
  130. }
  131. m_indices.reserve(getIndexCount() + num_indices);
  132. for (irr::u32 i = 0; i < num_indices; i++)
  133. m_indices.push_back(indices[i] + vertex_count);
  134. }
  135. // ------------------------------------------------------------------------
  136. virtual void append(const IMeshBuffer* const other) {}
  137. // ------------------------------------------------------------------------
  138. virtual irr::scene::E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const
  139. { return irr::scene::EHM_NEVER; }
  140. // ------------------------------------------------------------------------
  141. virtual irr::scene::E_HARDWARE_MAPPING getHardwareMappingHint_Index() const
  142. { return irr::scene::EHM_NEVER; }
  143. // ------------------------------------------------------------------------
  144. virtual void setHardwareMappingHint(irr::scene::E_HARDWARE_MAPPING NewMappingHint,
  145. irr::scene::E_BUFFER_TYPE Buffer = irr::scene::EBT_VERTEX_AND_INDEX)
  146. {}
  147. // ------------------------------------------------------------------------
  148. virtual void setDirty(irr::scene::E_BUFFER_TYPE Buffer = irr::scene::EBT_VERTEX_AND_INDEX)
  149. {}
  150. // ------------------------------------------------------------------------
  151. virtual irr::u32 getChangedID_Vertex() const { return 0; }
  152. // ------------------------------------------------------------------------
  153. virtual irr::u32 getChangedID_Index() const { return 0; }
  154. // ------------------------------------------------------------------------
  155. void setVBOOffset(size_t offset) { m_vbo_offset = offset; }
  156. // ------------------------------------------------------------------------
  157. virtual size_t getVBOOffset() const { return m_vbo_offset; }
  158. // ------------------------------------------------------------------------
  159. void setIBOOffset(size_t offset) { m_ibo_offset = offset; }
  160. // ------------------------------------------------------------------------
  161. virtual size_t getIBOOffset() const { return m_ibo_offset; }
  162. // ------------------------------------------------------------------------
  163. bool hasSkinning() const { return m_has_skinning; }
  164. // ------------------------------------------------------------------------
  165. void setHasSkinning(bool val) { m_has_skinning = val; }
  166. // ------------------------------------------------------------------------
  167. virtual void bindVertexIndexBuffer(VkCommandBuffer cmd)
  168. {
  169. VkBuffer buffer = getVkBuffer();
  170. std::array<VkBuffer, 2> vertex_buffer =
  171. {{
  172. buffer,
  173. buffer
  174. }};
  175. std::array<VkDeviceSize, 2> offsets =
  176. {{
  177. 0,
  178. m_skinning_vbo_offset
  179. }};
  180. vkCmdBindVertexBuffers(cmd, 0, vertex_buffer.size(),
  181. vertex_buffer.data(), offsets.data());
  182. vkCmdBindIndexBuffer(cmd, buffer, getIBOOffset(),
  183. VK_INDEX_TYPE_UINT16);
  184. }
  185. // ------------------------------------------------------------------------
  186. virtual void createVertexIndexBuffer();
  187. // ------------------------------------------------------------------------
  188. virtual void destroyVertexIndexBuffer();
  189. // ------------------------------------------------------------------------
  190. std::vector<irr::video::S3DVertexSkinnedMesh>& getVerticesVector()
  191. { return m_vertices; }
  192. // ------------------------------------------------------------------------
  193. std::vector<irr::u16>& getIndicesVector() { return m_indices; }
  194. // ------------------------------------------------------------------------
  195. virtual VkBuffer getVkBuffer() const { return m_buffer; }
  196. };
  197. } // end namespace GE
  198. #endif