From 3f445182f3616d27634958530c2e68c219710933 Mon Sep 17 00:00:00 2001 From: dexy Date: Sun, 15 Dec 2019 15:40:00 +1100 Subject: [PATCH] Fix for add/remove entities not applying to world view --- CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs | 7 +++++-- Rendering/Renderer.cs | 11 +++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs index 43ea40e..9b232d1 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs @@ -62,8 +62,8 @@ namespace CodeWalker.GameFiles //fields used by the editor: public bool HasChanged { get; set; } = false; public List SaveWarnings = null; - - + public bool LodManagerUpdate = false; //forces the LOD manager to refresh this ymap when rendering + public YmapEntityDef[] LodManagerOldEntities = null; //when entities are removed, need the old ones to remove from lod manager public YmapFile() : base(null, GameFileType.Ymap) @@ -900,6 +900,7 @@ namespace CodeWalker.GameFiles } HasChanged = true; + LodManagerUpdate = true; } public bool RemoveEntity(YmapEntityDef ent) @@ -934,10 +935,12 @@ namespace CodeWalker.GameFiles res = false; } + LodManagerOldEntities = AllEntities; AllEntities = newAllEntities.ToArray(); RootEntities = newRootEntities.ToArray(); HasChanged = true; + LodManagerUpdate = true; return res; } diff --git a/Rendering/Renderer.cs b/Rendering/Renderer.cs index 3e45b8d..689e5ca 100644 --- a/Rendering/Renderer.cs +++ b/Rendering/Renderer.cs @@ -3589,7 +3589,7 @@ namespace CodeWalker.Rendering foreach (var kvp in CurrentYmaps) { YmapFile ymap = null; - if (!ymaps.TryGetValue(kvp.Key, out ymap) || (ymap != kvp.Value) || (ymap.IsScripted && !ShowScriptedYmaps)) + if (!ymaps.TryGetValue(kvp.Key, out ymap) || (ymap != kvp.Value) || (ymap.IsScripted && !ShowScriptedYmaps) || (ymap.LodManagerUpdate)) { RemoveYmaps.Add(kvp.Key); } @@ -3598,11 +3598,12 @@ namespace CodeWalker.Rendering { var ymap = CurrentYmaps[remYmap]; CurrentYmaps.Remove(remYmap); - if (ymap.AllEntities != null) // remove this ymap's entities from the tree..... + var remEnts = ymap.LodManagerOldEntities ?? ymap.AllEntities; + if (remEnts != null) // remove this ymap's entities from the tree..... { - for (int i = 0; i < ymap.AllEntities.Length; i++) + for (int i = 0; i < remEnts.Length; i++) { - var ent = ymap.AllEntities[i]; + var ent = remEnts[i]; RootEntities.Remove(ent); ent.LodManagerChildren?.Clear(); ent.LodManagerChildren = null; @@ -3613,6 +3614,8 @@ namespace CodeWalker.Rendering } } } + ymap.LodManagerUpdate = false; + ymap.LodManagerOldEntities = null; } foreach (var kvp in ymaps) {