renamed MapManager to MapSet and added clone methods

This commit is contained in:
codeimp 2007-06-14 13:09:55 +00:00
parent da08ae2fa7
commit e222927480
7 changed files with 132 additions and 19 deletions

View file

@ -60,7 +60,7 @@
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Map\Linedef.cs" />
<Compile Include="Map\MapManager.cs" />
<Compile Include="Map\MapSet.cs" />
<Compile Include="Map\Sector.cs" />
<Compile Include="Map\Sidedef.cs" />
<Compile Include="Map\Thing.cs" />

View file

@ -28,7 +28,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Variables
// Map
private MapManager map;
private MapSet map;
// List items
private LinkedListNode<Linedef> mainlistitem;
@ -61,6 +61,8 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Properties
public Vertex Start { get { return start; } }
public Vertex End { get { return end; } }
public Sidedef Front { get { return front; } }
public Sidedef Back { get { return back; } }
public bool IsDisposed { get { return isdisposed; } }
@ -70,7 +72,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Constructor / Disposer
// Constructor
public Linedef(MapManager map, LinkedListNode<Linedef> listitem, Vertex start, Vertex end)
public Linedef(MapSet map, LinkedListNode<Linedef> listitem, Vertex start, Vertex end)
{
// Initialize
this.map = map;
@ -145,6 +147,16 @@ namespace CodeImp.DoomBuilder.Map
length = (float)Math.Sqrt(lengthsq);
//angle = delta.GetAngle();
}
// This copies all properties to another line
public void CopyPropertiesTo(Linedef l)
{
// Copy properties
l.action = action;
l.args = (byte[])args.Clone();
l.flags = flags;
l.tag = tag;
}
#endregion

View file

@ -19,7 +19,7 @@ using CodeImp.DoomBuilder.Geometry;
namespace CodeImp.DoomBuilder.Map
{
internal class MapManager : IDisposable
internal class MapSet : IDisposable
{
#region ================== Constants
@ -53,7 +53,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Constructor / Disposer
// Constructor for new empty map
public MapManager()
public MapSet()
{
// Initialize
vertices = new LinkedList<Vertex>();
@ -113,6 +113,73 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Management
// This makes a deep copy and returns a new MapSet
public MapSet Clone()
{
Dictionary<Vertex, Vertex> vertexlink = new Dictionary<Vertex,Vertex>(vertices.Count);
Dictionary<Linedef, Linedef> linedeflink = new Dictionary<Linedef, Linedef>(linedefs.Count);
Dictionary<Sector, Sector> sectorlink = new Dictionary<Sector, Sector>(sectors.Count);
// Create the map set
MapSet newset = new MapSet();
// Go for all vertices
foreach(Vertex v in vertices)
{
// Make new vertex
Vertex nv = newset.CreateVertex(v.Position);
vertexlink.Add(v, nv);
}
// Go for all linedefs
foreach(Linedef l in linedefs)
{
// Make new linedef
Linedef nl = newset.CreateLinedef(vertexlink[l.Start], vertexlink[l.End]);
linedeflink.Add(l, nl);
// Copy properties
l.CopyPropertiesTo(nl);
// Recalculate
l.Recalculate();
}
// Go for all sectors
foreach(Sector s in sectors)
{
// Make new sector
Sector ns = newset.CreateSector();
sectorlink.Add(s, ns);
// Copy properties
s.CopyPropertiesTo(ns);
}
// Go for all sidedefs
foreach(Sidedef d in sidedefs)
{
// Make new sidedef
Sidedef nd = newset.CreateSidedef(linedeflink[d.Line], d.IsFront, sectorlink[d.Sector]);
// Copy properties
d.CopyPropertiesTo(nd);
}
// Go for all things
foreach(Thing t in things)
{
// Make new thing
Thing nt = newset.CreateThing(t.Type, t.Position);
// Copy properties
t.CopyPropertiesTo(nt);
}
// Return the new set
return newset;
}
// This creates a new vertex
public Vertex CreateVertex(Vector2D pos)
{
@ -270,11 +337,11 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Tools
// This finds the line closest to the specified position
public Linedef NearestLinedef(Vector2D pos) { return MapManager.NearestLinedef(linedefs, pos); }
public Linedef NearestLinedef(Vector2D pos) { return MapSet.NearestLinedef(linedefs, pos); }
// This finds the vertex closest to the specified position
public Vertex NearestVertex(Vector2D pos) { return MapManager.NearestVertex(vertices, pos); }
public Vertex NearestVertex(Vector2D pos) { return MapSet.NearestVertex(vertices, pos); }
#endregion
}
}

View file

@ -15,7 +15,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Variables
// Map
private MapManager map;
private MapSet map;
// List items
private LinkedListNode<Sector> mainlistitem;
@ -49,7 +49,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Constructor / Disposer
// Constructor
public Sector(MapManager map, LinkedListNode<Sector> listitem)
public Sector(MapSet map, LinkedListNode<Sector> listitem)
{
// Initialize
this.map = map;
@ -119,6 +119,18 @@ namespace CodeImp.DoomBuilder.Map
// This detaches a thing
public void DetachThing(LinkedListNode<Thing> l) { if(!isdisposed) things.Remove(l); }
// This copies all properties to another sector
public void CopyPropertiesTo(Sector s)
{
// Copy properties
s.ceilheight = ceilheight;
s.ceiltexname = ceiltexname;
s.floorheight = floorheight;
s.floortexname = floortexname;
s.special = special;
s.tag = tag;
}
#endregion
}
}

View file

@ -15,7 +15,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Variables
// Map
private MapManager map;
private MapSet map;
// List items
private LinkedListNode<Sidedef> mainlistitem;
@ -41,6 +41,8 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Properties
public bool IsFront { get { return (this == linedef.Front); } }
public Linedef Line { get { return linedef; } }
public Sidedef Other { get { if(this == linedef.Front) return linedef.Back; else return linedef.Front; } }
public Sector Sector { get { return sector; } }
public bool IsDisposed { get { return isdisposed; } }
@ -50,7 +52,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Constructor / Disposer
// Constructor
public Sidedef(MapManager map, LinkedListNode<Sidedef> listitem, Linedef l, bool front, Sector s)
public Sidedef(MapSet map, LinkedListNode<Sidedef> listitem, Linedef l, bool front, Sector s)
{
// Initialize
this.map = map;
@ -97,8 +99,19 @@ namespace CodeImp.DoomBuilder.Map
#endregion
#region ================== Methods
#region ================== Management
// This copies all properties to another sidedef
public void CopyPropertiesTo(Sidedef s)
{
// Copy properties
s.offsetx = offsetx;
s.offsety = offsety;
s.texnamehigh = texnamehigh;
s.texnamelow = texnamelow;
s.texnamemid = texnamemid;
}
#endregion
}
}

