DX12BLASModel.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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 (maxBoneId < bone)
  79. {
  80. bone = maxBoneId;
  81. }
  82. if (b1 != bone && b2 != bone)
  83. { // check if the bone is the same as the other two bones of the
  84. // triangle that were already processed
  85. if (b1 < 0)
  86. {
  87. b1 = bone;
  88. }
  89. else if (b2 < 0)
  90. {
  91. b2 = bone;
  92. }
  93. if (!boneIndexMapping[bone])
  94. {
  95. boneIndexMapping[bone] = new int[vertexCount];
  96. memset(
  97. boneIndexMapping[bone], -1, sizeof(int) * vertexCount);
  98. }
  99. if (!boneVertexBuffers[bone])
  100. {
  101. boneVertexBuffers[bone] = new Vec3<float>[vertexCount];
  102. }
  103. if (!boneVertexDatabuffers[bone])
  104. {
  105. boneVertexDatabuffers[bone]
  106. = new DX2VertexData[vertexCount];
  107. }
  108. if (!boneIndexBuffers[bone])
  109. {
  110. boneIndexBuffers[bone] = new int[indexCount];
  111. }
  112. if (!bonePolygonSize[bone])
  113. {
  114. bonePolygonSize[bone]
  115. = new int[zModelData->getPolygonCount()];
  116. memset(bonePolygonSize[bone],
  117. 0,
  118. sizeof(int) * zModelData->getPolygonCount());
  119. }
  120. for (int j = 0; j < 3; j++)
  121. { // add the vertecies and indices of the triangle to the
  122. // buffers of the bone
  123. if (boneIndexMapping[bone][indexBuffer[i + j]] < 0)
  124. {
  125. boneIndexMapping[bone][indexBuffer[i + j]]
  126. = boneVertexCount[bone];
  127. boneVertexBuffers[bone][boneVertexCount[bone]]
  128. = vertexBuffer[indexBuffer[i + j]].pos;
  129. boneVertexDatabuffers[bone][boneVertexCount[bone]]
  130. .texcoord = vertexBuffer[indexBuffer[i + j]].tPos;
  131. boneVertexDatabuffers[bone][boneVertexCount[bone]]
  132. .normal = vertexBuffer[indexBuffer[i + j]].normal;
  133. boneVertexCount[bone]++;
  134. }
  135. boneIndexBuffers[bone][boneIndexCount[bone]]
  136. = boneIndexMapping[bone][indexBuffer[i + j]];
  137. boneIndexCount[bone]++;
  138. }
  139. bonePolygonSize[bone][polygonIndex]++;
  140. }
  141. }
  142. polygonSize -= 3;
  143. if (polygonSize <= 0)
  144. {
  145. polygonIndex++;
  146. polygonIterator++;
  147. if (polygonIterator)
  148. {
  149. polygonSize = polygonIterator->indexAnz;
  150. }
  151. }
  152. }
  153. zModelData->setIndexBufferChanged(0);
  154. zModelData->setVertexBufferChanged(0);
  155. if (!vertexBuffers)
  156. {
  157. vertexBuffers = new RCArray<DX12Buffer>();
  158. }
  159. if (!vertexDataBuffers)
  160. {
  161. vertexDataBuffers = new RCArray<DX12Buffer>();
  162. }
  163. if (!indexBuffers)
  164. {
  165. indexBuffers = new RCArray<DX12Buffer>();
  166. }
  167. if (!polygonSizeBuffers)
  168. {
  169. polygonSizeBuffers = new RCArray<DX12Buffer>();
  170. }
  171. if (!blasList)
  172. {
  173. blasList = new RCArray<DX12BLAS>();
  174. }
  175. vertexBuffers->clear();
  176. vertexDataBuffers->clear();
  177. indexBuffers->clear();
  178. polygonSizeBuffers->clear();
  179. blasList->clear();
  180. boneIds.clear();
  181. for (int i = 0; i <= maxBoneId; i++)
  182. {
  183. if (boneVertexCount[i] > 0 && boneIndexCount[i] > 0)
  184. {
  185. DX12Buffer* vertexBuffer = new DX12Buffer(sizeof(Vec3<float>),
  186. zDevice,
  187. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  188. 0);
  189. vertexBuffer->setData(boneVertexBuffers[i], true);
  190. vertexBuffer->setLength(boneVertexCount[i] * sizeof(Vec3<float>));
  191. vertexBuffer->copyToGPU();
  192. vertexBuffers->add(vertexBuffer);
  193. DX12Buffer* vertexDataBuffer = new DX12Buffer(sizeof(DX2VertexData),
  194. zDevice,
  195. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  196. 0);
  197. vertexDataBuffer->setData(boneVertexDatabuffers[i], true);
  198. vertexDataBuffer->setLength(
  199. boneVertexCount[i] * sizeof(DX2VertexData));
  200. vertexDataBuffer->copyToGPU();
  201. vertexDataBuffers->add(vertexDataBuffer);
  202. DX12Buffer* indexBuffer = new DX12Buffer(sizeof(int),
  203. zDevice,
  204. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  205. 0);
  206. indexBuffer->setData(boneIndexBuffers[i], true);
  207. indexBuffer->setLength(boneIndexCount[i] * sizeof(int));
  208. indexBuffer->copyToGPU();
  209. indexBuffers->add(indexBuffer);
  210. DX12Buffer* polygonSizeBuffer = new DX12Buffer(sizeof(int),
  211. zDevice,
  212. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  213. 0);
  214. polygonSizeBuffer->setData(bonePolygonSize[i], true);
  215. polygonSizeBuffer->setLength(
  216. zModelData->getPolygonCount() * sizeof(int));
  217. polygonSizeBuffer->copyToGPU();
  218. polygonSizeBuffers->add(polygonSizeBuffer);
  219. DX12BLAS* blas = new DX12BLAS(zDevice, zDirectQueue);
  220. blas->build(vertexBuffer,
  221. dynamic_cast<DX12Buffer*>(vertexDataBuffer->getThis()),
  222. dynamic_cast<DX12Buffer*>(indexBuffer->getThis()),
  223. dynamic_cast<DX12Buffer*>(polygonSizeBuffer->getThis()));
  224. blasList->add(blas);
  225. boneIds.add(i);
  226. }
  227. delete[] boneIndexMapping[i];
  228. delete[] boneVertexBuffers[i];
  229. delete[] boneIndexBuffers[i];
  230. delete[] boneVertexDatabuffers[i];
  231. delete[] bonePolygonSize[i];
  232. }
  233. delete[] boneIndexMapping;
  234. delete[] boneVertexBuffers;
  235. delete[] boneVertexCount;
  236. delete[] boneIndexBuffers;
  237. delete[] boneIndexCount;
  238. delete[] boneVertexDatabuffers;
  239. delete[] bonePolygonSize;
  240. zModelData->unlock();
  241. }
  242. int Framework::DX12BLASModel::getBufferCount() const
  243. {
  244. return vertexBuffers ? vertexBuffers->getEntryCount() : 0;
  245. }
  246. const Framework::RCArray<Framework::DX12BLAS>*
  247. Framework::DX12BLASModel::zBLAS() const
  248. {
  249. return blasList;
  250. }
  251. const Framework::Array<int>* Framework::DX12BLASModel::zBoneIds() const
  252. {
  253. return &boneIds;
  254. }