diff --git a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp index 259adc131d..86790ae845 100644 --- a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp +++ b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp @@ -31,7 +31,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; @@ -46,7 +46,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++) @@ -57,7 +57,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]; @@ -79,9 +79,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 4e090f1889..3fd8a0b8e2 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 bd2ee3f648..7fd2f49e5b 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -542,8 +542,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); } }