|
@@ -1,19 +1,33 @@
|
|
|
#include "Dx12ChunkData.h"
|
|
#include "Dx12ChunkData.h"
|
|
|
|
|
|
|
|
|
|
+#include <DX12BLASModel.h>
|
|
|
#include <DX12CommandQueue.h>
|
|
#include <DX12CommandQueue.h>
|
|
|
|
|
|
|
|
|
|
+#include "Block.h"
|
|
|
#include "Constants.h"
|
|
#include "Constants.h"
|
|
|
|
|
+#include "d3dx12.h"
|
|
|
|
|
+#include "Dimension.h"
|
|
|
|
|
|
|
|
DX12ChunkData::DX12ChunkData(Framework::Point center)
|
|
DX12ChunkData::DX12ChunkData(Framework::Point center)
|
|
|
: ReferenceCounter(),
|
|
: ReferenceCounter(),
|
|
|
aabbs(0),
|
|
aabbs(0),
|
|
|
chunkInfoBuffer(0),
|
|
chunkInfoBuffer(0),
|
|
|
blasScratchBuffer(0),
|
|
blasScratchBuffer(0),
|
|
|
|
|
+ customBlocksBlasScratchBuffer(0),
|
|
|
|
|
+ oldBlasBuffer(0),
|
|
|
blasBuffer(0),
|
|
blasBuffer(0),
|
|
|
|
|
+ customBlocksBlasBuffer(0),
|
|
|
blockIndexBuffer(0),
|
|
blockIndexBuffer(0),
|
|
|
textureIdBuffer(0),
|
|
textureIdBuffer(0),
|
|
|
|
|
+ customBlockTextures(0),
|
|
|
|
|
+ customBlocksCombinedIndexBuffer(0),
|
|
|
|
|
+ customBlocksVertexDataBuffer(0),
|
|
|
|
|
+ customBlocksIndexOffsetBuffer(0),
|
|
|
|
|
+ customBlockMatrixBuffer(0),
|
|
|
lastObjectIndex(-1),
|
|
lastObjectIndex(-1),
|
|
|
|
|
+ lastCustomObjectIndex(-1),
|
|
|
lastHitGroupIndex(-1),
|
|
lastHitGroupIndex(-1),
|
|
|
|
|
+ lastCustomHitGroupIndex(-1),
|
|
|
chunkCenter(center),
|
|
chunkCenter(center),
|
|
|
blockIndices(new int[CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT]),
|
|
blockIndices(new int[CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT]),
|
|
|
textureIds(),
|
|
textureIds(),
|
|
@@ -21,7 +35,9 @@ DX12ChunkData::DX12ChunkData(Framework::Point center)
|
|
|
bufferChanged(0),
|
|
bufferChanged(0),
|
|
|
minZ(WORLD_HEIGHT),
|
|
minZ(WORLD_HEIGHT),
|
|
|
maxZ(0),
|
|
maxZ(0),
|
|
|
- minMaxChanged(0)
|
|
|
|
|
|
|
+ minMaxChanged(0),
|
|
|
|
|
+ customBufferChanged(0),
|
|
|
|
|
+ customBlocksChanged(0)
|
|
|
{
|
|
{
|
|
|
memset(
|
|
memset(
|
|
|
blockIndices, -1, sizeof(int) * CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT);
|
|
blockIndices, -1, sizeof(int) * CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT);
|
|
@@ -41,10 +57,22 @@ DX12ChunkData::~DX12ChunkData()
|
|
|
{
|
|
{
|
|
|
blasScratchBuffer->release();
|
|
blasScratchBuffer->release();
|
|
|
}
|
|
}
|
|
|
|
|
+ if (customBlocksBlasScratchBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksBlasScratchBuffer->release();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (oldBlasBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ oldBlasBuffer->Release();
|
|
|
|
|
+ }
|
|
|
if (blasBuffer)
|
|
if (blasBuffer)
|
|
|
{
|
|
{
|
|
|
blasBuffer->release();
|
|
blasBuffer->release();
|
|
|
}
|
|
}
|
|
|
|
|
+ if (customBlocksBlasBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksBlasBuffer->release();
|
|
|
|
|
+ }
|
|
|
if (blockIndexBuffer)
|
|
if (blockIndexBuffer)
|
|
|
{
|
|
{
|
|
|
blockIndexBuffer->release();
|
|
blockIndexBuffer->release();
|
|
@@ -53,6 +81,26 @@ DX12ChunkData::~DX12ChunkData()
|
|
|
{
|
|
{
|
|
|
textureIdBuffer->release();
|
|
textureIdBuffer->release();
|
|
|
}
|
|
}
|
|
|
|
|
+ if (customBlockTextures)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlockTextures->release();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (customBlocksCombinedIndexBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksCombinedIndexBuffer->release();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (customBlocksVertexDataBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksVertexDataBuffer->release();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (customBlocksIndexOffsetBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksIndexOffsetBuffer->release();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (customBlockMatrixBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlockMatrixBuffer->release();
|
|
|
|
|
+ }
|
|
|
delete[] blockIndices;
|
|
delete[] blockIndices;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -76,10 +124,36 @@ Framework::DX12Buffer* DX12ChunkData::zTextureIdBuffer() const
|
|
|
return textureIdBuffer;
|
|
return textureIdBuffer;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+Framework::DX12Buffer* DX12ChunkData::zCustomBlocksBlasBuffer() const
|
|
|
|
|
+{
|
|
|
|
|
+ return customBlocksBlasBuffer;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+Framework::DX12Buffer* DX12ChunkData::zCustomBlocksTextureBuffer() const
|
|
|
|
|
+{
|
|
|
|
|
+ return customBlockTextures;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+Framework::DX12Buffer* DX12ChunkData::zCustomBlocksVertexDataBuffer() const
|
|
|
|
|
+{
|
|
|
|
|
+ return customBlocksVertexDataBuffer;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+Framework::DX12Buffer* DX12ChunkData::zCustomBlocksCombinedIndexBuffer() const
|
|
|
|
|
+{
|
|
|
|
|
+ return customBlocksCombinedIndexBuffer;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+Framework::DX12Buffer* DX12ChunkData::zCustomBlocksIndexOffsetBuffer() const
|
|
|
|
|
+{
|
|
|
|
|
+ return customBlocksIndexOffsetBuffer;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void DX12ChunkData::setBlock(int index, Block* zBlock)
|
|
void DX12ChunkData::setBlock(int index, Block* zBlock)
|
|
|
{
|
|
{
|
|
|
cs.lock();
|
|
cs.lock();
|
|
|
- if (zBlock)
|
|
|
|
|
|
|
+ if (zBlock
|
|
|
|
|
+ && zBlock->zBlockType()->getModelInfo().getModelName().isEqual("cube"))
|
|
|
{
|
|
{
|
|
|
if (blockIndices[index] < 0)
|
|
if (blockIndices[index] < 0)
|
|
|
{
|
|
{
|
|
@@ -159,10 +233,55 @@ void DX12ChunkData::setBlock(int index, Block* zBlock)
|
|
|
}
|
|
}
|
|
|
blockIndices[index] = -1;
|
|
blockIndices[index] = -1;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (zBlock
|
|
|
|
|
+ && !zBlock->zBlockType()->getModelInfo().getModelName().isEqual("cube"))
|
|
|
|
|
+ {
|
|
|
|
|
+ auto iterator = customBlocks.begin();
|
|
|
|
|
+ bool found = 0;
|
|
|
|
|
+ while (iterator)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (iterator->getLocation() == zBlock->getLocation())
|
|
|
|
|
+ {
|
|
|
|
|
+ iterator.set(dynamic_cast<Block*>(zBlock->getThis()));
|
|
|
|
|
+ found = 1;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ ++iterator;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!found)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocks.add(dynamic_cast<Block*>(zBlock->getThis()));
|
|
|
|
|
+ }
|
|
|
|
|
+ customBlocksChanged = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!zBlock
|
|
|
|
|
+ || zBlock->zBlockType()->getModelInfo().getModelName().isEqual("cube"))
|
|
|
|
|
+ {
|
|
|
|
|
+ auto iterator = customBlocks.begin();
|
|
|
|
|
+ while (iterator)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (Chunk::index(
|
|
|
|
|
+ Dimension::chunkCoordinates(iterator->getLocation()))
|
|
|
|
|
+ == index)
|
|
|
|
|
+ {
|
|
|
|
|
+ iterator.remove();
|
|
|
|
|
+ customBlocksChanged = 1;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ ++iterator;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
changed = 1;
|
|
changed = 1;
|
|
|
cs.unlock();
|
|
cs.unlock();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+struct ModelIdMapping
|
|
|
|
|
+{
|
|
|
|
|
+ int modelId;
|
|
|
|
|
+ int vertexBufferOffset;
|
|
|
|
|
+ int indexBufferOffset;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
void DX12ChunkData::updateBuffers(
|
|
void DX12ChunkData::updateBuffers(
|
|
|
ID3D12Device5* zDevice, Framework::DX12CommandQueue* zQueue)
|
|
ID3D12Device5* zDevice, Framework::DX12CommandQueue* zQueue)
|
|
|
{
|
|
{
|
|
@@ -176,10 +295,10 @@ void DX12ChunkData::updateBuffers(
|
|
|
aabbs->setLength(sizeof(D3D12_RAYTRACING_AABB));
|
|
aabbs->setLength(sizeof(D3D12_RAYTRACING_AABB));
|
|
|
D3D12_RAYTRACING_AABB data = {chunkCenter.x - 8.f,
|
|
D3D12_RAYTRACING_AABB data = {chunkCenter.x - 8.f,
|
|
|
chunkCenter.y - 8.f,
|
|
chunkCenter.y - 8.f,
|
|
|
- minZ,
|
|
|
|
|
|
|
+ (float)minZ,
|
|
|
chunkCenter.x + 8.f,
|
|
chunkCenter.x + 8.f,
|
|
|
chunkCenter.y + 8.f,
|
|
chunkCenter.y + 8.f,
|
|
|
- maxZ};
|
|
|
|
|
|
|
+ (float)maxZ};
|
|
|
aabbs->setData(&data, 1);
|
|
aabbs->setData(&data, 1);
|
|
|
aabbs->copyToGPU();
|
|
aabbs->copyToGPU();
|
|
|
minMaxChanged = 0;
|
|
minMaxChanged = 0;
|
|
@@ -188,15 +307,15 @@ void DX12ChunkData::updateBuffers(
|
|
|
{
|
|
{
|
|
|
D3D12_RAYTRACING_AABB data = {chunkCenter.x - 8.f,
|
|
D3D12_RAYTRACING_AABB data = {chunkCenter.x - 8.f,
|
|
|
chunkCenter.y - 8.f,
|
|
chunkCenter.y - 8.f,
|
|
|
- minZ,
|
|
|
|
|
|
|
+ (float)minZ,
|
|
|
chunkCenter.x + 8.f,
|
|
chunkCenter.x + 8.f,
|
|
|
chunkCenter.y + 8.f,
|
|
chunkCenter.y + 8.f,
|
|
|
- maxZ};
|
|
|
|
|
|
|
+ (float)maxZ};
|
|
|
aabbs->setData(&data, 1);
|
|
aabbs->setData(&data, 1);
|
|
|
aabbs->copyToGPU();
|
|
aabbs->copyToGPU();
|
|
|
minMaxChanged = 0;
|
|
minMaxChanged = 0;
|
|
|
}
|
|
}
|
|
|
- if (!blasBuffer)
|
|
|
|
|
|
|
+ if (!blasBuffer || minMaxChanged)
|
|
|
{
|
|
{
|
|
|
D3D12_RAYTRACING_GEOMETRY_DESC geometryDesc = {};
|
|
D3D12_RAYTRACING_GEOMETRY_DESC geometryDesc = {};
|
|
|
geometryDesc.Type
|
|
geometryDesc.Type
|
|
@@ -219,11 +338,15 @@ void DX12ChunkData::updateBuffers(
|
|
|
D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
|
|
D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
|
|
|
zDevice->GetRaytracingAccelerationStructurePrebuildInfo(
|
|
zDevice->GetRaytracingAccelerationStructurePrebuildInfo(
|
|
|
&prebuildDesc, &info);
|
|
&prebuildDesc, &info);
|
|
|
- ID3D12Resource* oldBuffer = 0;
|
|
|
|
|
|
|
+ if (oldBlasBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ oldBlasBuffer->Release();
|
|
|
|
|
+ oldBlasBuffer = 0;
|
|
|
|
|
+ }
|
|
|
if (blasBuffer)
|
|
if (blasBuffer)
|
|
|
{
|
|
{
|
|
|
- oldBuffer = blasBuffer->zBuffer();
|
|
|
|
|
- oldBuffer->AddRef();
|
|
|
|
|
|
|
+ oldBlasBuffer = blasBuffer->zBuffer();
|
|
|
|
|
+ oldBlasBuffer->AddRef();
|
|
|
blasBuffer->release();
|
|
blasBuffer->release();
|
|
|
}
|
|
}
|
|
|
blasBuffer = new DX12Buffer(1,
|
|
blasBuffer = new DX12Buffer(1,
|
|
@@ -253,18 +376,15 @@ void DX12ChunkData::updateBuffers(
|
|
|
= {blasBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
= {blasBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
|
buildDesc.ScratchAccelerationStructureData
|
|
buildDesc.ScratchAccelerationStructureData
|
|
|
= {blasScratchBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
= {blasScratchBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
|
- buildDesc.SourceAccelerationStructureData = oldBuffer ? oldBuffer->GetGPUVirtualAddress() : 0;
|
|
|
|
|
|
|
+ buildDesc.SourceAccelerationStructureData
|
|
|
|
|
+ = oldBlasBuffer ? oldBlasBuffer->GetGPUVirtualAddress() : 0;
|
|
|
buildDesc.Inputs.Flags
|
|
buildDesc.Inputs.Flags
|
|
|
- = oldBuffer
|
|
|
|
|
|
|
+ = oldBlasBuffer
|
|
|
? D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PERFORM_UPDATE
|
|
? D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PERFORM_UPDATE
|
|
|
: D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_UPDATE;
|
|
: D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_UPDATE;
|
|
|
|
|
|
|
|
zQueue->zCommandList()->BuildRaytracingAccelerationStructure(
|
|
zQueue->zCommandList()->BuildRaytracingAccelerationStructure(
|
|
|
&buildDesc, 0, nullptr);
|
|
&buildDesc, 0, nullptr);
|
|
|
- if (oldBuffer)
|
|
|
|
|
- {
|
|
|
|
|
- oldBuffer->Release();
|
|
|
|
|
- }
|
|
|
|
|
bufferChanged = 1;
|
|
bufferChanged = 1;
|
|
|
}
|
|
}
|
|
|
if (!blockIndexBuffer)
|
|
if (!blockIndexBuffer)
|
|
@@ -300,6 +420,279 @@ void DX12ChunkData::updateBuffers(
|
|
|
D3D12_RESOURCE_FLAG_NONE);
|
|
D3D12_RESOURCE_FLAG_NONE);
|
|
|
chunkInfoBuffer->setLength(sizeof(ChunkShaderInfo));
|
|
chunkInfoBuffer->setLength(sizeof(ChunkShaderInfo));
|
|
|
}
|
|
}
|
|
|
|
|
+ if (customBlocksChanged)
|
|
|
|
|
+ {
|
|
|
|
|
+ int* cbts = new int[customBlocks.getEntryCount()];
|
|
|
|
|
+ int index = 0;
|
|
|
|
|
+ D3D12_RAYTRACING_GEOMETRY_DESC* simpleBlockDescs
|
|
|
|
|
+ = new D3D12_RAYTRACING_GEOMETRY_DESC[customBlocks.getEntryCount()];
|
|
|
|
|
+ int* indexOffsets = new int[customBlocks.getEntryCount()];
|
|
|
|
|
+ int vertexCount = 0;
|
|
|
|
|
+ int indexCount = 0;
|
|
|
|
|
+ Array<ModelIdMapping> idMapping;
|
|
|
|
|
+ for (Block* block : customBlocks)
|
|
|
|
|
+ {
|
|
|
|
|
+ int id = block->zModelData()->getId();
|
|
|
|
|
+ bool found = 0;
|
|
|
|
|
+ for (const ModelIdMapping& m : idMapping)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (m.modelId == id)
|
|
|
|
|
+ {
|
|
|
|
|
+ found = 1;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!found)
|
|
|
|
|
+ {
|
|
|
|
|
+ ModelIdMapping mapping;
|
|
|
|
|
+ mapping.modelId = id;
|
|
|
|
|
+ mapping.vertexBufferOffset = vertexCount;
|
|
|
|
|
+ mapping.indexBufferOffset = indexCount;
|
|
|
|
|
+ idMapping.add(mapping);
|
|
|
|
|
+ vertexCount += block->zModelData()->getVertexCount();
|
|
|
|
|
+ indexCount += block->zModelData()->getIndexCount();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ int* combinedIndexBuffer = new int[indexCount];
|
|
|
|
|
+ Framework::DX2VertexData* vertexDataBuffer
|
|
|
|
|
+ = new Framework::DX2VertexData[vertexCount];
|
|
|
|
|
+ int vdIndex = 0;
|
|
|
|
|
+ Array<int> modelBuild;
|
|
|
|
|
+ float* matrixDataBuffer = new float[customBlocks.getEntryCount() * 12];
|
|
|
|
|
+ int blockIndex = 0;
|
|
|
|
|
+ for (Block* block : customBlocks)
|
|
|
|
|
+ {
|
|
|
|
|
+ Mat4<float> transform
|
|
|
|
|
+ = Mat4<float>::translation(
|
|
|
|
|
+ (Vec3<float>)Dimension::chunkCoordinates(block->getLocation())
|
|
|
|
|
+ + Vec3<float>(
|
|
|
|
|
+ 0.5f - CHUNK_SIZE / 2, 0.5f - CHUNK_SIZE / 2, 0.5f))
|
|
|
|
|
+ * Mat4<float>::rotationZ(block->getZRotation())
|
|
|
|
|
+ * Mat4<float>::rotationX(block->getXRotation())
|
|
|
|
|
+ * Mat4<float>::rotationY(block->getYRotation())
|
|
|
|
|
+ * Mat4<float>::scaling(block->getSize());
|
|
|
|
|
+ memcpy(matrixDataBuffer + 12 * blockIndex,
|
|
|
|
|
+ &transform,
|
|
|
|
|
+ 12 * sizeof(float));
|
|
|
|
|
+ ++blockIndex;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!customBlockMatrixBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlockMatrixBuffer = new DX12Buffer(sizeof(float) * 12,
|
|
|
|
|
+ zDevice,
|
|
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zQueue->getThis()),
|
|
|
|
|
+ D3D12_RESOURCE_FLAG_NONE);
|
|
|
|
|
+ }
|
|
|
|
|
+ customBlockMatrixBuffer->setLength(
|
|
|
|
|
+ sizeof(float) * 12 * customBlocks.getEntryCount());
|
|
|
|
|
+ customBlockMatrixBuffer->setData(matrixDataBuffer, 1);
|
|
|
|
|
+ customBlockMatrixBuffer->copyToGPU();
|
|
|
|
|
+ CD3DX12_RESOURCE_BARRIER transition
|
|
|
|
|
+ = CD3DX12_RESOURCE_BARRIER::Transition(
|
|
|
|
|
+ customBlockMatrixBuffer->zBuffer(),
|
|
|
|
|
+ D3D12_RESOURCE_STATE_COMMON,
|
|
|
|
|
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
|
|
|
|
|
+ zQueue->zCommandList()->ResourceBarrier(1, &transition);
|
|
|
|
|
+ for (Block* block : customBlocks)
|
|
|
|
|
+ {
|
|
|
|
|
+ int id = block->zModelData()->getId();
|
|
|
|
|
+ ModelIdMapping mapping;
|
|
|
|
|
+ int mappingIndex = 0;
|
|
|
|
|
+ for (const ModelIdMapping& m : idMapping)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (m.modelId == id)
|
|
|
|
|
+ {
|
|
|
|
|
+ mapping = m;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ ++mappingIndex;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (modelBuild.getValueIndex(id) < 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ modelBuild.add(id);
|
|
|
|
|
+ while (vertexBuffers.getEntryCount() <= mappingIndex)
|
|
|
|
|
+ {
|
|
|
|
|
+ DX12Buffer* vBuffer = new DX12Buffer(sizeof(Vec3<float>),
|
|
|
|
|
+ zDevice,
|
|
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zQueue->getThis()),
|
|
|
|
|
+ D3D12_RESOURCE_FLAG_NONE);
|
|
|
|
|
+ vertexBuffers.add(vBuffer);
|
|
|
|
|
+ }
|
|
|
|
|
+ while (indexBuffers.getEntryCount() <= mappingIndex)
|
|
|
|
|
+ {
|
|
|
|
|
+ DX12Buffer* iBuffer = new DX12Buffer(sizeof(int),
|
|
|
|
|
+ zDevice,
|
|
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zQueue->getThis()),
|
|
|
|
|
+ D3D12_RESOURCE_FLAG_NONE);
|
|
|
|
|
+ indexBuffers.add(iBuffer);
|
|
|
|
|
+ }
|
|
|
|
|
+ DX12Buffer* vBuffer = vertexBuffers.z(mappingIndex);
|
|
|
|
|
+ Vec3<float>* vertexBuffer
|
|
|
|
|
+ = new Vec3<float>[block->zModelData()->getVertexCount()];
|
|
|
|
|
+ const Vertex3D* rawVertexData
|
|
|
|
|
+ = block->zModelData()->zVertexBuffer();
|
|
|
|
|
+ for (int i = 0; i < block->zModelData()->getVertexCount(); ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ vertexBuffer[i] = rawVertexData[i].pos;
|
|
|
|
|
+ vertexDataBuffer[mapping.vertexBufferOffset + i]
|
|
|
|
|
+ = {rawVertexData[i].tPos, rawVertexData[i].normal};
|
|
|
|
|
+ }
|
|
|
|
|
+ const int* rawIndexBuffer
|
|
|
|
|
+ = block->zModelData()->getIndexBuffer();
|
|
|
|
|
+ for (int i = 0; i < block->zModelData()->getIndexCount(); i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ combinedIndexBuffer[mapping.indexBufferOffset + i]
|
|
|
|
|
+ = rawIndexBuffer[i] + mapping.vertexBufferOffset;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ vBuffer->setLength(sizeof(Vec3<float>)
|
|
|
|
|
+ * block->zModelData()->getVertexCount());
|
|
|
|
|
+ vBuffer->setData(vertexBuffer, 1);
|
|
|
|
|
+ vBuffer->copyToGPU();
|
|
|
|
|
+ delete[] vertexBuffer;
|
|
|
|
|
+
|
|
|
|
|
+ DX12Buffer* iBuffer = indexBuffers.z(mappingIndex);
|
|
|
|
|
+ iBuffer->setLength(
|
|
|
|
|
+ sizeof(int) * block->zModelData()->getIndexCount());
|
|
|
|
|
+ iBuffer->setData((void*)rawIndexBuffer, 1);
|
|
|
|
|
+ iBuffer->copyToGPU();
|
|
|
|
|
+ }
|
|
|
|
|
+ DX12Buffer* vBuffer = vertexBuffers.z(mappingIndex);
|
|
|
|
|
+ DX12Buffer* iBuffer = indexBuffers.z(mappingIndex);
|
|
|
|
|
+ simpleBlockDescs[index].Type
|
|
|
|
|
+ = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
|
|
|
|
|
+ simpleBlockDescs[index].Flags = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE;
|
|
|
|
|
+ simpleBlockDescs[index].Triangles.VertexBuffer.StartAddress
|
|
|
|
|
+ = vBuffer->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
+ simpleBlockDescs[index].Triangles.VertexBuffer.StrideInBytes
|
|
|
|
|
+ = vBuffer->getElementLength();
|
|
|
|
|
+ simpleBlockDescs[index].Triangles.VertexFormat
|
|
|
|
|
+ = DXGI_FORMAT_R32G32B32_FLOAT;
|
|
|
|
|
+ simpleBlockDescs[index].Triangles.VertexCount
|
|
|
|
|
+ = vBuffer->getElementCount();
|
|
|
|
|
+ simpleBlockDescs[index].Triangles.IndexBuffer
|
|
|
|
|
+ = iBuffer->zBuffer()->GetGPUVirtualAddress();
|
|
|
|
|
+ simpleBlockDescs[index].Triangles.IndexFormat
|
|
|
|
|
+ = DXGI_FORMAT_R32_UINT;
|
|
|
|
|
+ simpleBlockDescs[index].Triangles.IndexCount
|
|
|
|
|
+ = iBuffer->getElementCount();
|
|
|
|
|
+
|
|
|
|
|
+ simpleBlockDescs[index].Triangles.Transform3x4
|
|
|
|
|
+ = customBlockMatrixBuffer->zBuffer()->GetGPUVirtualAddress()
|
|
|
|
|
+ + 12 * index * sizeof(float);
|
|
|
|
|
+ cbts[index] = block->zTexture()->zPolygonTexture(0)->getId();
|
|
|
|
|
+ indexOffsets[index] = mapping.indexBufferOffset;
|
|
|
|
|
+ ++index;
|
|
|
|
|
+ }
|
|
|
|
|
+ D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS prebuildDesc;
|
|
|
|
|
+ prebuildDesc.Type
|
|
|
|
|
+ = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
|
|
|
|
|
+ prebuildDesc.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
|
|
|
|
|
+ prebuildDesc.NumDescs = customBlocks.getEntryCount();
|
|
|
|
|
+ prebuildDesc.pGeometryDescs = simpleBlockDescs;
|
|
|
|
|
+ prebuildDesc.Flags
|
|
|
|
|
+ = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
|
|
|
|
|
+
|
|
|
|
|
+ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
|
|
|
|
|
+ zDevice->GetRaytracingAccelerationStructurePrebuildInfo(
|
|
|
|
|
+ &prebuildDesc, &info);
|
|
|
|
|
+
|
|
|
|
|
+ if (!customBlocksBlasScratchBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksBlasScratchBuffer = new DX12Buffer(1,
|
|
|
|
|
+ zDevice,
|
|
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zQueue->getThis()),
|
|
|
|
|
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!customBlocksBlasBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksBlasBuffer = new DX12Buffer(1,
|
|
|
|
|
+ zDevice,
|
|
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zQueue->getThis()),
|
|
|
|
|
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
|
|
|
|
+ }
|
|
|
|
|
+ customBlocksBlasScratchBuffer->setLength(
|
|
|
|
|
+ ROUND_UP_POWER_OF_2((int)info.ScratchDataSizeInBytes, 256));
|
|
|
|
|
+ customBlocksBlasScratchBuffer->createBufferWithoutData(
|
|
|
|
|
+ D3D12_RESOURCE_STATE_COMMON);
|
|
|
|
|
+ customBlocksBlasBuffer->setLength(
|
|
|
|
|
+ ROUND_UP_POWER_OF_2((int)info.ResultDataMaxSizeInBytes, 256));
|
|
|
|
|
+ customBlocksBlasBuffer->createBufferWithoutData(
|
|
|
|
|
+ D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE);
|
|
|
|
|
+
|
|
|
|
|
+ D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC buildDesc;
|
|
|
|
|
+ buildDesc.Inputs.Type
|
|
|
|
|
+ = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
|
|
|
|
|
+ buildDesc.Inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
|
|
|
|
|
+ buildDesc.Inputs.NumDescs = customBlocks.getEntryCount();
|
|
|
|
|
+ buildDesc.Inputs.pGeometryDescs = simpleBlockDescs;
|
|
|
|
|
+ buildDesc.DestAccelerationStructureData
|
|
|
|
|
+ = {customBlocksBlasBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
|
|
|
+ buildDesc.ScratchAccelerationStructureData = {
|
|
|
|
|
+ customBlocksBlasScratchBuffer->zBuffer()->GetGPUVirtualAddress()};
|
|
|
|
|
+ buildDesc.SourceAccelerationStructureData = 0;
|
|
|
|
|
+ buildDesc.Inputs.Flags
|
|
|
|
|
+ = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
|
|
|
|
|
+
|
|
|
|
|
+ zQueue->zCommandList()->BuildRaytracingAccelerationStructure(
|
|
|
|
|
+ &buildDesc, 0, nullptr);
|
|
|
|
|
+
|
|
|
|
|
+ if (!customBlockTextures)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlockTextures = new DX12Buffer(sizeof(int),
|
|
|
|
|
+ zDevice,
|
|
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zQueue->getThis()),
|
|
|
|
|
+ D3D12_RESOURCE_FLAG_NONE);
|
|
|
|
|
+ }
|
|
|
|
|
+ customBlockTextures->setLength(
|
|
|
|
|
+ sizeof(int) * customBlocks.getEntryCount());
|
|
|
|
|
+ customBlockTextures->setData(cbts, 1);
|
|
|
|
|
+ customBlockTextures->copyToGPU();
|
|
|
|
|
+
|
|
|
|
|
+ if (!customBlocksIndexOffsetBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksIndexOffsetBuffer = new DX12Buffer(sizeof(int),
|
|
|
|
|
+ zDevice,
|
|
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zQueue->getThis()),
|
|
|
|
|
+ D3D12_RESOURCE_FLAG_NONE);
|
|
|
|
|
+ }
|
|
|
|
|
+ customBlocksIndexOffsetBuffer->setLength(
|
|
|
|
|
+ sizeof(int) * customBlocks.getEntryCount());
|
|
|
|
|
+ customBlocksIndexOffsetBuffer->setData(indexOffsets, 1);
|
|
|
|
|
+ customBlocksIndexOffsetBuffer->copyToGPU();
|
|
|
|
|
+
|
|
|
|
|
+ if (!customBlocksVertexDataBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksVertexDataBuffer
|
|
|
|
|
+ = new DX12Buffer(sizeof(Framework::DX2VertexData),
|
|
|
|
|
+ zDevice,
|
|
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zQueue->getThis()),
|
|
|
|
|
+ D3D12_RESOURCE_FLAG_NONE);
|
|
|
|
|
+ }
|
|
|
|
|
+ customBlocksVertexDataBuffer->setLength(
|
|
|
|
|
+ sizeof(Framework::DX2VertexData) * vertexCount);
|
|
|
|
|
+ customBlocksVertexDataBuffer->setData(vertexDataBuffer, 1);
|
|
|
|
|
+ customBlocksVertexDataBuffer->copyToGPU();
|
|
|
|
|
+
|
|
|
|
|
+ if (!customBlocksCombinedIndexBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ customBlocksCombinedIndexBuffer = new DX12Buffer(sizeof(int),
|
|
|
|
|
+ zDevice,
|
|
|
|
|
+ dynamic_cast<DX12CommandQueue*>(zQueue->getThis()),
|
|
|
|
|
+ D3D12_RESOURCE_FLAG_NONE);
|
|
|
|
|
+ }
|
|
|
|
|
+ customBlocksCombinedIndexBuffer->setLength(sizeof(int) * indexCount);
|
|
|
|
|
+ customBlocksCombinedIndexBuffer->setData(combinedIndexBuffer, 1);
|
|
|
|
|
+ customBlocksCombinedIndexBuffer->copyToGPU();
|
|
|
|
|
+
|
|
|
|
|
+ delete[] cbts;
|
|
|
|
|
+ delete[] simpleBlockDescs;
|
|
|
|
|
+ delete[] vertexDataBuffer;
|
|
|
|
|
+ delete[] indexOffsets;
|
|
|
|
|
+ delete[] combinedIndexBuffer;
|
|
|
|
|
+ customBlocksChanged = 0;
|
|
|
|
|
+ customBufferChanged = 1;
|
|
|
|
|
+ }
|
|
|
if (changed)
|
|
if (changed)
|
|
|
{
|
|
{
|
|
|
for (int i = 0; i < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT; ++i)
|
|
for (int i = 0; i < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT; ++i)
|
|
@@ -334,21 +727,41 @@ int DX12ChunkData::getLastObjectIndex() const
|
|
|
return lastObjectIndex;
|
|
return lastObjectIndex;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+int DX12ChunkData::getLastCustomObjectIndex() const
|
|
|
|
|
+{
|
|
|
|
|
+ return lastCustomObjectIndex;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
int DX12ChunkData::getLastHitGroupIndex() const
|
|
int DX12ChunkData::getLastHitGroupIndex() const
|
|
|
{
|
|
{
|
|
|
return lastHitGroupIndex;
|
|
return lastHitGroupIndex;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+int DX12ChunkData::getLastCustomHitGroupIndex() const
|
|
|
|
|
+{
|
|
|
|
|
+ return lastCustomHitGroupIndex;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void DX12ChunkData::setLastObjectIndex(int index)
|
|
void DX12ChunkData::setLastObjectIndex(int index)
|
|
|
{
|
|
{
|
|
|
lastObjectIndex = index;
|
|
lastObjectIndex = index;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void DX12ChunkData::setLastCustomObjectIndex(int index)
|
|
|
|
|
+{
|
|
|
|
|
+ lastCustomObjectIndex = index;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void DX12ChunkData::setLastHitGroupIndex(int index)
|
|
void DX12ChunkData::setLastHitGroupIndex(int index)
|
|
|
{
|
|
{
|
|
|
lastHitGroupIndex = index;
|
|
lastHitGroupIndex = index;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void DX12ChunkData::setLastCustomHitGroupIndex(int index)
|
|
|
|
|
+{
|
|
|
|
|
+ lastCustomHitGroupIndex = index;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
bool DX12ChunkData::wasBufferChanged() const
|
|
bool DX12ChunkData::wasBufferChanged() const
|
|
|
{
|
|
{
|
|
|
return bufferChanged;
|
|
return bufferChanged;
|
|
@@ -358,3 +771,26 @@ void DX12ChunkData::setBufferChanged(bool changed)
|
|
|
{
|
|
{
|
|
|
bufferChanged = changed;
|
|
bufferChanged = changed;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+bool DX12ChunkData::isSimpleBlock(Block* zBlock) const
|
|
|
|
|
+{
|
|
|
|
|
+ return zBlock->zBlockType()->getModelInfo().getModelName().isEqual("cube")
|
|
|
|
|
+ || ((!zBlock->zModelData()->zSkeleton()
|
|
|
|
|
+ || zBlock->zModelData()->zSkeleton()->getNextBoneId() <= 1)
|
|
|
|
|
+ && zBlock->zModelData()->getPolygonCount() == 1);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool DX12ChunkData::hasCustomBlocks() const
|
|
|
|
|
+{
|
|
|
|
|
+ return customBlocks.getEntryCount() > 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool DX12ChunkData::wasCustomBufferChanged() const
|
|
|
|
|
+{
|
|
|
|
|
+ return customBufferChanged;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void DX12ChunkData::setCustomBufferChanged(bool changed)
|
|
|
|
|
+{
|
|
|
|
|
+ customBufferChanged = changed;
|
|
|
|
|
+}
|