Fix geometry constantly being rebuilt in some situations

This commit is contained in:
Magnus Norddahl 2019-12-31 03:44:36 +01:00
parent 1e90500a3f
commit a18e165d99
3 changed files with 49 additions and 35 deletions

View file

@ -53,7 +53,11 @@ namespace CodeImp.DoomBuilder.VisualModes
internal List<VisualGeometry> FixedGeometry { get { return fixedgeometry; } }
internal List<VisualGeometry> 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; } }
@ -105,7 +109,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
@ -164,7 +168,7 @@ namespace CodeImp.DoomBuilder.VisualModes
/// </summary>
public void AddGeometry(VisualGeometry geo)
{
updategeo = true;
NeedsUpdateGeo = true;
allgeometry.Add(geo);
if(geo.Sidedef != null)
{
@ -186,7 +190,7 @@ namespace CodeImp.DoomBuilder.VisualModes
allgeometry.Clear();
fixedgeometry.Clear();
sidedefgeometry.Clear();
updategeo = true;
NeedsUpdateGeo = true;
}
// This gets the geometry list for the specified sidedef

View file

@ -45,11 +45,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;
@ -597,17 +598,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;
}
}
}

View file

@ -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;
@ -884,20 +885,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)