DX12BLASModel.cpp 5.9 KB

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