Remove the submesh class as that caused more problems than it solved
This commit is contained in:
parent
d9c896a903
commit
7bc2ed5436
20 changed files with 836 additions and 994 deletions
|
|
@ -92,7 +92,7 @@ void VkLevelMesh::CreateVulkanObjects()
|
|||
.AddMemory(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR | VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_SHADER_READ_BIT)
|
||||
.Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR);
|
||||
|
||||
CreateTopLevelAS();
|
||||
CreateTopLevelAS(DynamicBLAS.AccelStruct ? 2 : 1);
|
||||
|
||||
// Finish building the accel struct before using it from the shaders
|
||||
PipelineBarrier()
|
||||
|
|
@ -129,7 +129,8 @@ void VkLevelMesh::BeginFrame()
|
|||
deletelist->Add(std::move(TopLevelAS.TransferBuffer));
|
||||
deletelist->Add(std::move(TopLevelAS.InstanceBuffer));
|
||||
|
||||
DynamicBLAS = CreateBLAS(Mesh->DynamicMesh.get(), true, Mesh->StaticMesh->Mesh.Vertices.Size(), Mesh->StaticMesh->Mesh.Indexes.Size());
|
||||
if (Mesh->Mesh.DynamicIndexStart < (int)Mesh->Mesh.Indexes.Size())
|
||||
DynamicBLAS = CreateBLAS(true, Mesh->Mesh.DynamicIndexStart, Mesh->Mesh.Indexes.Size() - Mesh->Mesh.DynamicIndexStart);
|
||||
|
||||
CreateTLASInstanceBuffer();
|
||||
UploadTLASInstanceBuffer();
|
||||
|
|
@ -139,7 +140,7 @@ void VkLevelMesh::BeginFrame()
|
|||
.AddMemory(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR | VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_SHADER_READ_BIT)
|
||||
.Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR);
|
||||
|
||||
UpdateTopLevelAS();
|
||||
UpdateTopLevelAS(DynamicBLAS.AccelStruct ? 2 : 1);
|
||||
|
||||
// Finish building the accel struct before using it from the shaders
|
||||
PipelineBarrier()
|
||||
|
|
@ -161,36 +162,6 @@ void VkLevelMesh::UploadMeshes(bool dynamicOnly)
|
|||
uploader.Upload(dynamicOnly);
|
||||
}
|
||||
|
||||
int VkLevelMesh::GetMaxVertexBufferSize()
|
||||
{
|
||||
return Mesh->StaticMesh->Mesh.Vertices.Size() + MaxDynamicVertices;
|
||||
}
|
||||
|
||||
int VkLevelMesh::GetMaxIndexBufferSize()
|
||||
{
|
||||
return Mesh->StaticMesh->Mesh.Indexes.Size() + MaxDynamicIndexes;
|
||||
}
|
||||
|
||||
int VkLevelMesh::GetMaxNodeBufferSize()
|
||||
{
|
||||
return (int)Mesh->StaticMesh->Collision->get_nodes().size() + MaxDynamicNodes + 1; // + 1 for the merge root node
|
||||
}
|
||||
|
||||
int VkLevelMesh::GetMaxSurfaceBufferSize()
|
||||
{
|
||||
return Mesh->StaticMesh->GetSurfaceCount() + MaxDynamicSurfaces;
|
||||
}
|
||||
|
||||
int VkLevelMesh::GetMaxUniformsBufferSize()
|
||||
{
|
||||
return Mesh->StaticMesh->Mesh.Uniforms.Size() + MaxDynamicUniforms;
|
||||
}
|
||||
|
||||
int VkLevelMesh::GetMaxSurfaceIndexBufferSize()
|
||||
{
|
||||
return Mesh->StaticMesh->Mesh.SurfaceIndexes.Size() + MaxDynamicSurfaceIndexes;
|
||||
}
|
||||
|
||||
void VkLevelMesh::CreateBuffers()
|
||||
{
|
||||
VertexBuffer = BufferBuilder()
|
||||
|
|
@ -201,7 +172,7 @@ void VkLevelMesh::CreateBuffers()
|
|||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
|
||||
VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR : 0) |
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
|
||||
.Size(GetMaxVertexBufferSize() * sizeof(FFlatVertex))
|
||||
.Size(Mesh->Mesh.MaxVertices * sizeof(FFlatVertex))
|
||||
.DebugName("VertexBuffer")
|
||||
.Create(fb->GetDevice());
|
||||
|
||||
|
|
@ -209,7 +180,7 @@ void VkLevelMesh::CreateBuffers()
|
|||
.Usage(
|
||||
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_TRANSFER_DST_BIT)
|
||||
.Size(GetMaxVertexBufferSize() * sizeof(int))
|
||||
.Size(Mesh->Mesh.MaxVertices * sizeof(int))
|
||||
.DebugName("UniformIndexes")
|
||||
.Create(fb->GetDevice());
|
||||
|
||||
|
|
@ -221,31 +192,31 @@ void VkLevelMesh::CreateBuffers()
|
|||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
|
||||
VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR : 0) |
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
|
||||
.Size((size_t)GetMaxIndexBufferSize() * sizeof(uint32_t))
|
||||
.Size((size_t)Mesh->Mesh.MaxIndexes * sizeof(uint32_t))
|
||||
.DebugName("IndexBuffer")
|
||||
.Create(fb->GetDevice());
|
||||
|
||||
NodeBuffer = BufferBuilder()
|
||||
.Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)
|
||||
.Size(sizeof(CollisionNodeBufferHeader) + GetMaxNodeBufferSize() * sizeof(CollisionNode))
|
||||
.Size(sizeof(CollisionNodeBufferHeader) + Mesh->Mesh.MaxNodes * sizeof(CollisionNode))
|
||||
.DebugName("NodeBuffer")
|
||||
.Create(fb->GetDevice());
|
||||
|
||||
SurfaceIndexBuffer = BufferBuilder()
|
||||
.Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)
|
||||
.Size(GetMaxSurfaceIndexBufferSize() * sizeof(int))
|
||||
.Size(Mesh->Mesh.MaxSurfaceIndexes * sizeof(int))
|
||||
.DebugName("SurfaceBuffer")
|
||||
.Create(fb->GetDevice());
|
||||
|
||||
SurfaceBuffer = BufferBuilder()
|
||||
.Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)
|
||||
.Size(GetMaxSurfaceBufferSize() * sizeof(SurfaceInfo))
|
||||
.Size(Mesh->Mesh.MaxSurfaces * sizeof(SurfaceInfo))
|
||||
.DebugName("SurfaceBuffer")
|
||||
.Create(fb->GetDevice());
|
||||
|
||||
UniformsBuffer = BufferBuilder()
|
||||
.Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)
|
||||
.Size(GetMaxUniformsBufferSize() * sizeof(SurfaceUniforms))
|
||||
.Size(Mesh->Mesh.MaxUniforms * sizeof(SurfaceUniforms))
|
||||
.DebugName("SurfaceUniformsBuffer")
|
||||
.Create(fb->GetDevice());
|
||||
|
||||
|
|
@ -256,7 +227,7 @@ void VkLevelMesh::CreateBuffers()
|
|||
.Create(fb->GetDevice());
|
||||
}
|
||||
|
||||
VkLevelMesh::BLAS VkLevelMesh::CreateBLAS(LevelSubmesh* submesh, bool preferFastBuild, int vertexOffset, int indexOffset)
|
||||
VkLevelMesh::BLAS VkLevelMesh::CreateBLAS(bool preferFastBuild, int indexOffset, int indexCount)
|
||||
{
|
||||
BLAS blas;
|
||||
|
||||
|
|
@ -272,7 +243,7 @@ VkLevelMesh::BLAS VkLevelMesh::CreateBLAS(LevelSubmesh* submesh, bool preferFast
|
|||
accelStructBLDesc.geometry.triangles.vertexStride = sizeof(FFlatVertex);
|
||||
accelStructBLDesc.geometry.triangles.indexType = VK_INDEX_TYPE_UINT32;
|
||||
accelStructBLDesc.geometry.triangles.indexData.deviceAddress = IndexBuffer->GetDeviceAddress() + indexOffset * sizeof(uint32_t);
|
||||
accelStructBLDesc.geometry.triangles.maxVertex = vertexOffset + submesh->Mesh.Vertices.Size() - 1;
|
||||
accelStructBLDesc.geometry.triangles.maxVertex = Mesh->Mesh.Vertices.Size() - 1;
|
||||
|
||||
buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
|
||||
buildInfo.flags = preferFastBuild ? VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR : VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
|
||||
|
|
@ -280,7 +251,7 @@ VkLevelMesh::BLAS VkLevelMesh::CreateBLAS(LevelSubmesh* submesh, bool preferFast
|
|||
buildInfo.geometryCount = 1;
|
||||
buildInfo.ppGeometries = geometries;
|
||||
|
||||
uint32_t maxPrimitiveCount = submesh->Mesh.Indexes.Size() / 3;
|
||||
uint32_t maxPrimitiveCount = indexCount / 3;
|
||||
|
||||
VkAccelerationStructureBuildSizesInfoKHR sizeInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR };
|
||||
vkGetAccelerationStructureBuildSizesKHR(fb->GetDevice()->device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &buildInfo, &maxPrimitiveCount, &sizeInfo);
|
||||
|
|
@ -318,12 +289,13 @@ VkLevelMesh::BLAS VkLevelMesh::CreateBLAS(LevelSubmesh* submesh, bool preferFast
|
|||
|
||||
void VkLevelMesh::CreateStaticBLAS()
|
||||
{
|
||||
StaticBLAS = CreateBLAS(Mesh->StaticMesh.get(), false, 0, 0);
|
||||
StaticBLAS = CreateBLAS(false, 0, Mesh->Mesh.DynamicIndexStart);
|
||||
}
|
||||
|
||||
void VkLevelMesh::CreateDynamicBLAS()
|
||||
{
|
||||
DynamicBLAS = CreateBLAS(Mesh->DynamicMesh.get(), true, Mesh->StaticMesh->Mesh.Vertices.Size(), Mesh->StaticMesh->Mesh.Indexes.Size());
|
||||
if (Mesh->Mesh.DynamicIndexStart < (int)Mesh->Mesh.Indexes.Size())
|
||||
DynamicBLAS = CreateBLAS(true, Mesh->Mesh.DynamicIndexStart, Mesh->Mesh.Indexes.Size() - Mesh->Mesh.DynamicIndexStart);
|
||||
}
|
||||
|
||||
void VkLevelMesh::CreateTLASInstanceBuffer()
|
||||
|
|
@ -341,7 +313,7 @@ void VkLevelMesh::CreateTLASInstanceBuffer()
|
|||
.Create(fb->GetDevice());
|
||||
}
|
||||
|
||||
void VkLevelMesh::CreateTopLevelAS()
|
||||
void VkLevelMesh::CreateTopLevelAS(int instanceCount)
|
||||
{
|
||||
VkAccelerationStructureBuildGeometryInfoKHR buildInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR };
|
||||
VkAccelerationStructureGeometryKHR accelStructTLDesc = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR };
|
||||
|
|
@ -386,12 +358,12 @@ void VkLevelMesh::CreateTopLevelAS()
|
|||
|
||||
VkAccelerationStructureBuildRangeInfoKHR rangeInfo = {};
|
||||
VkAccelerationStructureBuildRangeInfoKHR* rangeInfos[] = { &rangeInfo };
|
||||
rangeInfo.primitiveCount = 2;
|
||||
rangeInfo.primitiveCount = instanceCount;
|
||||
|
||||
fb->GetCommands()->GetTransferCommands()->buildAccelerationStructures(1, &buildInfo, rangeInfos);
|
||||
}
|
||||
|
||||
void VkLevelMesh::UpdateTopLevelAS()
|
||||
void VkLevelMesh::UpdateTopLevelAS(int instanceCount)
|
||||
{
|
||||
VkAccelerationStructureBuildGeometryInfoKHR buildInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR };
|
||||
VkAccelerationStructureGeometryKHR accelStructTLDesc = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR };
|
||||
|
|
@ -412,7 +384,7 @@ void VkLevelMesh::UpdateTopLevelAS()
|
|||
|
||||
VkAccelerationStructureBuildRangeInfoKHR rangeInfo = {};
|
||||
VkAccelerationStructureBuildRangeInfoKHR* rangeInfos[] = { &rangeInfo };
|
||||
rangeInfo.primitiveCount = 2;
|
||||
rangeInfo.primitiveCount = instanceCount;
|
||||
|
||||
fb->GetCommands()->GetTransferCommands()->buildAccelerationStructures(1, &buildInfo, rangeInfos);
|
||||
}
|
||||
|
|
@ -427,12 +399,15 @@ void VkLevelMesh::UploadTLASInstanceBuffer()
|
|||
instances[0].flags = 0;
|
||||
instances[0].accelerationStructureReference = StaticBLAS.AccelStruct->GetDeviceAddress();
|
||||
|
||||
instances[1].transform.matrix[0][0] = 1.0f;
|
||||
instances[1].transform.matrix[1][1] = 1.0f;
|
||||
instances[1].transform.matrix[2][2] = 1.0f;
|
||||
instances[1].mask = 0xff;
|
||||
instances[1].flags = 0;
|
||||
instances[1].accelerationStructureReference = DynamicBLAS.AccelStruct->GetDeviceAddress();
|
||||
if (DynamicBLAS.AccelStruct)
|
||||
{
|
||||
instances[1].transform.matrix[0][0] = 1.0f;
|
||||
instances[1].transform.matrix[1][1] = 1.0f;
|
||||
instances[1].transform.matrix[2][2] = 1.0f;
|
||||
instances[1].mask = 0xff;
|
||||
instances[1].flags = 0;
|
||||
instances[1].accelerationStructureReference = DynamicBLAS.AccelStruct->GetDeviceAddress();
|
||||
}
|
||||
|
||||
auto data = (uint8_t*)TopLevelAS.TransferBuffer->Map(0, sizeof(VkAccelerationStructureInstanceKHR) * 2);
|
||||
memcpy(data, instances, sizeof(VkAccelerationStructureInstanceKHR) * 2);
|
||||
|
|
@ -450,7 +425,6 @@ VkLevelMeshUploader::VkLevelMeshUploader(VkLevelMesh* mesh) : Mesh(mesh)
|
|||
void VkLevelMeshUploader::Upload(bool dynamicOnly)
|
||||
{
|
||||
UpdateSizes();
|
||||
UpdateLocations();
|
||||
|
||||
start = dynamicOnly;
|
||||
end = locations.Size();
|
||||
|
|
@ -501,6 +475,7 @@ static FVector3 SwapYZ(const FVector3& v)
|
|||
|
||||
void VkLevelMeshUploader::UploadNodes()
|
||||
{
|
||||
#if 0
|
||||
// Copy node buffer header and create a root node that merges the static and dynamic AABB trees
|
||||
if (locations[1].Submesh->Collision->get_root() != -1)
|
||||
{
|
||||
|
|
@ -530,9 +505,10 @@ void VkLevelMeshUploader::UploadNodes()
|
|||
cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos + sizeof(CollisionNodeBufferHeader), sizeof(CollisionNodeBufferHeader) + nodesHeader.root * sizeof(CollisionNode), sizeof(CollisionNode));
|
||||
}
|
||||
else // second submesh is empty, just point the header at the first one
|
||||
#endif
|
||||
{
|
||||
CollisionNodeBufferHeader nodesHeader;
|
||||
nodesHeader.root = locations[0].Submesh->Collision->get_root();
|
||||
nodesHeader.root = Mesh->Mesh->Collision->get_root();
|
||||
|
||||
*((CollisionNodeBufferHeader*)(data + datapos)) = nodesHeader;
|
||||
cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, 0, sizeof(CollisionNodeBufferHeader));
|
||||
|
|
@ -543,10 +519,9 @@ void VkLevelMeshUploader::UploadNodes()
|
|||
for (unsigned int i = start; i < end; i++)
|
||||
{
|
||||
const SubmeshBufferLocation& cur = locations[i];
|
||||
auto submesh = cur.Submesh;
|
||||
|
||||
CollisionNode* nodes = (CollisionNode*)(data + datapos);
|
||||
for (auto& node : submesh->Collision->get_nodes())
|
||||
for (auto& node : Mesh->Mesh->Collision->get_nodes())
|
||||
{
|
||||
CollisionNode info;
|
||||
info.center = SwapYZ(node.aabb.Center);
|
||||
|
|
@ -557,7 +532,7 @@ void VkLevelMeshUploader::UploadNodes()
|
|||
*(nodes++) = info;
|
||||
}
|
||||
|
||||
size_t copysize = submesh->Collision->get_nodes().size() * sizeof(CollisionNode);
|
||||
size_t copysize = Mesh->Mesh->Collision->get_nodes().size() * sizeof(CollisionNode);
|
||||
if (copysize > 0)
|
||||
cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, sizeof(CollisionNodeBufferHeader) + cur.Node.Offset * sizeof(CollisionNode), copysize);
|
||||
datapos += copysize;
|
||||
|
|
@ -569,10 +544,9 @@ void VkLevelMeshUploader::UploadVertices()
|
|||
for (unsigned int i = start; i < end; i++)
|
||||
{
|
||||
const SubmeshBufferLocation& cur = locations[i];
|
||||
auto submesh = cur.Submesh;
|
||||
|
||||
size_t copysize = submesh->Mesh.Vertices.Size() * sizeof(FFlatVertex);
|
||||
memcpy(data + datapos, submesh->Mesh.Vertices.Data(), copysize);
|
||||
size_t copysize = Mesh->Mesh->Mesh.Vertices.Size() * sizeof(FFlatVertex);
|
||||
memcpy(data + datapos, Mesh->Mesh->Mesh.Vertices.Data(), copysize);
|
||||
if (copysize > 0)
|
||||
cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->VertexBuffer.get(), datapos, cur.Vertex.Offset * sizeof(FFlatVertex), copysize);
|
||||
datapos += copysize;
|
||||
|
|
@ -584,10 +558,9 @@ void VkLevelMeshUploader::UploadUniformIndexes()
|
|||
for (unsigned int i = start; i < end; i++)
|
||||
{
|
||||
const SubmeshBufferLocation& cur = locations[i];
|
||||
auto submesh = cur.Submesh;
|
||||
|
||||
size_t copysize = submesh->Mesh.UniformIndexes.Size() * sizeof(int);
|
||||
memcpy(data + datapos, submesh->Mesh.UniformIndexes.Data(), copysize);
|
||||
size_t copysize = Mesh->Mesh->Mesh.UniformIndexes.Size() * sizeof(int);
|
||||
memcpy(data + datapos, Mesh->Mesh->Mesh.UniformIndexes.Data(), copysize);
|
||||
if (copysize > 0)
|
||||
cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->UniformIndexBuffer.get(), datapos, cur.UniformIndexes.Offset * sizeof(int), copysize);
|
||||
datapos += copysize;
|
||||
|
|
@ -599,13 +572,12 @@ void VkLevelMeshUploader::UploadIndexes()
|
|||
for (unsigned int i = start; i < end; i++)
|
||||
{
|
||||
const SubmeshBufferLocation& cur = locations[i];
|
||||
auto submesh = cur.Submesh;
|
||||
|
||||
uint32_t* indexes = (uint32_t*)(data + datapos);
|
||||
for (int j = 0, count = submesh->Mesh.Indexes.Size(); j < count; ++j)
|
||||
*(indexes++) = cur.Vertex.Offset + submesh->Mesh.Indexes[j];
|
||||
for (int j = 0, count = Mesh->Mesh->Mesh.Indexes.Size(); j < count; ++j)
|
||||
*(indexes++) = cur.Vertex.Offset + Mesh->Mesh->Mesh.Indexes[j];
|
||||
|
||||
size_t copysize = submesh->Mesh.Indexes.Size() * sizeof(uint32_t);
|
||||
size_t copysize = Mesh->Mesh->Mesh.Indexes.Size() * sizeof(uint32_t);
|
||||
if (copysize > 0)
|
||||
cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->IndexBuffer.get(), datapos, cur.Index.Offset * sizeof(uint32_t), copysize);
|
||||
datapos += copysize;
|
||||
|
|
@ -617,13 +589,12 @@ void VkLevelMeshUploader::UploadSurfaceIndexes()
|
|||
for (unsigned int i = start; i < end; i++)
|
||||
{
|
||||
const SubmeshBufferLocation& cur = locations[i];
|
||||
auto submesh = cur.Submesh;
|
||||
|
||||
int* indexes = (int*)(data + datapos);
|
||||
for (int j = 0, count = submesh->Mesh.SurfaceIndexes.Size(); j < count; ++j)
|
||||
*(indexes++) = cur.SurfaceIndex.Offset + submesh->Mesh.SurfaceIndexes[j];
|
||||
for (int j = 0, count = Mesh->Mesh->Mesh.SurfaceIndexes.Size(); j < count; ++j)
|
||||
*(indexes++) = cur.SurfaceIndex.Offset + Mesh->Mesh->Mesh.SurfaceIndexes[j];
|
||||
|
||||
size_t copysize = submesh->Mesh.SurfaceIndexes.Size() * sizeof(int);
|
||||
size_t copysize = Mesh->Mesh->Mesh.SurfaceIndexes.Size() * sizeof(int);
|
||||
if (copysize > 0)
|
||||
cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->SurfaceIndexBuffer.get(), datapos, cur.SurfaceIndex.Offset * sizeof(int), copysize);
|
||||
datapos += copysize;
|
||||
|
|
@ -635,12 +606,11 @@ void VkLevelMeshUploader::UploadSurfaces()
|
|||
for (unsigned int i = start; i < end; i++)
|
||||
{
|
||||
const SubmeshBufferLocation& cur = locations[i];
|
||||
auto submesh = cur.Submesh;
|
||||
|
||||
SurfaceInfo* surfaces = (SurfaceInfo*)(data + datapos);
|
||||
for (int j = 0, count = submesh->GetSurfaceCount(); j < count; ++j)
|
||||
for (int j = 0, count = Mesh->Mesh->GetSurfaceCount(); j < count; ++j)
|
||||
{
|
||||
LevelMeshSurface* surface = submesh->GetSurface(j);
|
||||
LevelMeshSurface* surface = Mesh->Mesh->GetSurface(j);
|
||||
|
||||
SurfaceInfo info;
|
||||
info.Normal = FVector3(surface->Plane.X, surface->Plane.Z, surface->Plane.Y);
|
||||
|
|
@ -660,7 +630,7 @@ void VkLevelMeshUploader::UploadSurfaces()
|
|||
*(surfaces++) = info;
|
||||
}
|
||||
|
||||
size_t copysize = submesh->GetSurfaceCount() * sizeof(SurfaceInfo);
|
||||
size_t copysize = Mesh->Mesh->GetSurfaceCount() * sizeof(SurfaceInfo);
|
||||
if (copysize > 0)
|
||||
cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->SurfaceBuffer.get(), datapos, cur.Surface.Offset * sizeof(SurfaceInfo), copysize);
|
||||
datapos += copysize;
|
||||
|
|
@ -672,12 +642,11 @@ void VkLevelMeshUploader::UploadUniforms()
|
|||
for (unsigned int i = start; i < end; i++)
|
||||
{
|
||||
const SubmeshBufferLocation& cur = locations[i];
|
||||
auto submesh = cur.Submesh;
|
||||
|
||||
for (int j = 0, count = submesh->Mesh.Uniforms.Size(); j < count; j++)
|
||||
for (int j = 0, count = Mesh->Mesh->Mesh.Uniforms.Size(); j < count; j++)
|
||||
{
|
||||
auto& surfaceUniforms = submesh->Mesh.Uniforms[j];
|
||||
auto& material = submesh->Mesh.Materials[j];
|
||||
auto& surfaceUniforms = Mesh->Mesh->Mesh.Uniforms[j];
|
||||
auto& material = Mesh->Mesh->Mesh.Materials[j];
|
||||
if (material.mMaterial)
|
||||
{
|
||||
auto source = material.mMaterial->Source();
|
||||
|
|
@ -691,8 +660,8 @@ void VkLevelMeshUploader::UploadUniforms()
|
|||
}
|
||||
|
||||
SurfaceUniforms* uniforms = (SurfaceUniforms*)(data + datapos);
|
||||
size_t copysize = submesh->Mesh.Uniforms.Size() * sizeof(SurfaceUniforms);
|
||||
memcpy(uniforms, submesh->Mesh.Uniforms.Data(), copysize);
|
||||
size_t copysize = Mesh->Mesh->Mesh.Uniforms.Size() * sizeof(SurfaceUniforms);
|
||||
memcpy(uniforms, Mesh->Mesh->Mesh.Uniforms.Data(), copysize);
|
||||
if (copysize > 0)
|
||||
cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->UniformsBuffer.get(), datapos, cur.Uniforms.Offset * sizeof(SurfaceUniforms), copysize);
|
||||
datapos += copysize;
|
||||
|
|
@ -720,47 +689,15 @@ void VkLevelMeshUploader::UploadPortals()
|
|||
|
||||
void VkLevelMeshUploader::UpdateSizes()
|
||||
{
|
||||
for (LevelSubmesh* submesh : { Mesh->GetMesh()->StaticMesh.get(), Mesh->GetMesh()->DynamicMesh.get() })
|
||||
{
|
||||
SubmeshBufferLocation location;
|
||||
location.Submesh = submesh;
|
||||
location.Vertex.Size = submesh->Mesh.Vertices.Size();
|
||||
location.Index.Size = submesh->Mesh.Indexes.Size();
|
||||
location.Node.Size = (int)submesh->Collision->get_nodes().size();
|
||||
location.SurfaceIndex.Size = submesh->Mesh.SurfaceIndexes.Size();
|
||||
location.Surface.Size = submesh->GetSurfaceCount();
|
||||
location.UniformIndexes.Size = submesh->Mesh.UniformIndexes.Size();
|
||||
location.Uniforms.Size = submesh->Mesh.Uniforms.Size();
|
||||
locations.Push(location);
|
||||
}
|
||||
}
|
||||
|
||||
void VkLevelMeshUploader::UpdateLocations()
|
||||
{
|
||||
for (unsigned int i = 1, count = locations.Size(); i < count; i++)
|
||||
{
|
||||
const SubmeshBufferLocation& prev = locations[i - 1];
|
||||
SubmeshBufferLocation& cur = locations[i];
|
||||
cur.Vertex.Offset = prev.Vertex.Offset + prev.Vertex.Size;
|
||||
cur.Index.Offset = prev.Index.Offset + prev.Index.Size;
|
||||
cur.Node.Offset = prev.Node.Offset + prev.Node.Size;
|
||||
cur.SurfaceIndex.Offset = prev.SurfaceIndex.Offset + prev.SurfaceIndex.Size;
|
||||
cur.Surface.Offset = prev.Surface.Offset + prev.Surface.Size;
|
||||
cur.UniformIndexes.Offset = prev.UniformIndexes.Offset + prev.UniformIndexes.Size;
|
||||
cur.Uniforms.Offset = prev.Uniforms.Offset + prev.Uniforms.Size;
|
||||
|
||||
if (
|
||||
cur.Vertex.Offset + cur.Vertex.Size > Mesh->GetMaxVertexBufferSize() ||
|
||||
cur.Index.Offset + cur.Index.Size > Mesh->GetMaxIndexBufferSize() ||
|
||||
cur.Node.Offset + cur.Node.Size > Mesh->GetMaxNodeBufferSize() ||
|
||||
cur.SurfaceIndex.Offset + cur.SurfaceIndex.Size > Mesh->GetMaxSurfaceIndexBufferSize() ||
|
||||
cur.Surface.Offset + cur.Surface.Size > Mesh->GetMaxSurfaceBufferSize() ||
|
||||
cur.UniformIndexes.Offset + cur.UniformIndexes.Size > Mesh->GetMaxVertexBufferSize() ||
|
||||
cur.Uniforms.Offset + cur.Uniforms.Size > Mesh->GetMaxUniformsBufferSize())
|
||||
{
|
||||
I_FatalError("Dynamic accel struct buffers are too small!");
|
||||
}
|
||||
}
|
||||
SubmeshBufferLocation location;
|
||||
location.Vertex.Size = Mesh->Mesh->Mesh.Vertices.Size();
|
||||
location.Index.Size = Mesh->Mesh->Mesh.Indexes.Size();
|
||||
location.Node.Size = (int)Mesh->Mesh->Collision->get_nodes().size();
|
||||
location.SurfaceIndex.Size = Mesh->Mesh->Mesh.SurfaceIndexes.Size();
|
||||
location.Surface.Size = Mesh->Mesh->GetSurfaceCount();
|
||||
location.UniformIndexes.Size = Mesh->Mesh->Mesh.UniformIndexes.Size();
|
||||
location.Uniforms.Size = Mesh->Mesh->Mesh.Uniforms.Size();
|
||||
locations.Push(location);
|
||||
}
|
||||
|
||||
size_t VkLevelMeshUploader::GetTransferSize()
|
||||
|
|
@ -770,13 +707,13 @@ size_t VkLevelMeshUploader::GetTransferSize()
|
|||
for (unsigned int i = start; i < end; i++)
|
||||
{
|
||||
const SubmeshBufferLocation& cur = locations[i];
|
||||
transferBufferSize += cur.Submesh->Mesh.Vertices.Size() * sizeof(FFlatVertex);
|
||||
transferBufferSize += cur.Submesh->Mesh.UniformIndexes.Size() * sizeof(int);
|
||||
transferBufferSize += cur.Submesh->Mesh.Indexes.Size() * sizeof(uint32_t);
|
||||
transferBufferSize += cur.Submesh->Collision->get_nodes().size() * sizeof(CollisionNode);
|
||||
transferBufferSize += cur.Submesh->Mesh.SurfaceIndexes.Size() * sizeof(int);
|
||||
transferBufferSize += cur.Submesh->GetSurfaceCount() * sizeof(SurfaceInfo);
|
||||
transferBufferSize += cur.Submesh->Mesh.Uniforms.Size() * sizeof(SurfaceUniforms);
|
||||
transferBufferSize += Mesh->Mesh->Mesh.Vertices.Size() * sizeof(FFlatVertex);
|
||||
transferBufferSize += Mesh->Mesh->Mesh.UniformIndexes.Size() * sizeof(int);
|
||||
transferBufferSize += Mesh->Mesh->Mesh.Indexes.Size() * sizeof(uint32_t);
|
||||
transferBufferSize += Mesh->Mesh->Collision->get_nodes().size() * sizeof(CollisionNode);
|
||||
transferBufferSize += Mesh->Mesh->Mesh.SurfaceIndexes.Size() * sizeof(int);
|
||||
transferBufferSize += Mesh->Mesh->GetSurfaceCount() * sizeof(SurfaceInfo);
|
||||
transferBufferSize += Mesh->Mesh->Mesh.Uniforms.Size() * sizeof(SurfaceUniforms);
|
||||
}
|
||||
if (start == 0)
|
||||
transferBufferSize += Mesh->GetMesh()->Portals.Size() * sizeof(PortalInfo);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue