DX12BLASModel.cpp 5.2 KB

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