DX12BLASModel.cpp 5.6 KB

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