From 4f4f074c3ffa11e5296b10ce7fc885eb05a330f8 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 31 Dec 2019 03:44:36 +0100 Subject: [PATCH] Fix geometry constantly being rebuilt in some situations --- Source/Core/VisualModes/VisualSector.cs | 12 ++++-- .../VisualModes/BaseVisualGeometrySector.cs | 33 +++++++++------- .../VisualModes/BaseVisualGeometrySidedef.cs | 39 +++++++++++-------- 3 files changed, 49 insertions(+), 35 deletions(-) diff --git a/Source/Core/VisualModes/VisualSector.cs b/Source/Core/VisualModes/VisualSector.cs index 1ed8f30..cb058ea 100644 --- a/Source/Core/VisualModes/VisualSector.cs +++ b/Source/Core/VisualModes/VisualSector.cs @@ -55,7 +55,11 @@ namespace CodeImp.DoomBuilder.VisualModes internal List FixedGeometry { get { return fixedgeometry; } } internal List AllGeometry { get { return allgeometry; } } internal VertexBuffer GeometryBuffer { get { return geobuffer; } } - internal bool NeedsUpdateGeo { get { return updategeo; } set { updategeo |= value; } } + internal bool NeedsUpdateGeo + { + get { return updategeo; } + set { updategeo |= value; } + } public bool IsDisposed { get { return isdisposed; } } public Sector Sector { get { return sector; } } @@ -107,7 +111,7 @@ namespace CodeImp.DoomBuilder.VisualModes // Trash geometry buffer if(geobuffer != null) geobuffer.Dispose(); geobuffer = null; - updategeo = true; + NeedsUpdateGeo = true; } // This is called resets when the device is reset @@ -169,7 +173,7 @@ namespace CodeImp.DoomBuilder.VisualModes /// public void AddGeometry(VisualGeometry geo) { - updategeo = true; + NeedsUpdateGeo = true; allgeometry.Add(geo); if(geo.Sidedef != null) { @@ -191,7 +195,7 @@ namespace CodeImp.DoomBuilder.VisualModes allgeometry.Clear(); fixedgeometry.Clear(); sidedefgeometry.Clear(); - updategeo = true; + NeedsUpdateGeo = true; } // This gets the geometry list for the specified sidedef diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs index ad31c64..b553434 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs @@ -44,11 +44,12 @@ namespace CodeImp.DoomBuilder.BuilderModes protected readonly BaseVisualMode mode; protected long setuponloadedtexture; + private long lastsetuponloadedtexture; - // This is only used to see if this object has already received a change - // in a multiselection. The Changed property on the BaseVisualSector is - // used to indicate a rebuild is needed. - protected bool changed; + // This is only used to see if this object has already received a change + // in a multiselection. The Changed property on the BaseVisualSector is + // used to indicate a rebuild is needed. + protected bool changed; protected SectorLevel level; protected Effect3DFloor extrafloor; @@ -610,17 +611,21 @@ namespace CodeImp.DoomBuilder.BuilderModes public virtual void OnProcess(long deltatime) { // If the texture was not loaded, but is loaded now, then re-setup geometry - if(setuponloadedtexture != 0) + if(setuponloadedtexture != lastsetuponloadedtexture) { - ImageData t = General.Map.Data.GetFlatImage(setuponloadedtexture); - if(t != null) - { - if(t.IsImageLoaded) - { - setuponloadedtexture = 0; - Setup(); - } - } + if (setuponloadedtexture != 0) + { + ImageData t = General.Map.Data.GetFlatImage(setuponloadedtexture); + if (t != null && t.IsImageLoaded) + { + lastsetuponloadedtexture = setuponloadedtexture; + Setup(); + } + } + else + { + lastsetuponloadedtexture = setuponloadedtexture; + } } } diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs index 3fba095..67deb01 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs @@ -48,9 +48,10 @@ namespace CodeImp.DoomBuilder.BuilderModes protected Plane top; protected Plane bottom; protected long setuponloadedtexture; - - // UV dragging - private float dragstartanglexy; + private long lastsetuponloadedtexture; + + // UV dragging + private float dragstartanglexy; private float dragstartanglez; private Vector3D dragorigin; private Vector3D deltaxy; @@ -834,20 +835,24 @@ namespace CodeImp.DoomBuilder.BuilderModes // Processing public virtual void OnProcess(long deltatime) { - // If the texture was not loaded, but is loaded now, then re-setup geometry - if(setuponloadedtexture != 0) - { - ImageData t = General.Map.Data.GetTextureImage(setuponloadedtexture); - if(t != null) - { - if(t.IsImageLoaded) - { - setuponloadedtexture = 0; - Setup(); - } - } - } - } + // If the texture was not loaded, but is loaded now, then re-setup geometry + if (setuponloadedtexture != lastsetuponloadedtexture) + { + if (setuponloadedtexture != 0) + { + ImageData t = General.Map.Data.GetTextureImage(setuponloadedtexture); + if (t != null && t.IsImageLoaded) + { + lastsetuponloadedtexture = setuponloadedtexture; + Setup(); + } + } + else + { + lastsetuponloadedtexture = setuponloadedtexture; + } + } + } // Change target height public virtual void OnChangeTargetHeight(int amount)