From f95ffbe2999c26891324a302855e8c2cd132ef0b Mon Sep 17 00:00:00 2001 From: RaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Thu, 7 Sep 2023 20:22:21 +0200 Subject: [PATCH] WIP surface list for raytracing --- .../rendering/vulkan/accelstructs/vk_lightmap.cpp | 10 +++++----- src/common/rendering/vulkan/accelstructs/vk_lightmap.h | 4 ++-- src/common/rendering/vulkan/vk_renderdevice.cpp | 9 ++++++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp index 977a9f226..694235be7 100644 --- a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp +++ b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp @@ -30,7 +30,7 @@ VkLightmap::~VkLightmap() lights.Buffer->Unmap(); } -void VkLightmap::Raytrace(LevelMesh* level) +void VkLightmap::Raytrace(LevelMesh* level, const TArray& surfaces) { bool newLevel = (mesh != level); mesh = level; @@ -45,7 +45,7 @@ void VkLightmap::Raytrace(LevelMesh* level) for (size_t pageIndex = 0; pageIndex < atlasImages.size(); pageIndex++) { - RenderAtlasImage(pageIndex); + RenderAtlasImage(pageIndex, surfaces); } for (size_t pageIndex = 0; pageIndex < atlasImages.size(); pageIndex++) @@ -56,7 +56,7 @@ void VkLightmap::Raytrace(LevelMesh* level) } } -void VkLightmap::RenderAtlasImage(size_t pageIndex) +void VkLightmap::RenderAtlasImage(size_t pageIndex, const TArray& surfaces) { LightmapImage& img = atlasImages[pageIndex]; @@ -78,9 +78,9 @@ void VkLightmap::RenderAtlasImage(size_t pageIndex) cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, raytrace.pipelineLayout.get(), 1, raytrace.descriptorSet1.get()); } - for (int i = 0, count = mesh->GetSurfaceCount(); i < count; i++) + for (int i = 0, count = surfaces.Size(); i < count; i++) { - LevelMeshSurface* targetSurface = mesh->GetSurface(i); + LevelMeshSurface* targetSurface = surfaces[i]; if (targetSurface->lightmapperAtlasPage != pageIndex) continue; diff --git a/src/common/rendering/vulkan/accelstructs/vk_lightmap.h b/src/common/rendering/vulkan/accelstructs/vk_lightmap.h index 4e090f188..3fd8a0b8e 100644 --- a/src/common/rendering/vulkan/accelstructs/vk_lightmap.h +++ b/src/common/rendering/vulkan/accelstructs/vk_lightmap.h @@ -86,14 +86,14 @@ public: VkLightmap(VulkanRenderDevice* fb); ~VkLightmap(); - void Raytrace(LevelMesh* level); + void Raytrace(LevelMesh* level, const TArray& surfaces); private: void UpdateAccelStructDescriptors(); void UploadUniforms(); void CreateAtlasImages(); - void RenderAtlasImage(size_t pageIndex); + void RenderAtlasImage(size_t pageIndex, const TArray& surfaces); void ResolveAtlasImage(size_t pageIndex); void BlurAtlasImage(size_t pageIndex); void CopyAtlasImageResult(size_t pageIndex); diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 758f6525b..bfc6de8c1 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -540,8 +540,15 @@ void VulkanRenderDevice::SetLevelMesh(LevelMesh* mesh) mesh->UpdateLightLists(); + TArray surfaces; + surfaces.Reserve(mesh->GetSurfaceCount()); + for (unsigned i = 0, count = mesh->GetSurfaceCount(); i < count; ++i) + { + surfaces[i] = mesh->GetSurface(i); + } + GetTextureManager()->CreateLightmap(mesh->LMTextureSize, mesh->LMTextureCount); - GetLightmap()->Raytrace(mesh); + GetLightmap()->Raytrace(mesh, surfaces); } }