diff --git a/Source/Engine/Foliage/Foliage.cpp b/Source/Engine/Foliage/Foliage.cpp index a1cd046ae..c0e0b0b0e 100644 --- a/Source/Engine/Foliage/Foliage.cpp +++ b/Source/Engine/Foliage/Foliage.cpp @@ -993,6 +993,12 @@ void Foliage::RemoveAllInstances() RebuildClusters(); } +void Foliage::RemoveLightmap() +{ + for (auto& e : Instances) + e.RemoveLightmap(); +} + static float GlobalDensityScale = 1.0f; float Foliage::GetGlobalDensityScale() diff --git a/Source/Engine/Foliage/Foliage.h b/Source/Engine/Foliage/Foliage.h index f9055f377..1855e9914 100644 --- a/Source/Engine/Foliage/Foliage.h +++ b/Source/Engine/Foliage/Foliage.h @@ -139,6 +139,11 @@ public: /// API_FUNCTION() void RemoveAllInstances(); + /// + /// Removes the lightmap data from the foliage instances. + /// + API_FUNCTION() void RemoveLightmap(); + public: /// /// Gets the global density scale for all foliage instances. The default value is 1. Use values from range 0-1. Lower values decrease amount of foliage instances in-game. Use it to tweak game performance for slower devices. diff --git a/Source/Engine/Level/Scene/Scene.cpp b/Source/Engine/Level/Scene/Scene.cpp index 215153122..f60aa8d2f 100644 --- a/Source/Engine/Level/Scene/Scene.cpp +++ b/Source/Engine/Level/Scene/Scene.cpp @@ -7,6 +7,7 @@ #include "Engine/Content/Content.h" #include "Engine/Content/Deprecated.h" #include "Engine/Content/Factories/JsonAssetFactory.h" +#include "Engine/Foliage/Foliage.h" #include "Engine/Physics/Colliders/MeshCollider.h" #include "Engine/Level/Actors/StaticModel.h" #include "Engine/Level/ActorsCache.h" @@ -15,6 +16,7 @@ #include "Engine/Navigation/NavMesh.h" #include "Engine/Profiler/ProfilerCPU.h" #include "Engine/Serialization/Serialization.h" +#include "Engine/Terrain/Terrain.h" #if USE_EDITOR #include "Engine/Engine/Globals.h" #endif @@ -98,6 +100,19 @@ void Scene::SetLightmapSettings(const LightmapSettings& value) void Scene::ClearLightmaps() { LightmapsData.ClearLightmaps(); + + // Unlink any actors from lightmap + Function function = [this](Actor* actor) + { + if (auto* staticModel = Cast(actor)) + staticModel->RemoveLightmap(); + else if (auto* terrain = Cast(actor)) + terrain->RemoveLightmap(); + else if (auto* foliage = Cast(actor)) + foliage->RemoveLightmap(); + return true; + }; + TreeExecute(function); } void Scene::BuildCSG(float timeoutMs)