DX12BLASModel.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. #include "DX12BLASModel.h"
  2. #include "DX12CommandQueue.h"
  3. #include "Model3D.h"
  4. Framework::DX12BLASModel::DX12BLASModel(Model3DData* zModelData,
  5. ID3D12Device5* zDevice,
  6. DX12DirectCommandQueue* zDirectQueue)
  7. : ReferenceCounter(),
  8. zModelData(zModelData),
  9. zDevice(zDevice),
  10. zDirectQueue(zDirectQueue),
  11. vertexBuffers(0),
  12. vertexDataBuffers(0),
  13. indexBuffers(0),
  14. polygonSizeBuffers(0),
  15. blasList(0)
  16. {}
  17. Framework::DX12BLASModel::~DX12BLASModel()
  18. {
  19. if (vertexBuffers)
  20. {
  21. vertexBuffers->release();
  22. }
  23. if (vertexDataBuffers)
  24. {
  25. vertexDataBuffers->release();
  26. }
  27. if (indexBuffers)
  28. {
  29. indexBuffers->release();
  30. }
  31. if (polygonSizeBuffers)
  32. {
  33. polygonSizeBuffers->release();
  34. }
  35. if (blasList)
  36. {
  37. blasList->release();
  38. }
  39. }
  40. void Framework::DX12BLASModel::calculateBuffers()
  41. {
  42. if (!zModelData->wasIndexBufferChanged()
  43. && !zModelData->wasVertexBufferChanged())
  44. {
  45. return;
  46. }
  47. zModelData->lock();
  48. Skeleton* skeleton = zModelData->zSkeleton();
  49. const Vertex3D* vertexBuffer = zModelData->zVertexBuffer();
  50. const int* indexBuffer = zModelData->getIndexBuffer();
  51. int vertexCount = zModelData->getVertexCount();
  52. int indexCount = zModelData->getIndexCount();
  53. int maxBoneId = skeleton ? skeleton->getNextBoneId() : 0;
  54. int** boneIndexMapping = new int*[maxBoneId + 1];
  55. memset(boneIndexMapping, 0, sizeof(int*) * (maxBoneId + 1));
  56. Vec3<float>** boneVertexBuffers = new Vec3<float>*[maxBoneId + 1];
  57. memset(boneVertexBuffers, 0, sizeof(Vec3<float>*) * (maxBoneId + 1));
  58. int* boneVertexCount = new int[maxBoneId + 1];
  59. memset(boneVertexCount, 0, sizeof(int) * (maxBoneId + 1));
  60. int** boneIndexBuffers = new int*[maxBoneId + 1];
  61. memset(boneIndexBuffers, 0, sizeof(int*) * (maxBoneId + 1));
  62. int* boneIndexCount = new int[maxBoneId + 1];
  63. memset(boneIndexCount, 0, sizeof(int) * (maxBoneId + 1));
  64. DX2VertexData** boneVertexDatabuffers = new DX2VertexData*[maxBoneId + 1];
  65. memset(boneVertexDatabuffers, 0, sizeof(DX2VertexData*) * (maxBoneId + 1));
  66. int** bonePolygonSize = new int*[maxBoneId + 1];
  67. memset(bonePolygonSize, 0, sizeof(int*) * (maxBoneId + 1));
  68. ArrayIterator<Polygon3D*> polygonIterator = zModelData->getPolygons();
  69. int polygonSize = polygonIterator->indexAnz;
  70. int polygonIndex = 0;
  71. for (int i = 0; i < indexCount; i += 3)
  72. { // for each triangle
  73. int b1 = -1;
  74. int b2 = -1;
  75. for (int b = 0; b < 3; b++)
  76. { // for each bone of the model that is touched by the triangle
  77. int bone = vertexBuffer[indexBuffer[i + b]].knochenId;
  78. if (b1 != bone && b2 != bone)
  79. { // check if the bone is the same as the other two bones of the
  80. // triangle that were already processed
  81. if (b1 < 0)
  82. {
  83. b1 = bone;
  84. }
  85. else if (b2 < 0)
  86. {
  87. b2 = bone;
  88. }
  89. if (!boneIndexMapping[bone])
  90. {
  91. boneIndexMapping[bone] = new int[vertexCount];
  92. memset(
  93. boneIndexMapping[bone], -1, sizeof(int) * vertexCount);
  94. }
  95. if (!boneVertexBuffers[bone])
  96. {
  97. boneVertexBuffers[bone] = new Vec3<float>[vertexCount];
  98. }
  99. if (!boneVertexDatabuffers[bone])
  100. {
  101. boneVertexDatabuffers[bone]
  102. = new DX2VertexData[vertexCount];
  103. }
  104. if (!boneIndexBuffers[bone])
  105. {
  106. boneIndexBuffers[bone] = new int[indexCount];
  107. }
  108. if (!bonePolygonSize[bone])
  109. {
  110. bonePolygonSize[bone]
  111. = new int[zModelData->getPolygonCount()];
  112. memset(bonePolygonSize[bone],
  113. 0,
  114. sizeof(int) * zModelData->getPolygonCount());
  115. }
  116. for (int j = 0; j < 3; j++)
  117. { // add the vertecies and indices of the triangle to the
  118. // buffers of the bone
  119. if (boneIndexMapping[bone][indexBuffer[i + j]] < 0)
  120. {
  121. boneIndexMapping[bone][indexBuffer[i + j]]
  122. = boneVertexCount[bone];
  123. boneVertexBuffers[bone][boneVertexCount[bone]]
  124. = vertexBuffer[indexBuffer[i + j]].pos;
  125. boneVertexDatabuffers[bone][boneVertexCount[bone]]
  126. .texcoord = vertexBuffer[indexBuffer[i + j]].tPos;
  127. boneVertexDatabuffers[bone][boneVertexCount[bone]]
  128. .normal = vertexBuffer[indexBuffer[i + j]].normal;
  129. boneVertexCount[bone]++;
  130. }
  131. boneIndexBuffers[bone][boneIndexCount[bone]]
  132. = boneIndexMapping[bone][indexBuffer[i + j]];
  133. boneIndexCount[bone]++;
  134. }
  135. bonePolygonSize[bone][polygonIndex]++;
  136. }
  137. }
  138. polygonSize -= 3;
  139. if (polygonSize <= 0)
  140. {
  141. polygonIndex++;
  142. polygonIterator++;
  143. if (polygonIterator)
  144. {
  145. polygonSize = polygonIterator->indexAnz;
  146. }
  147. }
  148. }
  149. zModelData->setIndexBufferChanged(0);
  150. zModelData->setVertexBufferChanged(0);
  151. if (!vertexBuffers)
  152. {
  153. vertexBuffers = new RCArray<DX12Buffer>();
  154. }
  155. if (!vertexDataBuffers)
  156. {
  157. vertexDataBuffers = new RCArray<DX12Buffer>();
  158. }
  159. if (!indexBuffers)
  160. {
  161. indexBuffers = new RCArray<DX12Buffer>();
  162. }
  163. if (!polygonSizeBuffers)
  164. {
  165. polygonSizeBuffers = new RCArray<DX12Buffer>();
  166. }
  167. if (!blasList)
  168. {
  169. blasList = new RCArray<DX12BLAS>();
  170. }
  171. vertexBuffers->clear();
  172. vertexDataBuffers->clear();
  173. indexBuffers->clear();
  174. polygonSizeBuffers->clear();
  175. blasList->clear();
  176. boneIds.clear();
  177. for (int i = 0; i <= maxBoneId; i++)
  178. {
  179. if (boneVertexCount[i] > 0 && boneIndexCount[i] > 0)
  180. {
  181. DX12Buffer* vertexBuffer = new DX12Buffer(sizeof(Vec3<float>),
  182. zDevice,
  183. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  184. 0);
  185. vertexBuffer->setData(boneVertexBuffers[i], true);
  186. vertexBuffer->setLength(boneVertexCount[i] * sizeof(Vec3<float>));
  187. vertexBuffer->copyToGPU();
  188. vertexBuffers->add(vertexBuffer);
  189. DX12Buffer* vertexDataBuffer = new DX12Buffer(sizeof(DX2VertexData),
  190. zDevice,
  191. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  192. 0);
  193. vertexDataBuffer->setData(boneVertexDatabuffers[i], true);
  194. vertexDataBuffer->setLength(
  195. boneVertexCount[i] * sizeof(DX2VertexData));
  196. vertexDataBuffer->copyToGPU();
  197. vertexDataBuffers->add(vertexDataBuffer);
  198. DX12Buffer* indexBuffer = new DX12Buffer(sizeof(int),
  199. zDevice,
  200. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  201. 0);
  202. indexBuffer->setData(boneIndexBuffers[i], true);
  203. indexBuffer->setLength(boneIndexCount[i] * sizeof(int));
  204. indexBuffer->copyToGPU();
  205. indexBuffers->add(indexBuffer);
  206. DX12Buffer* polygonSizeBuffer = new DX12Buffer(sizeof(int),
  207. zDevice,
  208. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  209. 0);
  210. polygonSizeBuffer->setData(bonePolygonSize[i], true);
  211. polygonSizeBuffer->setLength(
  212. zModelData->getPolygonCount() * sizeof(int));
  213. polygonSizeBuffer->copyToGPU();
  214. polygonSizeBuffers->add(polygonSizeBuffer);
  215. DX12BLAS* blas = new DX12BLAS(zDevice, zDirectQueue);
  216. blas->build(vertexBuffer,
  217. dynamic_cast<DX12Buffer*>(vertexDataBuffer->getThis()),
  218. dynamic_cast<DX12Buffer*>(indexBuffer->getThis()),
  219. dynamic_cast<DX12Buffer*>(polygonSizeBuffer->getThis()));
  220. blasList->add(blas);
  221. boneIds.add(i);
  222. }
  223. delete[] boneIndexMapping[i];
  224. delete[] boneVertexBuffers[i];
  225. delete[] boneIndexBuffers[i];
  226. delete[] boneVertexDatabuffers[i];
  227. delete[] bonePolygonSize[i];
  228. }
  229. delete[] boneIndexMapping;
  230. delete[] boneVertexBuffers;
  231. delete[] boneVertexCount;
  232. delete[] boneIndexBuffers;
  233. delete[] boneIndexCount;
  234. delete[] boneVertexDatabuffers;
  235. delete[] bonePolygonSize;
  236. zModelData->unlock();
  237. }
  238. int Framework::DX12BLASModel::getBufferCount() const
  239. {
  240. return vertexBuffers ? vertexBuffers->getEntryCount() : 0;
  241. }
  242. const Framework::RCArray<Framework::DX12BLAS>*
  243. Framework::DX12BLASModel::zBLAS() const
  244. {
  245. return blasList;
  246. }
  247. const Framework::Array<int>* Framework::DX12BLASModel::zBoneIds() const
  248. {
  249. return &boneIds;
  250. }