View file

@ -16,7 +16,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Variables
// Map
private MapManager map;
private MapSet map;
// Sector
private Sector sector = null;
@ -37,7 +37,8 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Properties
// Disposing
public int Type { get { return type; } }
public Vector2D Position { get { return pos; } }
public bool IsDisposed { get { return isdisposed; } }
#endregion
@ -45,7 +46,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Constructor / Disposer
// Constructor
public Thing(MapManager map, LinkedListNode<Thing> listitem, int type, Vector2D pos)
public Thing(MapSet map, LinkedListNode<Thing> listitem, int type, Vector2D pos)
{
// Initialize
this.map = map;
@ -134,6 +135,14 @@ namespace CodeImp.DoomBuilder.Map
}
}
// This copies all properties to another thing
public void CopyPropertiesTo(Thing t)
{
// Copy properties
t.type = type;
t.angle = angle;
}
#endregion
}
}

View file

@ -28,7 +28,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Variables
// Map
private MapManager map;
private MapSet map;
// List items
private LinkedListNode<Vertex> mainlistitem;
@ -55,7 +55,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Constructor / Disposer
// Constructor
public Vertex(MapManager map, LinkedListNode<Vertex> listitem, Vector2D pos)
public Vertex(MapSet map, LinkedListNode<Vertex> listitem, Vector2D pos)
{
// Initialize
this.map = map;
@ -146,7 +146,7 @@ namespace CodeImp.DoomBuilder.Map
#region ================== Tools
// This finds the line closest to the specified position
public Linedef NearestLinedef(Vector2D pos) { return MapManager.NearestLinedef(linedefs, pos); }
public Linedef NearestLinedef(Vector2D pos) { return MapSet.NearestLinedef(linedefs, pos); }
#endregion
}