mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2025-01-31 04:40:55 +00:00
@ work in progress (do not use this revision for building/testing)
This commit is contained in:
parent
26739a7f2d
commit
ad05a43ade
16 changed files with 321 additions and 66 deletions
|
@ -8,6 +8,8 @@ ECHO. - Microsoft HTML Help compiler
|
|||
ECHO. - Inno Setup 5
|
||||
ECHO.
|
||||
ECHO. You have to commit your work before using this script.
|
||||
ECHO. Results will be in the 'Release' directory. Anything currently in
|
||||
ECHO. the 'Release' directory may be overwritten.
|
||||
ECHO.
|
||||
ECHO.
|
||||
PAUSE
|
||||
|
@ -87,14 +89,14 @@ GOTO LEAVE
|
|||
ECHO.
|
||||
ECHO. BUILD FAILED (Tool returned error)
|
||||
ECHO.
|
||||
PAUSE
|
||||
PAUSE > NUL
|
||||
GOTO LEAVE
|
||||
|
||||
:FILEFAIL
|
||||
ECHO.
|
||||
ECHO. BUILD FAILED (Output file was not built)
|
||||
ECHO.
|
||||
PAUSE
|
||||
PAUSE > NUL
|
||||
GOTO LEAVE
|
||||
|
||||
:LEAVE
|
||||
|
|
|
@ -323,6 +323,42 @@ namespace CodeImp.DoomBuilder.Editing
|
|||
}
|
||||
}
|
||||
|
||||
// This changes the description of previously made undo
|
||||
public void SetUndoDescription(int ticket, string description)
|
||||
{
|
||||
// Anything to undo?
|
||||
if(undos.Count > 0)
|
||||
{
|
||||
// Check if the ticket id matches
|
||||
if(ticket == undos[0].TicketID)
|
||||
{
|
||||
lock(undos)
|
||||
{
|
||||
undos[0].Description = description;
|
||||
}
|
||||
|
||||
// Update
|
||||
General.MainWindow.UpdateInterface();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This changes the grouping settings
|
||||
public void SetUndoGrouping(int ticket, UndoGroup group, int grouptag)
|
||||
{
|
||||
// Anything to undo?
|
||||
if(undos.Count > 0)
|
||||
{
|
||||
// Check if the ticket id matches
|
||||
if(ticket == undos[0].TicketID)
|
||||
{
|
||||
// Keep grouping info
|
||||
lastgroup = group;
|
||||
lastgrouptag = grouptag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This performs an undo
|
||||
[BeginAction("undo")]
|
||||
public void PerformUndo()
|
||||
|
|
|
@ -52,7 +52,7 @@ namespace CodeImp.DoomBuilder.Editing
|
|||
|
||||
#region ================== Properties
|
||||
|
||||
public string Description { get { return description; } }
|
||||
public string Description { get { return description; } set { description = value; } }
|
||||
public int TicketID { get { return ticketid; } }
|
||||
internal bool StoreOnDisk { get { return storeondisk; } set { storeondisk = value; } }
|
||||
public bool IsOnDisk { get { return isondisk; } }
|
||||
|
|
|
@ -131,6 +131,15 @@ namespace CodeImp.DoomBuilder.Rendering
|
|||
(float)b * BYTE_TO_FLOAT);
|
||||
}
|
||||
|
||||
// To ColorValue
|
||||
public Color4 ToColorValue(float withalpha)
|
||||
{
|
||||
return new Color4(withalpha,
|
||||
(float)r * BYTE_TO_FLOAT,
|
||||
(float)g * BYTE_TO_FLOAT,
|
||||
(float)b * BYTE_TO_FLOAT);
|
||||
}
|
||||
|
||||
// This returns a new PixelColor with adjusted alpha
|
||||
public PixelColor WithAlpha(byte a)
|
||||
{
|
||||
|
|
|
@ -514,6 +514,9 @@ namespace CodeImp.DoomBuilder.Rendering
|
|||
// This performs a single render pass
|
||||
private void RenderSinglePass(int pass)
|
||||
{
|
||||
int currentshaderpass = shaderpass;
|
||||
int highshaderpass = shaderpass + 2;
|
||||
|
||||
// Get geometry for this pass
|
||||
Dictionary<ImageData, BinaryHeap<VisualGeometry>> geopass = geometry[pass];
|
||||
|
||||
|
@ -569,27 +572,26 @@ namespace CodeImp.DoomBuilder.Rendering
|
|||
|
||||
if(sector != null)
|
||||
{
|
||||
// Highlight this object?
|
||||
if(g == highlighted)
|
||||
// Determine the shader pass we want to use for this object
|
||||
int wantedshaderpass = ((g == highlighted) || g.Selected) ? highshaderpass : shaderpass;
|
||||
|
||||
// Switch shader pass?
|
||||
if(currentshaderpass != wantedshaderpass)
|
||||
{
|
||||
// Temporarely switch shader and use a highlight color
|
||||
graphics.Shaders.World3D.EndPass();
|
||||
Color4 highlight = General.Colors.Highlight.ToColorValue();
|
||||
highlight.Alpha = highlightglow;
|
||||
graphics.Shaders.World3D.SetHighlightColor(highlight.ToArgb());
|
||||
graphics.Shaders.World3D.BeginPass(shaderpass + 2);
|
||||
graphics.Shaders.World3D.BeginPass(wantedshaderpass);
|
||||
currentshaderpass = wantedshaderpass;
|
||||
}
|
||||
|
||||
// Set the color to use
|
||||
Color4 highlightcolor = new Color4(0);
|
||||
if(g.Selected) highlightcolor = General.Colors.Selection.ToColorValue(highlightglow);
|
||||
if(g == highlighted) highlightcolor = Color4.Lerp(highlightcolor, General.Colors.Highlight.ToColorValue(), highlightglow);
|
||||
graphics.Shaders.World3D.SetHighlightColor(highlightcolor.ToArgb());
|
||||
graphics.Shaders.World3D.ApplySettings();
|
||||
|
||||
// Render!
|
||||
graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
|
||||
|
||||
// Reset highlight settings
|
||||
if(g == highlighted)
|
||||
{
|
||||
graphics.Shaders.World3D.EndPass();
|
||||
graphics.Shaders.World3D.SetHighlightColor(0);
|
||||
graphics.Shaders.World3D.BeginPass(shaderpass);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -634,17 +636,23 @@ namespace CodeImp.DoomBuilder.Rendering
|
|||
// Only do this sector when a vertexbuffer is created
|
||||
if(t.GeometryBuffer != null)
|
||||
{
|
||||
// Highlight this object?
|
||||
if(t == highlighted)
|
||||
// Determine the shader pass we want to use for this object
|
||||
int wantedshaderpass = ((t == highlighted) || t.Selected) ? highshaderpass : shaderpass;
|
||||
|
||||
// Switch shader pass?
|
||||
if(currentshaderpass != wantedshaderpass)
|
||||
{
|
||||
// Temporarely switch shader and use a highlight color
|
||||
graphics.Shaders.World3D.EndPass();
|
||||
Color4 highlight = General.Colors.Highlight.ToColorValue();
|
||||
highlight.Alpha = highlightglow;
|
||||
graphics.Shaders.World3D.SetHighlightColor(highlight.ToArgb());
|
||||
graphics.Shaders.World3D.BeginPass(shaderpass + 2);
|
||||
graphics.Shaders.World3D.BeginPass(wantedshaderpass);
|
||||
currentshaderpass = wantedshaderpass;
|
||||
}
|
||||
|
||||
// Set the color to use
|
||||
Color4 highlightcolor = new Color4(0);
|
||||
if(t.Selected) highlightcolor = General.Colors.Selection.ToColorValue(highlightglow);
|
||||
if(t == highlighted) highlightcolor = Color4.Lerp(highlightcolor, General.Colors.Highlight.ToColorValue(), highlightglow);
|
||||
graphics.Shaders.World3D.SetHighlightColor(highlightcolor.ToArgb());
|
||||
|
||||
// Create the matrix for positioning / rotation
|
||||
world = t.Orientation;
|
||||
if(t.Billboard) world = Matrix.Multiply(world, billboard);
|
||||
|
@ -657,14 +665,6 @@ namespace CodeImp.DoomBuilder.Rendering
|
|||
|
||||
// Render!
|
||||
graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, t.Triangles);
|
||||
|
||||
// Reset highlight settings
|
||||
if(t == highlighted)
|
||||
{
|
||||
graphics.Shaders.World3D.EndPass();
|
||||
graphics.Shaders.World3D.SetHighlightColor(0);
|
||||
graphics.Shaders.World3D.BeginPass(shaderpass);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@ namespace CodeImp.DoomBuilder.VisualModes
|
|||
{
|
||||
public interface IVisualPickable
|
||||
{
|
||||
bool Selected { get; set; }
|
||||
bool PickFastReject(Vector3D from, Vector3D to, Vector3D dir);
|
||||
bool PickAccurate(Vector3D from, Vector3D to, Vector3D dir, ref float u_ray);
|
||||
}
|
||||
|
|
|
@ -55,6 +55,9 @@ namespace CodeImp.DoomBuilder.VisualModes
|
|||
private PixelColor modulatecolor;
|
||||
private Color4 modcolor4;
|
||||
|
||||
// Selected?
|
||||
protected bool selected;
|
||||
|
||||
// Elements that this geometry is bound to
|
||||
// Only the sector is required, sidedef is only for walls
|
||||
private VisualSector sector;
|
||||
|
@ -112,6 +115,11 @@ namespace CodeImp.DoomBuilder.VisualModes
|
|||
/// </summary>
|
||||
public Sidedef Sidedef { get { return sidedef; } }
|
||||
|
||||
/// <summary>
|
||||
/// Selected or not? This is only used by the core to determine what color to draw it with.
|
||||
/// </summary>
|
||||
public bool Selected { get { return selected; } set { selected = value; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Constructor / Destructor
|
||||
|
|
|
@ -70,6 +70,9 @@ namespace CodeImp.DoomBuilder.VisualModes
|
|||
private float cameradistance;
|
||||
private int cagecolor;
|
||||
|
||||
// Selected?
|
||||
protected bool selected;
|
||||
|
||||
// Disposing
|
||||
private bool isdisposed = false;
|
||||
|
||||
|
@ -112,6 +115,11 @@ namespace CodeImp.DoomBuilder.VisualModes
|
|||
/// </summary>
|
||||
public bool IsDisposed { get { return isdisposed; } }
|
||||
|
||||
/// <summary>
|
||||
/// Selected or not? This is only used by the core to determine what color to draw it with.
|
||||
/// </summary>
|
||||
public bool Selected { get { return selected; } set { selected = value; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Constructor / Destructor
|
||||
|
|
|
@ -247,6 +247,7 @@
|
|||
<Compile Include="FindReplace\FindThingThingRef.cs" />
|
||||
<Compile Include="FindReplace\FindThingType.cs" />
|
||||
<Compile Include="FindReplace\FindVertexNumber.cs" />
|
||||
<Compile Include="VisualModes\VisualActionResult.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\ViewSelectionIndex.png" />
|
||||
|
|
|
@ -139,7 +139,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
// Mouse must be inside window
|
||||
if(!mouseinside) return;
|
||||
|
||||
General.Interface.DisplayStatus(StatusType.Action, "Places Visual Mode camera start thing.");
|
||||
General.Interface.DisplayStatus(StatusType.Action, "Placed Visual Mode camera start thing.");
|
||||
|
||||
// Go for all things
|
||||
List<Thing> things = new List<Thing>(General.Map.Map.Things);
|
||||
|
|
|
@ -48,11 +48,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
protected BaseVisualMode mode;
|
||||
protected long setuponloadedtexture;
|
||||
|
||||
// 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;
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Properties
|
||||
|
||||
new public BaseVisualSector Sector { get { return (BaseVisualSector)base.Sector; } }
|
||||
public bool Changed { get { return changed; } set { changed |= value; } }
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -75,7 +81,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
protected void UpdateSectorGeometry(bool includeneighbours)
|
||||
{
|
||||
// Rebuild sector
|
||||
Sector.Rebuild();
|
||||
Sector.Changed = true;
|
||||
|
||||
// Go for all things in this sector
|
||||
foreach(Thing t in General.Map.Map.Things)
|
||||
|
@ -86,7 +92,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
// Update thing
|
||||
BaseVisualThing vt = (mode.GetVisualThing(t) as BaseVisualThing);
|
||||
vt.Setup();
|
||||
vt.Changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -94,16 +100,14 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
if(includeneighbours)
|
||||
{
|
||||
// Also rebuild surrounding sectors, because outside sidedefs may need to be adjusted
|
||||
Dictionary<Sector, int> rebuilt = new Dictionary<Sector, int>();
|
||||
foreach(Sidedef sd in Sector.Sector.Sidedefs)
|
||||
{
|
||||
if((sd.Other != null) && !rebuilt.ContainsKey(sd.Other.Sector))
|
||||
if(sd.Other != null)
|
||||
{
|
||||
if(mode.VisualSectorExists(sd.Other.Sector))
|
||||
{
|
||||
BaseVisualSector bvs = (BaseVisualSector)mode.GetVisualSector(sd.Other.Sector);
|
||||
rebuilt.Add(sd.Other.Sector, 1);
|
||||
bvs.Rebuild();
|
||||
bvs.Changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -116,8 +120,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
// Unused
|
||||
public abstract bool Setup();
|
||||
public virtual void OnSelectBegin() { }
|
||||
public virtual void OnSelectEnd() { }
|
||||
public virtual void OnSelectBegin(){ }
|
||||
public virtual void OnEditBegin() { }
|
||||
public virtual void OnMouseMove(MouseEventArgs e) { }
|
||||
public virtual void OnChangeTextureOffset(int horizontal, int vertical) { }
|
||||
|
@ -131,6 +134,12 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
public virtual void OnDelete() { }
|
||||
protected virtual void SetTexture(string texturename) { }
|
||||
|
||||
// Select or deselect
|
||||
public virtual void OnSelectEnd()
|
||||
{
|
||||
this.selected = !this.selected;
|
||||
}
|
||||
|
||||
// Processing
|
||||
public virtual void OnProcess(double deltatime)
|
||||
{
|
||||
|
|
|
@ -129,7 +129,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
Sidedef.SetTextureMid(General.Settings.DefaultTexture);
|
||||
|
||||
// Update
|
||||
Sector.Rebuild();
|
||||
Sector.Changed = true;
|
||||
|
||||
// Other side as well
|
||||
if(string.IsNullOrEmpty(Sidedef.Other.MiddleTexture) || (Sidedef.Other.MiddleTexture[0] == '-'))
|
||||
|
@ -138,7 +138,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
// Update
|
||||
VisualSector othersector = mode.GetVisualSector(Sidedef.Other.Sector);
|
||||
if(othersector is BaseVisualSector) (othersector as BaseVisualSector).Rebuild();
|
||||
if(othersector is BaseVisualSector) (othersector as BaseVisualSector).Changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -152,7 +152,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
SetTexture("-");
|
||||
|
||||
// Update
|
||||
Sector.Rebuild();
|
||||
Sector.Changed = true;
|
||||
}
|
||||
|
||||
// Processing
|
||||
|
@ -435,11 +435,11 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
// Update sectors on both sides
|
||||
BaseVisualSector front = (BaseVisualSector)mode.GetVisualSector(Sidedef.Sector);
|
||||
if(front != null) front.Rebuild();
|
||||
if(front != null) front.Changed = true;
|
||||
if(Sidedef.Other != null)
|
||||
{
|
||||
BaseVisualSector back = (BaseVisualSector)mode.GetVisualSector(Sidedef.Other.Sector);
|
||||
if(back != null) back.Rebuild();
|
||||
if(back != null) back.Changed = true;
|
||||
}
|
||||
mode.ShowTargetInfo();
|
||||
}
|
||||
|
@ -471,6 +471,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
else
|
||||
{
|
||||
// Add/remove selection
|
||||
this.selected = !this.selected;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -485,7 +486,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
List<Linedef> lines = new List<Linedef>();
|
||||
lines.Add(this.Sidedef.Line);
|
||||
DialogResult result = General.Interface.ShowEditLinedefs(lines);
|
||||
if(result == DialogResult.OK) (this.Sector as BaseVisualSector).Rebuild();
|
||||
if(result == DialogResult.OK) (this.Sector as BaseVisualSector).Changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -567,7 +568,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
Sector.Sector.UpdateCache();
|
||||
|
||||
// Rebuild sector
|
||||
Sector.Rebuild();
|
||||
Sector.Changed = true;
|
||||
|
||||
// Go for all things in this sector
|
||||
foreach(Thing t in General.Map.Map.Things)
|
||||
|
@ -578,7 +579,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
// Update thing
|
||||
BaseVisualThing vt = (mode.GetVisualThing(t) as BaseVisualThing);
|
||||
vt.Setup();
|
||||
vt.Changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,13 +61,22 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
#region ================== Variables
|
||||
|
||||
// Gravity vector
|
||||
private Vector3D gravity;
|
||||
|
||||
// Object picking
|
||||
private VisualPickResult target;
|
||||
private double lastpicktime;
|
||||
private bool locktarget;
|
||||
|
||||
// Gravity vector
|
||||
private Vector3D gravity;
|
||||
// This is true when a selection was made because the action is performed
|
||||
// on an object that was not selected. In this case the previous selection
|
||||
// is cleared and the targeted object is temporarely selected to perform
|
||||
// the action on. After the action is completed, the object is deselected.
|
||||
private bool temporaryselection;
|
||||
|
||||
// Actions
|
||||
private int lastchangeoffsetticket;
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -75,6 +84,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
public IRenderer3D Renderer { get { return renderer; } }
|
||||
|
||||
public bool IsTemporarySelection { get { return temporaryselection; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Constructor / Disposer
|
||||
|
@ -106,6 +117,36 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
#region ================== Methods
|
||||
|
||||
// This is called before an action is performed
|
||||
private void PreAction(string multiundodescription)
|
||||
{
|
||||
int undogrouptag = 0;
|
||||
|
||||
PickTargetUnlocked();
|
||||
|
||||
// If the action is not performed on a selected object, clear the
|
||||
// current selection and make a temporary selection for the target.
|
||||
if(!target.picked.Selected)
|
||||
{
|
||||
temporaryselection = true;
|
||||
ClearSelection();
|
||||
target.picked.Selected = true;
|
||||
|
||||
if(target.picked is BaseVisualGeometrySector)
|
||||
undogrouptag = (target.picked as BaseVisualGeometrySector).Sector.Sector.FixedIndex;
|
||||
}
|
||||
|
||||
// Make an undo level
|
||||
//lastundoticket = General.Map.UndoRedo.CreateUndo(multiundodescription, undogroup, undogrouptag);
|
||||
}
|
||||
|
||||
// This is called after an action is performed
|
||||
private void PostAction(VisualActionResult result)
|
||||
{
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
// This creates a visual sector
|
||||
protected override VisualSector CreateVisualSector(Sector s)
|
||||
{
|
||||
|
@ -117,7 +158,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
protected override VisualThing CreateVisualThing(Thing t)
|
||||
{
|
||||
BaseVisualThing vt = new BaseVisualThing(this, t);
|
||||
if(vt.Setup()) return vt; else return null;
|
||||
return vt.Setup() ? vt : null;
|
||||
}
|
||||
|
||||
// This locks the target so that it isn't changed until unlocked
|
||||
|
@ -188,6 +229,22 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
}
|
||||
}
|
||||
|
||||
// This updates the VisualSectors and VisualThings that have their Changed property set
|
||||
private void UpdateChangedObjects()
|
||||
{
|
||||
foreach(KeyValuePair<Sector, VisualSector> vs in allsectors)
|
||||
{
|
||||
BaseVisualSector bvs = (BaseVisualSector)vs.Value;
|
||||
if(bvs.Changed) bvs.Rebuild();
|
||||
}
|
||||
|
||||
foreach(KeyValuePair<Thing, VisualThing> vt in allthings)
|
||||
{
|
||||
BaseVisualThing bvt = (BaseVisualThing)vt.Value;
|
||||
if(bvt.Changed) bvt.Setup();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Events
|
||||
|
@ -321,17 +378,44 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
#region ================== Actions
|
||||
|
||||
[BeginAction("clearselection", BaseAction = true)]
|
||||
public void ClearSelection()
|
||||
{
|
||||
foreach(KeyValuePair<Sector, VisualSector> vs in allsectors)
|
||||
{
|
||||
BaseVisualSector bvs = (BaseVisualSector)vs.Value;
|
||||
if(bvs.Floor != null) bvs.Floor.Selected = false;
|
||||
if(bvs.Ceiling != null) bvs.Ceiling.Selected = false;
|
||||
foreach(Sidedef sd in vs.Key.Sidedefs)
|
||||
{
|
||||
List<VisualGeometry> sidedefgeos = bvs.GetSidedefGeometry(sd);
|
||||
foreach(VisualGeometry sdg in sidedefgeos)
|
||||
{
|
||||
sdg.Selected = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach(KeyValuePair<Thing, VisualThing> vt in allthings)
|
||||
{
|
||||
BaseVisualThing bvt = (BaseVisualThing)vt.Value;
|
||||
bvt.Selected = false;
|
||||
}
|
||||
}
|
||||
|
||||
[BeginAction("visualselect", BaseAction = true)]
|
||||
public void BeginSelect()
|
||||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnSelectBegin();
|
||||
UpdateChangedObjects();
|
||||
}
|
||||
|
||||
[EndAction("visualselect", BaseAction = true)]
|
||||
public void EndSelect()
|
||||
{
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnSelectEnd();
|
||||
UpdateChangedObjects();
|
||||
}
|
||||
|
||||
[BeginAction("visualedit", BaseAction = true)]
|
||||
|
@ -339,12 +423,14 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnEditBegin();
|
||||
UpdateChangedObjects();
|
||||
}
|
||||
|
||||
[EndAction("visualedit", BaseAction = true)]
|
||||
public void EndEdit()
|
||||
{
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnEditEnd();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -353,6 +439,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTargetHeight(8);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -361,6 +448,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTargetHeight(-8);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -369,6 +457,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTargetHeight(1);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -377,6 +466,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTargetHeight(-1);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -392,6 +482,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTargetBrightness(true);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -400,6 +491,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTargetBrightness(false);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -408,6 +500,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTextureOffset(-1, 0);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -416,6 +509,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTextureOffset(1, 0);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -424,6 +518,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTextureOffset(0, -1);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -432,6 +527,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTextureOffset(0, 1);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -440,6 +536,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTextureOffset(-8, 0);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -448,6 +545,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTextureOffset(8, 0);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -456,6 +554,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTextureOffset(0, -8);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -464,6 +563,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnChangeTextureOffset(0, 8);
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -474,6 +574,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
renderer.SetCrosshairBusy(true);
|
||||
General.Interface.RedrawDisplay();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnSelectTexture();
|
||||
UpdateChangedObjects();
|
||||
renderer.SetCrosshairBusy(false);
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
@ -483,6 +584,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnCopyTexture();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -491,6 +593,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnPasteTexture();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -501,6 +604,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
renderer.SetCrosshairBusy(true);
|
||||
General.Interface.RedrawDisplay();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnTextureAlign(true, false);
|
||||
UpdateChangedObjects();
|
||||
renderer.SetCrosshairBusy(false);
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
@ -512,6 +616,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
renderer.SetCrosshairBusy(true);
|
||||
General.Interface.RedrawDisplay();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnTextureAlign(false, true);
|
||||
UpdateChangedObjects();
|
||||
renderer.SetCrosshairBusy(false);
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
@ -521,6 +626,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnToggleUpperUnpegged();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -529,6 +635,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnToggleLowerUnpegged();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -553,6 +660,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnResetTextureOffset();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -561,6 +669,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnTextureFloodfill();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -569,6 +678,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnCopyTextureOffsets();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -577,6 +687,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnPasteTextureOffsets();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -585,6 +696,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnCopyProperties();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -593,6 +705,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnPasteProperties();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -601,6 +714,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnInsert();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
@ -609,6 +723,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
{
|
||||
PickTargetUnlocked();
|
||||
if(target.picked != null) (target.picked as IVisualEventReceiver).OnDelete();
|
||||
UpdateChangedObjects();
|
||||
ShowTargetInfo();
|
||||
}
|
||||
|
||||
|
|
|
@ -50,12 +50,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
protected VisualCeiling ceiling;
|
||||
protected Dictionary<Sidedef, VisualSidedefParts> sides;
|
||||
|
||||
// If this is set to true, the sector will be rebuilt after the action is performed.
|
||||
protected bool changed;
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Properties
|
||||
|
||||
public VisualFloor Floor { get { return floor; } }
|
||||
public VisualCeiling Ceiling { get { return ceiling; } }
|
||||
public bool Changed { get { return changed; } set { changed |= value; } }
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -100,30 +104,34 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
base.ClearGeometry();
|
||||
|
||||
// Create floor
|
||||
floor = new VisualFloor(mode, this);
|
||||
if(floor == null) floor = new VisualFloor(mode, this);
|
||||
if(floor.Setup()) base.AddGeometry(floor);
|
||||
|
||||
// Create ceiling
|
||||
ceiling = new VisualCeiling(mode, this);
|
||||
if(ceiling == null) ceiling = new VisualCeiling(mode, this);
|
||||
if(ceiling.Setup()) base.AddGeometry(ceiling);
|
||||
|
||||
// Go for all sidedefs
|
||||
Dictionary<Sidedef, VisualSidedefParts> oldsides = sides ?? new Dictionary<Sidedef, VisualSidedefParts>(1);
|
||||
sides = new Dictionary<Sidedef, VisualSidedefParts>(base.Sector.Sidedefs.Count);
|
||||
foreach(Sidedef sd in base.Sector.Sidedefs)
|
||||
{
|
||||
// VisualSidedef already exists?
|
||||
VisualSidedefParts parts = oldsides.ContainsKey(sd) ? oldsides[sd] : new VisualSidedefParts();
|
||||
|
||||
// Doublesided or singlesided?
|
||||
if(sd.Other != null)
|
||||
{
|
||||
// Create upper part
|
||||
VisualUpper vu = new VisualUpper(mode, this, sd);
|
||||
VisualUpper vu = parts.upper ?? new VisualUpper(mode, this, sd);
|
||||
if(vu.Setup()) base.AddGeometry(vu);
|
||||
|
||||
// Create lower part
|
||||
VisualLower vl = new VisualLower(mode, this, sd);
|
||||
VisualLower vl = parts.lower ?? new VisualLower(mode, this, sd);
|
||||
if(vl.Setup()) base.AddGeometry(vl);
|
||||
|
||||
// Create middle part
|
||||
VisualMiddleDouble vm = new VisualMiddleDouble(mode, this, sd);
|
||||
VisualMiddleDouble vm = parts.middledouble ?? new VisualMiddleDouble(mode, this, sd);
|
||||
if(vm.Setup()) base.AddGeometry(vm);
|
||||
|
||||
// Store
|
||||
|
@ -132,13 +140,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
else
|
||||
{
|
||||
// Create middle part
|
||||
VisualMiddleSingle vm = new VisualMiddleSingle(mode, this, sd);
|
||||
VisualMiddleSingle vm = parts.middlesingle ?? new VisualMiddleSingle(mode, this, sd);
|
||||
if(vm.Setup()) base.AddGeometry(vm);
|
||||
|
||||
// Store
|
||||
sides.Add(sd, new VisualSidedefParts(vm));
|
||||
}
|
||||
}
|
||||
|
||||
// Done
|
||||
changed = false;
|
||||
}
|
||||
|
||||
// This returns the visual sidedef parts for a given sidedef
|
||||
|
|
|
@ -59,10 +59,15 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
// Undo/redo
|
||||
private int undoticket;
|
||||
|
||||
// If this is set to true, the thing will be rebuilt after the action is performed.
|
||||
protected bool changed;
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Properties
|
||||
|
||||
public bool Changed { get { return changed; } set { changed |= value; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Constructor / Setup
|
||||
|
@ -193,6 +198,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
boxp2 = new Vector3D(pos.x + info.Radius, pos.y + info.Radius, pos.z + info.Height);
|
||||
|
||||
// Done
|
||||
changed = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -348,7 +354,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
// Unused
|
||||
public virtual void OnSelectBegin() { }
|
||||
public virtual void OnSelectEnd() { }
|
||||
public virtual void OnEditBegin() { }
|
||||
public virtual void OnMouseMove(MouseEventArgs e) { }
|
||||
public virtual void OnChangeTargetBrightness(bool up) { }
|
||||
|
@ -370,6 +375,12 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
// Return texture name
|
||||
public virtual string GetTextureName() { return ""; }
|
||||
|
||||
// Select or deselect
|
||||
public virtual void OnSelectEnd()
|
||||
{
|
||||
this.selected = !this.selected;
|
||||
}
|
||||
|
||||
// Copy properties
|
||||
public virtual void OnCopyProperties()
|
||||
{
|
||||
|
@ -419,7 +430,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
|||
|
||||
General.Interface.DisplayStatus(StatusType.Action, "Changed thing height to " + Thing.Position.z + ".");
|
||||
|
||||
this.Setup();
|
||||
this.Changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
|
||||
#region ================== Copyright (c) 2007 Pascal vd Heiden
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
|
||||
* This program is released under GNU General Public License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Namespaces
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using CodeImp.DoomBuilder.Windows;
|
||||
using CodeImp.DoomBuilder.IO;
|
||||
using CodeImp.DoomBuilder.Map;
|
||||
using CodeImp.DoomBuilder.Rendering;
|
||||
using CodeImp.DoomBuilder.Geometry;
|
||||
using CodeImp.DoomBuilder.Editing;
|
||||
using CodeImp.DoomBuilder.VisualModes;
|
||||
|
||||
#endregion
|
||||
|
||||
namespace CodeImp.DoomBuilder.BuilderModes
|
||||
{
|
||||
internal struct VisualActionResult
|
||||
{
|
||||
public string displaystatus;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue