DX12BLASModel.cpp 9.3 KB

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