2
0

BsRendererMeshData.cpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. #include "BsRendererMeshData.h"
  2. #include "BsVertexDataDesc.h"
  3. #include "BsVector2.h"
  4. #include "BsVector3.h"
  5. #include "BsVector4.h"
  6. #include "BsColor.h"
  7. #include "BsPixelUtil.h"
  8. #include "BsRendererManager.h"
  9. #include "BsCoreRenderer.h"
  10. namespace BansheeEngine
  11. {
  12. RendererMeshData::RendererMeshData(UINT32 numVertices, UINT32 numIndices, VertexLayout layout, IndexType indexType)
  13. {
  14. VertexDataDescPtr vertexDesc = vertexLayoutVertexDesc(layout);
  15. mMeshData = bs_shared_ptr_new<MeshData>(numVertices, numIndices, vertexDesc, indexType);
  16. }
  17. RendererMeshData::RendererMeshData(const MeshDataPtr& meshData)
  18. :mMeshData(meshData)
  19. {
  20. }
  21. void RendererMeshData::getPositions(Vector3* buffer, UINT32 size)
  22. {
  23. if (!mMeshData->getVertexDesc()->hasElement(VES_POSITION))
  24. return;
  25. UINT32 numElements = mMeshData->getNumVertices();
  26. assert(numElements * sizeof(Vector3) == size);
  27. mMeshData->getVertexData(VES_POSITION, (UINT8*)buffer, size);
  28. }
  29. void RendererMeshData::setPositions(Vector3* buffer, UINT32 size)
  30. {
  31. if (!mMeshData->getVertexDesc()->hasElement(VES_POSITION))
  32. return;
  33. UINT32 numElements = mMeshData->getNumVertices();
  34. assert(numElements * sizeof(Vector3) == size);
  35. mMeshData->setVertexData(VES_POSITION, (UINT8*)buffer, size);
  36. }
  37. void RendererMeshData::getNormals(Vector3* buffer, UINT32 size)
  38. {
  39. if (!mMeshData->getVertexDesc()->hasElement(VES_NORMAL))
  40. return;
  41. UINT32 numElements = mMeshData->getNumVertices();
  42. assert(numElements * sizeof(Vector3) == size);
  43. mMeshData->getVertexData(VES_NORMAL, (UINT8*)buffer, size);
  44. }
  45. void RendererMeshData::setNormals(Vector3* buffer, UINT32 size)
  46. {
  47. if (!mMeshData->getVertexDesc()->hasElement(VES_NORMAL))
  48. return;
  49. UINT32 numElements = mMeshData->getNumVertices();
  50. assert(numElements * sizeof(Vector3) == size);
  51. mMeshData->setVertexData(VES_NORMAL, (UINT8*)buffer, size);
  52. }
  53. void RendererMeshData::getTangents(Vector4* buffer, UINT32 size)
  54. {
  55. if (!mMeshData->getVertexDesc()->hasElement(VES_TANGENT))
  56. return;
  57. UINT32 numElements = mMeshData->getNumVertices();
  58. assert(numElements * sizeof(Vector4) == size);
  59. mMeshData->getVertexData(VES_TANGENT, (UINT8*)buffer, size);
  60. }
  61. void RendererMeshData::setTangents(Vector4* buffer, UINT32 size)
  62. {
  63. if (!mMeshData->getVertexDesc()->hasElement(VES_TANGENT))
  64. return;
  65. UINT32 numElements = mMeshData->getNumVertices();
  66. assert(numElements * sizeof(Vector4) == size);
  67. mMeshData->setVertexData(VES_TANGENT, (UINT8*)buffer, size);
  68. }
  69. void RendererMeshData::getColors(Color* buffer, UINT32 size)
  70. {
  71. if (!mMeshData->getVertexDesc()->hasElement(VES_COLOR))
  72. return;
  73. UINT32 numElements = mMeshData->getNumVertices();
  74. assert(numElements * sizeof(Vector4) == size);
  75. UINT8* colorSrc = mMeshData->getElementData(VES_COLOR);
  76. UINT32 stride = mMeshData->getVertexDesc()->getVertexStride(0);
  77. Color* colorDst = buffer;
  78. for (UINT32 i = 0; i < numElements; i++)
  79. {
  80. PixelUtil::unpackColor(colorDst, PF_R8G8B8A8, (void*)colorSrc);
  81. colorSrc += stride;
  82. colorDst++;
  83. }
  84. }
  85. void RendererMeshData::setColors(Color* buffer, UINT32 size)
  86. {
  87. if (!mMeshData->getVertexDesc()->hasElement(VES_COLOR))
  88. return;
  89. UINT32 numElements = mMeshData->getNumVertices();
  90. assert(numElements * sizeof(Vector4) == size);
  91. UINT8* colorDst = mMeshData->getElementData(VES_COLOR);
  92. UINT32 stride = mMeshData->getVertexDesc()->getVertexStride(0);
  93. Color* colorSrc = buffer;
  94. for (UINT32 i = 0; i < numElements; i++)
  95. {
  96. PixelUtil::packColor(*colorSrc, PF_R8G8B8A8, (void*)colorDst);
  97. colorSrc++;
  98. colorDst += stride;
  99. }
  100. }
  101. void RendererMeshData::setColors(UINT32* buffer, UINT32 size)
  102. {
  103. if (!mMeshData->getVertexDesc()->hasElement(VES_COLOR))
  104. return;
  105. UINT32 numElements = mMeshData->getNumVertices();
  106. assert(numElements * sizeof(UINT32) == size);
  107. UINT8* colorDst = mMeshData->getElementData(VES_COLOR);
  108. memcpy(colorDst, buffer, size);
  109. }
  110. void RendererMeshData::getUV0(Vector2* buffer, UINT32 size)
  111. {
  112. if (!mMeshData->getVertexDesc()->hasElement(VES_TEXCOORD, 0))
  113. return;
  114. UINT32 numElements = mMeshData->getNumVertices();
  115. assert(numElements * sizeof(Vector2) == size);
  116. mMeshData->getVertexData(VES_TEXCOORD, (UINT8*)buffer, size, 0);
  117. }
  118. void RendererMeshData::setUV0(Vector2* buffer, UINT32 size)
  119. {
  120. if (!mMeshData->getVertexDesc()->hasElement(VES_TEXCOORD, 0))
  121. return;
  122. UINT32 numElements = mMeshData->getNumVertices();
  123. assert(numElements * sizeof(Vector2) == size);
  124. mMeshData->setVertexData(VES_TEXCOORD, (UINT8*)buffer, size, 0);
  125. }
  126. void RendererMeshData::getUV1(Vector2* buffer, UINT32 size)
  127. {
  128. if (!mMeshData->getVertexDesc()->hasElement(VES_TEXCOORD, 1))
  129. return;
  130. UINT32 numElements = mMeshData->getNumVertices();
  131. assert(numElements * sizeof(Vector2) == size);
  132. mMeshData->getVertexData(VES_TEXCOORD, (UINT8*)buffer, size, 1);
  133. }
  134. void RendererMeshData::setUV1(Vector2* buffer, UINT32 size)
  135. {
  136. if (!mMeshData->getVertexDesc()->hasElement(VES_TEXCOORD, 1))
  137. return;
  138. UINT32 numElements = mMeshData->getNumVertices();
  139. assert(numElements * sizeof(Vector2) == size);
  140. mMeshData->setVertexData(VES_TEXCOORD, (UINT8*)buffer, size, 1);
  141. }
  142. void RendererMeshData::getBoneWeights(BoneWeight* buffer, UINT32 size)
  143. {
  144. VertexDataDescPtr vertexDesc = mMeshData->getVertexDesc();
  145. if (!vertexDesc->hasElement(VES_BLEND_WEIGHTS) ||
  146. !vertexDesc->hasElement(VES_BLEND_INDICES))
  147. return;
  148. UINT32 numElements = mMeshData->getNumVertices();
  149. assert(numElements * sizeof(BoneWeight) == size);
  150. UINT8* weightPtr = mMeshData->getElementData(VES_BLEND_WEIGHTS);
  151. UINT8* indexPtr = mMeshData->getElementData(VES_BLEND_INDICES);
  152. UINT32 stride = vertexDesc->getVertexStride(0);
  153. BoneWeight* weightDst = buffer;
  154. for (UINT32 i = 0; i < numElements; i++)
  155. {
  156. int* indices = (int*)indexPtr;
  157. float* weights = (float*)weightPtr;
  158. weightDst->index0 = indices[0];
  159. weightDst->index1 = indices[1];
  160. weightDst->index2 = indices[2];
  161. weightDst->index3 = indices[3];
  162. weightDst->weight0 = weights[0];
  163. weightDst->weight1 = weights[1];
  164. weightDst->weight2 = weights[2];
  165. weightDst->weight3 = weights[3];
  166. weightDst++;
  167. indexPtr += stride;
  168. weightPtr += stride;
  169. }
  170. }
  171. void RendererMeshData::setBoneWeights(BoneWeight* buffer, UINT32 size)
  172. {
  173. VertexDataDescPtr vertexDesc = mMeshData->getVertexDesc();
  174. if (!vertexDesc->hasElement(VES_BLEND_WEIGHTS) ||
  175. !vertexDesc->hasElement(VES_BLEND_INDICES))
  176. return;
  177. UINT32 numElements = mMeshData->getNumVertices();
  178. assert(numElements * sizeof(BoneWeight) == size);
  179. UINT8* weightPtr = mMeshData->getElementData(VES_BLEND_WEIGHTS);
  180. UINT8* indexPtr = mMeshData->getElementData(VES_BLEND_INDICES);
  181. UINT32 stride = vertexDesc->getVertexStride(0);
  182. BoneWeight* weightSrc = buffer;
  183. for (UINT32 i = 0; i < numElements; i++)
  184. {
  185. int* indices = (int*)indexPtr;
  186. float* weights = (float*)weightPtr;
  187. indices[0] = weightSrc->index0;
  188. indices[1] = weightSrc->index1;
  189. indices[2] = weightSrc->index2;
  190. indices[3] = weightSrc->index3;
  191. weights[0] = weightSrc->weight0;
  192. weights[1] = weightSrc->weight1;
  193. weights[2] = weightSrc->weight2;
  194. weights[3] = weightSrc->weight3;
  195. weightSrc++;
  196. indexPtr += stride;
  197. weightPtr += stride;
  198. }
  199. }
  200. void RendererMeshData::getIndices(UINT32* buffer, UINT32 size)
  201. {
  202. UINT32 indexSize = mMeshData->getIndexElementSize();
  203. UINT32 numIndices = mMeshData->getNumIndices();
  204. assert(numIndices * indexSize == size);
  205. if (mMeshData->getIndexType() == IT_16BIT)
  206. {
  207. UINT16* src = mMeshData->getIndices16();
  208. UINT32* dest = buffer;
  209. for (UINT32 i = 0; i < numIndices; i++)
  210. {
  211. *dest = *src;
  212. src++;
  213. dest++;
  214. }
  215. }
  216. else
  217. {
  218. memcpy(buffer, mMeshData->getIndices32(), size);
  219. }
  220. }
  221. void RendererMeshData::setIndices(UINT32* buffer, UINT32 size)
  222. {
  223. UINT32 indexSize = mMeshData->getIndexElementSize();
  224. UINT32 numIndices = mMeshData->getNumIndices();
  225. assert(numIndices * indexSize == size);
  226. if (mMeshData->getIndexType() == IT_16BIT)
  227. {
  228. UINT16* dest = mMeshData->getIndices16();
  229. UINT32* src = buffer;
  230. for (UINT32 i = 0; i < numIndices; i++)
  231. {
  232. *dest = *src;
  233. src++;
  234. dest++;
  235. }
  236. }
  237. else
  238. {
  239. memcpy(mMeshData->getIndices32(), buffer, size);
  240. }
  241. }
  242. RendererMeshDataPtr RendererMeshData::create(UINT32 numVertices, UINT32 numIndices, VertexLayout layout, IndexType indexType)
  243. {
  244. return RendererManager::instance().getActive()->_createMeshData(numVertices, numIndices, layout, indexType);
  245. }
  246. RendererMeshDataPtr RendererMeshData::create(const MeshDataPtr& meshData)
  247. {
  248. return RendererManager::instance().getActive()->_createMeshData(meshData);
  249. }
  250. VertexDataDescPtr RendererMeshData::vertexLayoutVertexDesc(VertexLayout type)
  251. {
  252. VertexDataDescPtr vertexDesc = VertexDataDesc::create();
  253. INT32 intType = (INT32)type;
  254. if (intType == 0)
  255. type = VertexLayout::Position;
  256. if ((intType & (INT32)VertexLayout::Position) != 0)
  257. vertexDesc->addVertElem(VET_FLOAT3, VES_POSITION);
  258. if ((intType & (INT32)VertexLayout::Normal) != 0)
  259. vertexDesc->addVertElem(VET_FLOAT3, VES_NORMAL);
  260. if ((intType & (INT32)VertexLayout::Tangent) != 0)
  261. vertexDesc->addVertElem(VET_FLOAT4, VES_TANGENT);
  262. if ((intType & (INT32)VertexLayout::UV0) != 0)
  263. vertexDesc->addVertElem(VET_FLOAT2, VES_TEXCOORD, 0);
  264. if ((intType & (INT32)VertexLayout::UV1) != 0)
  265. vertexDesc->addVertElem(VET_FLOAT2, VES_TEXCOORD, 1);
  266. if ((intType & (INT32)VertexLayout::Color) != 0)
  267. vertexDesc->addVertElem(VET_FLOAT4, VES_COLOR);
  268. if ((intType & (INT32)VertexLayout::BoneWeights) != 0)
  269. {
  270. vertexDesc->addVertElem(VET_UBYTE4, VES_BLEND_INDICES);
  271. vertexDesc->addVertElem(VET_FLOAT4, VES_BLEND_WEIGHTS);
  272. }
  273. return vertexDesc;
  274. }
  275. }