mirror of
https://git.do.srb2.org/STJr/ZoneBuilder.git
synced 2025-02-21 11:21:26 +00:00
Fixed, Visual mode: texture offsets were updated multiple times when moving texture offsets of several extrafloor sides linked to the same control sidedef.
Fixed, Visual mode: sidedef geometry of sectors affected by "Copy Slope" effect was not updated when the source slope was modified.
This commit is contained in:
parent
228a71d477
commit
cb882a4340
4 changed files with 140 additions and 30 deletions
|
@ -1920,11 +1920,34 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
}
|
}
|
||||||
|
|
||||||
//mxd
|
//mxd
|
||||||
internal List<IVisualEventReceiver> RemoveDuplicateSidedefs(List<IVisualEventReceiver> objs)
|
private static IEnumerable<IVisualEventReceiver> RemoveDuplicateSidedefs(IEnumerable<IVisualEventReceiver> objs)
|
||||||
{
|
{
|
||||||
HashSet<Sidedef> processed = new HashSet<Sidedef>();
|
HashSet<Sidedef> processed = new HashSet<Sidedef>();
|
||||||
List<IVisualEventReceiver> result = new List<IVisualEventReceiver>();
|
List<IVisualEventReceiver> result = new List<IVisualEventReceiver>();
|
||||||
|
|
||||||
|
if(General.Map.UDMF)
|
||||||
|
{
|
||||||
|
// For UDMF maps, we only need to remove duplicate extrafloor sidedefs
|
||||||
|
foreach(IVisualEventReceiver i in objs)
|
||||||
|
{
|
||||||
|
if(i is VisualMiddle3D)
|
||||||
|
{
|
||||||
|
VisualMiddle3D vm = i as VisualMiddle3D;
|
||||||
|
if(!processed.Contains(vm.Sidedef))
|
||||||
|
{
|
||||||
|
processed.Add(vm.Sidedef);
|
||||||
|
result.Add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.Add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// For Doom/Hexen maps, we need to remove all duplicates
|
||||||
foreach(IVisualEventReceiver i in objs)
|
foreach(IVisualEventReceiver i in objs)
|
||||||
{
|
{
|
||||||
BaseVisualGeometrySidedef sidedef = i as BaseVisualGeometrySidedef;
|
BaseVisualGeometrySidedef sidedef = i as BaseVisualGeometrySidedef;
|
||||||
|
@ -1941,6 +1964,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
result.Add(i);
|
result.Add(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -2897,8 +2921,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
private void MoveTextureByOffset(int ox, int oy)
|
private void MoveTextureByOffset(int ox, int oy)
|
||||||
{
|
{
|
||||||
PreAction(UndoGroup.TextureOffsetChange);
|
PreAction(UndoGroup.TextureOffsetChange);
|
||||||
List<IVisualEventReceiver> objs = GetSelectedObjects(true, true, false, false);
|
IEnumerable<IVisualEventReceiver> objs = RemoveDuplicateSidedefs(GetSelectedObjects(true, true, false, false));
|
||||||
if(!General.Map.UDMF) objs = RemoveDuplicateSidedefs(objs);
|
|
||||||
foreach(IVisualEventReceiver i in objs) i.OnChangeTextureOffset(ox, oy, true);
|
foreach(IVisualEventReceiver i in objs) i.OnChangeTextureOffset(ox, oy, true);
|
||||||
PostAction();
|
PostAction();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#region === Copyright (c) 2010 Pascal van der Heiden ===
|
#region === Copyright (c) 2010 Pascal van der Heiden ===
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
using CodeImp.DoomBuilder.Geometry;
|
using CodeImp.DoomBuilder.Geometry;
|
||||||
using CodeImp.DoomBuilder.Map;
|
using CodeImp.DoomBuilder.Map;
|
||||||
|
|
||||||
|
@ -114,7 +115,40 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
//mxd. Update outer sidedef geometry
|
//mxd. Update outer sidedef geometry
|
||||||
if(updatesides)
|
if(updatesides)
|
||||||
{
|
{
|
||||||
foreach(Sidedef side in data.Sector.Sidedefs)
|
UpdateSectorSides(data.Sector);
|
||||||
|
|
||||||
|
// Update sectors with PlaneCopySlope Effect...
|
||||||
|
List<SectorData> toupdate = new List<SectorData>();
|
||||||
|
foreach(Sector s in data.UpdateAlso.Keys)
|
||||||
|
{
|
||||||
|
SectorData osd = data.Mode.GetSectorDataEx(s);
|
||||||
|
if(osd == null) continue;
|
||||||
|
foreach(SectorEffect e in osd.Effects)
|
||||||
|
{
|
||||||
|
if(e is EffectPlaneCopySlope)
|
||||||
|
{
|
||||||
|
toupdate.Add(osd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do it in 2 steps, because SectorData.Reset() may change SectorData.UpdateAlso collection...
|
||||||
|
foreach(SectorData sd in toupdate)
|
||||||
|
{
|
||||||
|
// Update PlaneCopySlope Effect...
|
||||||
|
sd.Reset(false);
|
||||||
|
|
||||||
|
// Update outer sides...
|
||||||
|
UpdateSectorSides(sd.Sector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//mxd
|
||||||
|
private void UpdateSectorSides(Sector s)
|
||||||
|
{
|
||||||
|
foreach(Sidedef side in s.Sidedefs)
|
||||||
{
|
{
|
||||||
if(side.Other != null && side.Other.Sector != null && data.Mode.VisualSectorExists(side.Other.Sector))
|
if(side.Other != null && side.Other.Sector != null && data.Mode.VisualSectorExists(side.Other.Sector))
|
||||||
{
|
{
|
||||||
|
@ -125,4 +159,3 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using CodeImp.DoomBuilder.Map;
|
using System.Collections.Generic;
|
||||||
|
using CodeImp.DoomBuilder.Map;
|
||||||
|
|
||||||
namespace CodeImp.DoomBuilder.BuilderModes
|
namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
{
|
{
|
||||||
|
@ -26,6 +27,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
{
|
{
|
||||||
Sector sourcesector = null;
|
Sector sourcesector = null;
|
||||||
SectorData sourcesectordata = null;
|
SectorData sourcesectordata = null;
|
||||||
|
bool updatesides = false;
|
||||||
|
|
||||||
// Copy slopes from tagged sectors
|
// Copy slopes from tagged sectors
|
||||||
//check which arguments we must use
|
//check which arguments we must use
|
||||||
|
@ -51,6 +53,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
|
|
||||||
data.Floor.plane = sourcesectordata.Floor.plane;
|
data.Floor.plane = sourcesectordata.Floor.plane;
|
||||||
sourcesectordata.AddUpdateSector(data.Sector, true);
|
sourcesectordata.AddUpdateSector(data.Sector, true);
|
||||||
|
|
||||||
|
updatesides = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,6 +81,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
|
|
||||||
data.Ceiling.plane = sourcesectordata.Ceiling.plane;
|
data.Ceiling.plane = sourcesectordata.Ceiling.plane;
|
||||||
sourcesectordata.AddUpdateSector(data.Sector, true);
|
sourcesectordata.AddUpdateSector(data.Sector, true);
|
||||||
|
|
||||||
|
updatesides = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -105,9 +111,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy slope across the line
|
// Copy slope across the line
|
||||||
if(!copyFloor && !copyCeiling) return;
|
if((copyFloor || copyCeiling) && linedef.Front != null && linedef.Back != null)
|
||||||
|
{
|
||||||
//get appropriate source sector data
|
// Get appropriate source sector data
|
||||||
sourcesectordata = data.Mode.GetSectorData(front ? linedef.Back.Sector : linedef.Front.Sector);
|
sourcesectordata = data.Mode.GetSectorData(front ? linedef.Back.Sector : linedef.Front.Sector);
|
||||||
if(!sourcesectordata.Updated) sourcesectordata.Update();
|
if(!sourcesectordata.Updated) sourcesectordata.Update();
|
||||||
|
|
||||||
|
@ -125,6 +131,53 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
sourcesectordata.AddUpdateSector(data.Sector, true);
|
sourcesectordata.AddUpdateSector(data.Sector, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updatesides = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update outer sidedef geometry
|
||||||
|
if(updatesides)
|
||||||
|
{
|
||||||
|
UpdateSectorSides(data.Sector);
|
||||||
|
|
||||||
|
// Update sectors with PlaneCopySlope Effect...
|
||||||
|
List<SectorData> toupdate = new List<SectorData>();
|
||||||
|
foreach(Sector s in data.UpdateAlso.Keys)
|
||||||
|
{
|
||||||
|
SectorData osd = data.Mode.GetSectorDataEx(s);
|
||||||
|
if(osd == null) continue;
|
||||||
|
foreach(SectorEffect e in osd.Effects)
|
||||||
|
{
|
||||||
|
if(e is EffectPlaneCopySlope)
|
||||||
|
{
|
||||||
|
toupdate.Add(osd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do it in 2 steps, because SectorData.Reset() may change SectorData.UpdateAlso collection...
|
||||||
|
foreach(SectorData sd in toupdate)
|
||||||
|
{
|
||||||
|
// Update PlaneCopySlope Effect...
|
||||||
|
sd.Reset(false);
|
||||||
|
|
||||||
|
// Update outer sides...
|
||||||
|
UpdateSectorSides(sd.Sector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//mxd
|
||||||
|
private void UpdateSectorSides(Sector s)
|
||||||
|
{
|
||||||
|
foreach(Sidedef side in s.Sidedefs)
|
||||||
|
{
|
||||||
|
if(side.Other != null && side.Other.Sector != null && data.Mode.VisualSectorExists(side.Other.Sector))
|
||||||
|
{
|
||||||
|
BaseVisualSector vs = (BaseVisualSector)data.Mode.GetVisualSector(side.Other.Sector);
|
||||||
|
vs.GetSidedefParts(side.Other).SetupAllParts();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
public bool CeilingChanged { get { return ceilingchanged; } set { ceilingchanged |= value; } }
|
public bool CeilingChanged { get { return ceilingchanged; } set { ceilingchanged |= value; } }
|
||||||
public List<SectorLevel> LightLevels { get { return lightlevels; } }
|
public List<SectorLevel> LightLevels { get { return lightlevels; } }
|
||||||
public List<Effect3DFloor> ExtraFloors { get { return extrafloors; } }
|
public List<Effect3DFloor> ExtraFloors { get { return extrafloors; } }
|
||||||
|
public List<SectorEffect> Effects { get { return alleffects; } } //mxd
|
||||||
public SectorLevel Floor { get { return floor; } }
|
public SectorLevel Floor { get { return floor; } }
|
||||||
public SectorLevel Ceiling { get { return ceiling; } }
|
public SectorLevel Ceiling { get { return ceiling; } }
|
||||||
public BaseVisualMode Mode { get { return mode; } }
|
public BaseVisualMode Mode { get { return mode; } }
|
||||||
|
|
Loading…
Reference in a new issue