From 8515661b1a9f9b35e01c61003fbd7768cfd773b2 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 3 Sep 2023 06:28:41 +0200 Subject: [PATCH] Delay finding the light lists until after map has loaded --- .../rendering/hwrenderer/data/hw_levelmesh.h | 2 ++ .../rendering/vulkan/vk_renderdevice.cpp | 2 ++ src/rendering/hwrenderer/doom_levelmesh.cpp | 25 ++++++++++++++----- src/rendering/hwrenderer/doom_levelmesh.h | 2 ++ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 30c666330f..e837c2d119 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -169,6 +169,8 @@ public: virtual LevelMeshSurface* GetSurface(int index) { return nullptr; } virtual int GetSurfaceCount() { return 0; } + virtual void UpdateLightLists() { } + TArray SmoothingGroups; // TODO fill TArray Portals; // TODO fill diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 010ab4cec3..bd2ee3f648 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -540,6 +540,8 @@ void VulkanRenderDevice::SetLevelMesh(LevelMesh* mesh) { lastMesh = mesh; + mesh->UpdateLightLists(); + GetTextureManager()->CreateLightmap(mesh->LMTextureSize, mesh->LMTextureCount); GetLightmap()->Raytrace(mesh); } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 67ffb552ff..719ac4b968 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -85,6 +85,21 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals &doomMap) Collision = std::make_unique(MeshVertices.Data(), MeshVertices.Size(), MeshElements.Data(), MeshElements.Size()); } +void DoomLevelMesh::UpdateLightLists() +{ + for (auto& surface : Surfaces) + { + if (surface.Type == ST_FLOOR || surface.Type == ST_CEILING) + { + CreateLightList(&surface, surface.Subsector->section->lighthead, surface.Subsector->sector->PortalGroup); + } + else + { + CreateLightList(&surface, surface.Side->lighthead, surface.Side->sector->PortalGroup); + } + } +} + void DoomLevelMesh::BindLightmapSurfacesToGeometry(FLevelLocals& doomMap) { // Allocate room for all surfaces @@ -119,7 +134,6 @@ void DoomLevelMesh::BindLightmapSurfacesToGeometry(FLevelLocals& doomMap) } // Copy and build properties - size_t index = 0; for (auto& surface : Surfaces) { surface.TexCoords = (float*)&LightmapUvs[surface.startUvIndex]; @@ -160,8 +174,6 @@ void DoomLevelMesh::SetSubsectorLightmap(DoomLevelMeshSurface* surface) } } } - - CreateLightList(surface, surface->Subsector->section->lighthead, surface->Subsector->sector->PortalGroup); } void DoomLevelMesh::SetSideLightmap(DoomLevelMeshSurface* surface) @@ -193,12 +205,13 @@ void DoomLevelMesh::SetSideLightmap(DoomLevelMeshSurface* surface) } } } - - CreateLightList(surface, surface->Side->lighthead, surface->Side->sector->PortalGroup); } void DoomLevelMesh::CreateLightList(DoomLevelMeshSurface* surface, FLightNode* node, int portalgroup) { + surface->LightListBuffer.clear(); + surface->LightList.clear(); + while (node) { FDynamicLight* light = node->lightsource; @@ -206,7 +219,7 @@ void DoomLevelMesh::CreateLightList(DoomLevelMeshSurface* surface, FLightNode* n DVector3 pos = light->PosRelative(portalgroup); LevelMeshLight meshlight; - meshlight.Origin = { (float)pos.X, (float)pos.Z, (float)pos.Y }; + meshlight.Origin = { (float)pos.X, (float)pos.Y, (float)pos.Z }; meshlight.RelativeOrigin = meshlight.Origin; // ?? what is the difference between this and Origin? meshlight.Radius = (float)light->GetRadius(); meshlight.Intensity = 1.0f; diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 3aba68606a..96eda4ea92 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -37,6 +37,8 @@ public: return Surfaces[surfaceIndex].bSky; } + void UpdateLightLists() override; + LevelMeshSurface* GetSurface(int index) override { return &Surfaces[index]; } int GetSurfaceCount() override { return Surfaces.Size(); }