BsMeshDataEx.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Extensions/BsMeshDataEx.h"
  4. #include "Image/BsPixelUtil.h"
  5. #include "Math/BsVector2.h"
  6. namespace bs
  7. {
  8. template<int Semantic>
  9. struct TVertexDataAccessor
  10. {
  11. static void get(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size) { }
  12. static void set(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size) { }
  13. };
  14. template<>
  15. struct TVertexDataAccessor < (int)VertexLayout::Position >
  16. {
  17. static void get(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  18. { meshData->getPositions((Vector3*)buffer, size); }
  19. static void set(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  20. { meshData->setPositions((Vector3*)buffer, size); }
  21. };
  22. template<>
  23. struct TVertexDataAccessor < (int)VertexLayout::Normal >
  24. {
  25. static void get(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  26. { meshData->getNormals((Vector3*)buffer, size); }
  27. static void set(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  28. { meshData->setNormals((Vector3*)buffer, size); }
  29. };
  30. template<>
  31. struct TVertexDataAccessor < (int)VertexLayout::Tangent >
  32. {
  33. static void get(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  34. { meshData->getTangents((Vector4*)buffer, size); }
  35. static void set(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  36. { meshData->setTangents((Vector4*)buffer, size); }
  37. };
  38. template<>
  39. struct TVertexDataAccessor < (int)VertexLayout::Color >
  40. {
  41. static void get(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  42. { meshData->getColors((Color*)buffer, size); }
  43. static void set(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  44. { meshData->setColors((Color*)buffer, size); }
  45. };
  46. template<>
  47. struct TVertexDataAccessor < (int)VertexLayout::UV0 >
  48. {
  49. static void get(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  50. { meshData->getUV0((Vector2*)buffer, size); }
  51. static void set(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  52. { meshData->setUV0((Vector2*)buffer, size); }
  53. };
  54. template<>
  55. struct TVertexDataAccessor < (int)VertexLayout::UV1 >
  56. {
  57. static void get(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  58. { meshData->getUV1((Vector2*)buffer, size); }
  59. static void set(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  60. { meshData->setUV1((Vector2*)buffer, size); }
  61. };
  62. template<>
  63. struct TVertexDataAccessor < (int)VertexLayout::BoneWeights >
  64. {
  65. static void get(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  66. { meshData->getBoneWeights((BoneWeight*)buffer, size); }
  67. static void set(const SPtr<RendererMeshData>& meshData, UINT8* buffer, UINT32 size)
  68. { meshData->setBoneWeights((BoneWeight*)buffer, size); }
  69. };
  70. template<int Semantic, class TNative>
  71. Vector<TNative> getVertexDataArray(const SPtr<RendererMeshData>& meshData)
  72. {
  73. UINT32 numElements = meshData->getData()->getNumVertices();
  74. Vector<TNative> output(numElements);
  75. TVertexDataAccessor<Semantic>::get(meshData, (UINT8*)output.data(), numElements * sizeof(TNative));
  76. return output;
  77. }
  78. template<int Semantic, class TNative>
  79. void setVertexDataArray(const SPtr<RendererMeshData>& meshData, const Vector<TNative>& input)
  80. {
  81. UINT32 numElements = meshData->getData()->getNumVertices();
  82. TVertexDataAccessor<Semantic>::set(meshData, (UINT8*)input.data(), numElements * sizeof(TNative));
  83. }
  84. SPtr<RendererMeshData> MeshDataEx::create(UINT32 numVertices, UINT32 numIndices, VertexLayout layout, IndexType indexType)
  85. {
  86. return RendererMeshData::create(numVertices, numIndices, layout, indexType);
  87. }
  88. Vector<Vector3> MeshDataEx::getPositions(const SPtr<RendererMeshData>& thisPtr)
  89. {
  90. return getVertexDataArray<(int)VertexLayout::Position, Vector3>(thisPtr);
  91. }
  92. void MeshDataEx::setPositions(const SPtr<RendererMeshData>& thisPtr, const Vector<Vector3>& value)
  93. {
  94. setVertexDataArray<(int)VertexLayout::Position>(thisPtr, value);
  95. }
  96. Vector<Vector3> MeshDataEx::getNormals(const SPtr<RendererMeshData>& thisPtr)
  97. {
  98. return getVertexDataArray<(int)VertexLayout::Normal, Vector3>(thisPtr);
  99. }
  100. void MeshDataEx::setNormals(const SPtr<RendererMeshData>& thisPtr, const Vector<Vector3>& value)
  101. {
  102. setVertexDataArray<(int)VertexLayout::Normal>(thisPtr, value);
  103. }
  104. Vector<Vector4> MeshDataEx::getTangents(const SPtr<RendererMeshData>& thisPtr)
  105. {
  106. return getVertexDataArray<(int)VertexLayout::Tangent, Vector4>(thisPtr);
  107. }
  108. void MeshDataEx::setTangents(const SPtr<RendererMeshData>& thisPtr, const Vector<Vector4>& value)
  109. {
  110. setVertexDataArray<(int)VertexLayout::Tangent>(thisPtr, value);
  111. }
  112. Vector<Color> MeshDataEx::getColors(const SPtr<RendererMeshData>& thisPtr)
  113. {
  114. return getVertexDataArray<(int)VertexLayout::Color, Color>(thisPtr);
  115. }
  116. void MeshDataEx::setColors(const SPtr<RendererMeshData>& thisPtr, const Vector<Color>& value)
  117. {
  118. setVertexDataArray<(int)VertexLayout::Color>(thisPtr, value);
  119. }
  120. Vector<Vector2> MeshDataEx::getUV0(const SPtr<RendererMeshData>& thisPtr)
  121. {
  122. return getVertexDataArray<(int)VertexLayout::UV0, Vector2>(thisPtr);
  123. }
  124. void MeshDataEx::setUV0(const SPtr<RendererMeshData>& thisPtr, const Vector<Vector2>& value)
  125. {
  126. setVertexDataArray<(int)VertexLayout::UV0>(thisPtr, value);
  127. }
  128. Vector<Vector2> MeshDataEx::getUV1(const SPtr<RendererMeshData>& thisPtr)
  129. {
  130. return getVertexDataArray<(int)VertexLayout::UV1, Vector2>(thisPtr);
  131. }
  132. void MeshDataEx::setUV1(const SPtr<RendererMeshData>& thisPtr, const Vector<Vector2>& value)
  133. {
  134. setVertexDataArray<(int)VertexLayout::UV1>(thisPtr, value);
  135. }
  136. Vector<BoneWeight> MeshDataEx::getBoneWeights(const SPtr<RendererMeshData>& thisPtr)
  137. {
  138. return getVertexDataArray<(int)VertexLayout::BoneWeights, BoneWeight>(thisPtr);
  139. }
  140. void MeshDataEx::setBoneWeights(const SPtr<RendererMeshData>& thisPtr, const Vector<BoneWeight>& value)
  141. {
  142. setVertexDataArray<(int)VertexLayout::BoneWeights>(thisPtr, value);
  143. }
  144. Vector<UINT32> MeshDataEx::getIndices(const SPtr<RendererMeshData>& thisPtr)
  145. {
  146. UINT32 numElements = thisPtr->getData()->getNumIndices();
  147. Vector<UINT32> output(numElements);
  148. thisPtr->getIndices(output.data(), numElements * sizeof(UINT32));
  149. return output;
  150. }
  151. void MeshDataEx::setIndices(const SPtr<RendererMeshData>& thisPtr, const Vector<UINT32>& value)
  152. {
  153. UINT32 numElements = thisPtr->getData()->getNumIndices();
  154. thisPtr->setIndices((UINT32*)value.data(), numElements * sizeof(UINT32));
  155. }
  156. int MeshDataEx::getVertexCount(const SPtr<RendererMeshData>& thisPtr)
  157. {
  158. return (int)thisPtr->getData()->getNumVertices();
  159. }
  160. int MeshDataEx::getIndexCount(const SPtr<RendererMeshData>& thisPtr)
  161. {
  162. return (int)thisPtr->getData()->getNumIndices();
  163. }
  164. }