DX12BLASModel.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. indexBuffers(0),
  13. blasList(0)
  14. {}
  15. Framework::DX12BLASModel::~DX12BLASModel()
  16. {
  17. if (vertexBuffers)
  18. {
  19. vertexBuffers->release();
  20. }
  21. if (indexBuffers)
  22. {
  23. indexBuffers->release();
  24. }
  25. if (blasList)
  26. {
  27. blasList->release();
  28. }
  29. }
  30. void Framework::DX12BLASModel::calculateBuffers()
  31. {
  32. if (!zModelData->wasIndexBufferChanged()
  33. && !zModelData->wasVertexBufferChanged())
  34. {
  35. return;
  36. }
  37. Skeleton* skeleton = zModelData->zSkeleton();
  38. const Vertex3D* vertexBuffer = zModelData->zVertexBuffer();
  39. const int* indexBuffer = zModelData->getIndexBuffer();
  40. int vertexCount = zModelData->getVertexCount();
  41. int indexCount = zModelData->getIndexCount();
  42. int maxBoneId = skeleton ? skeleton->getNextBoneId() : 0;
  43. int** boneIndexMapping = new int*[maxBoneId + 1];
  44. memset(boneIndexMapping, 0, sizeof(int*) * (maxBoneId + 1));
  45. Vec3<float>** boneVertexBuffers = new Vec3<float>*[maxBoneId + 1];
  46. memset(boneVertexBuffers, 0, sizeof(Vec3<float>*) * (maxBoneId + 1));
  47. int* boneVertexCount = new int[maxBoneId + 1];
  48. memset(boneVertexCount, 0, sizeof(int) * (maxBoneId + 1));
  49. int** boneIndexBuffers = new int*[maxBoneId + 1];
  50. memset(boneIndexBuffers, 0, sizeof(int*) * (maxBoneId + 1));
  51. int* boneIndexCount = new int[maxBoneId + 1];
  52. memset(boneIndexCount, 0, sizeof(int) * (maxBoneId + 1));
  53. for (int i = 0; i < indexCount; i += 3)
  54. { // for each triangle
  55. int b1 = -1;
  56. int b2 = -1;
  57. for (int b = 0; b < 3; b++)
  58. { // for each bone of the model that is touched by the triangle
  59. int bone = vertexBuffer[indexBuffer[i + b]].knochenId;
  60. if (b1 != bone && b2 != bone)
  61. { // check if the bone is the same as the other two bones of the
  62. // triangle that were already processed
  63. if (b1 < 0)
  64. {
  65. b1 = bone;
  66. }
  67. else if (b2 < 0)
  68. {
  69. b2 = bone;
  70. }
  71. if (!boneIndexMapping[bone])
  72. {
  73. boneIndexMapping[bone] = new int[vertexCount];
  74. memset(
  75. boneIndexMapping[bone], -1, sizeof(int) * vertexCount);
  76. }
  77. if (!boneVertexBuffers[bone])
  78. {
  79. boneVertexBuffers[bone] = new Vec3<float>[vertexCount];
  80. }
  81. if (!boneIndexBuffers[bone])
  82. {
  83. boneIndexBuffers[bone] = new int[indexCount];
  84. }
  85. for (int j = 0; j < 3; j++)
  86. { // add the vertecies and indices of the triangle to the
  87. // buffers of the bone
  88. if (boneIndexMapping[bone][indexBuffer[i + j]] < 0)
  89. {
  90. boneIndexMapping[bone][indexBuffer[i + j]]
  91. = boneVertexCount[bone];
  92. boneVertexBuffers[bone][boneVertexCount[bone]]
  93. = vertexBuffer[indexBuffer[i + j]].pos;
  94. boneVertexCount[bone]++;
  95. }
  96. boneIndexBuffers[bone][boneIndexCount[bone]]
  97. = boneIndexMapping[bone][indexBuffer[i + j]];
  98. boneIndexCount[bone]++;
  99. }
  100. }
  101. }
  102. }
  103. zModelData->setIndexBufferChanged(0);
  104. zModelData->setVertexBufferChanged(0);
  105. if (!vertexBuffers)
  106. {
  107. vertexBuffers = new RCArray<DX12Buffer>();
  108. }
  109. if (!indexBuffers)
  110. {
  111. indexBuffers = new RCArray<DX12Buffer>();
  112. }
  113. if (!blasList)
  114. {
  115. blasList = new RCArray<DX12BLAS>();
  116. }
  117. vertexBuffers->clear();
  118. indexBuffers->clear();
  119. blasList->clear();
  120. boneIds.clear();
  121. for (int i = 0; i <= maxBoneId; i++)
  122. {
  123. if (boneVertexCount[i] > 0 && boneIndexCount[i] > 0)
  124. {
  125. DX12Buffer* vertexBuffer = new DX12Buffer(sizeof(Vec3<float>),
  126. zDevice,
  127. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  128. 0);
  129. vertexBuffer->setData(boneVertexBuffers[i], true);
  130. vertexBuffer->setLength(boneVertexCount[i] * sizeof(Vec3<float>));
  131. vertexBuffer->copyToGPU();
  132. vertexBuffers->add(vertexBuffer);
  133. DX12Buffer* indexBuffer = new DX12Buffer(sizeof(int),
  134. zDevice,
  135. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  136. 0);
  137. indexBuffer->setData(boneIndexBuffers[i], true);
  138. indexBuffer->setLength(boneIndexCount[i] * sizeof(int));
  139. indexBuffer->copyToGPU();
  140. indexBuffers->add(indexBuffer);
  141. DX12BLAS* blas = new DX12BLAS(zDevice, zDirectQueue);
  142. blas->build(vertexBuffer, indexBuffer);
  143. blasList->add(blas);
  144. boneIds.add(i);
  145. }
  146. delete[] boneIndexMapping[i];
  147. delete[] boneVertexBuffers[i];
  148. delete[] boneIndexBuffers[i];
  149. }
  150. delete[] boneIndexMapping;
  151. delete[] boneVertexBuffers;
  152. delete[] boneVertexCount;
  153. delete[] boneIndexBuffers;
  154. delete[] boneIndexCount;
  155. }
  156. int Framework::DX12BLASModel::getBufferCount() const
  157. {
  158. return vertexBuffers ? vertexBuffers->getEntryCount() : 0;
  159. }
  160. const Framework::RCArray<Framework::DX12BLAS>*
  161. Framework::DX12BLASModel::zBLAS() const
  162. {
  163. return blasList;
  164. }
  165. const Framework::Array<int>* Framework::DX12BLASModel::zBoneIds() const
  166. {
  167. return &boneIds;
  168. }