diff --git a/Source/Core/GZBuilder/Controls/AngleControl.cs b/Source/Core/GZBuilder/Controls/AngleControl.cs index 6a98c1de..6aed9933 100644 --- a/Source/Core/GZBuilder/Controls/AngleControl.cs +++ b/Source/Core/GZBuilder/Controls/AngleControl.cs @@ -19,6 +19,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls #region Variables private int angle; + private int angleoffset; private Rectangle drawRegion; private const int drawOffset = 2; @@ -37,7 +38,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls public delegate void AngleChangedDelegate(); public event AngleChangedDelegate AngleChanged; - public int Angle { get { return angle; } set { angle = value; this.Refresh(); } } + public int Angle { get { return angle - angleoffset; } set { angle = value + angleoffset; this.Refresh(); } } + public int AngleOffset { get { return angleoffset; } set { angleoffset = value; this.Refresh(); } } #endregion @@ -146,8 +148,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls if(thisAngle == 360) thisAngle = 0; } - if(thisAngle != this.Angle) { - this.Angle = thisAngle; + if(thisAngle != angle) { + angle = thisAngle; if(!this.DesignMode && AngleChanged != null) AngleChanged(); //Raise event this.Refresh(); } @@ -163,8 +165,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls if(thisAngle == 360) thisAngle = 0; } - if(thisAngle != this.Angle) { - this.Angle = thisAngle; + if(thisAngle != angle) { + angle = thisAngle; if(!this.DesignMode && AngleChanged != null) AngleChanged(); //Raise event this.Refresh(); } diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs index 72ba63ed..f3698dbd 100644 --- a/Source/Core/Windows/MainForm.cs +++ b/Source/Core/Windows/MainForm.cs @@ -3363,7 +3363,13 @@ namespace CodeImp.DoomBuilder.Windows //mxd private void EditForm_OnValuesChanged(object sender, EventArgs e) { - if(OnEditFormValuesChanged != null) OnEditFormValuesChanged(sender, e); + if (OnEditFormValuesChanged != null) { + OnEditFormValuesChanged(sender, e); + } else { + //If current mode doesn't handle this event, let's at least update the map and redraw display. + General.Map.Map.Update(); + RedrawDisplay(); + } } #endregion diff --git a/Source/Core/Windows/ThingEditForm.cs b/Source/Core/Windows/ThingEditForm.cs index 3286f351..1037f9e4 100644 --- a/Source/Core/Windows/ThingEditForm.cs +++ b/Source/Core/Windows/ThingEditForm.cs @@ -48,8 +48,6 @@ namespace CodeImp.DoomBuilder.Windows private ThingTypeInfo thinginfo; private bool preventchanges; //mxd - private Vector3D initialPosition; //initial position of a thing used to fill posX, posY and posZ fields - private int initialFloorHeight; //floor height of the sector first thing is in private static bool useAbsoluteHeight; private List thingProps; //mxd @@ -59,7 +57,7 @@ namespace CodeImp.DoomBuilder.Windows private struct ThingProperties //mxd { - public readonly int Type; + //public readonly int Type; public readonly int AngleDoom; public readonly float X; public readonly float Y; @@ -70,7 +68,7 @@ namespace CodeImp.DoomBuilder.Windows X = t.Position.x; Y = t.Position.y; Z = t.Position.z; - Type = t.Type; + //Type = t.Type; AngleDoom = t.AngleDoom; } } @@ -167,12 +165,11 @@ namespace CodeImp.DoomBuilder.Windows cbAbsoluteHeight.Checked = useAbsoluteHeight; //mxd //mxd - initialPosition = ft.Position; - if (ft.Sector != null) - initialFloorHeight = ft.Sector.FloorHeight; + ft.DetermineSector(); + int floorheight = (ft.Sector != null ? ft.Sector.FloorHeight :0); posX.Text = ((int)ft.Position.x).ToString(); posY.Text = ((int)ft.Position.y).ToString(); - posZ.Text = useAbsoluteHeight ? ((int)ft.Position.z + initialFloorHeight).ToString() : ((int)ft.Position.z).ToString(); + posZ.Text = useAbsoluteHeight ? ((int)ft.Position.z + floorheight).ToString() : ((int)ft.Position.z).ToString(); posX.ButtonStep = General.Map.Grid.GridSize; posY.ButtonStep = General.Map.Grid.GridSize; posZ.ButtonStep = General.Map.Grid.GridSize; @@ -198,6 +195,9 @@ namespace CodeImp.DoomBuilder.Windows // Go for all things foreach(Thing t in things) { + //mxd. Update sector info + t.DetermineSector(); + // Type does not match? ThingTypeInfo info = thingtype.GetSelectedInfo(); //mxd @@ -218,7 +218,9 @@ namespace CodeImp.DoomBuilder.Windows // Coordination if(t.AngleDoom.ToString() != angle.Text) angle.Text = ""; - //mxd + //mxd. Position + if(((int)t.Position.x).ToString() != posX.Text) posX.Text = ""; + if(((int)t.Position.y).ToString() != posY.Text) posY.Text = ""; if (useAbsoluteHeight && t.Sector != null) { if(((int)t.Position.z + t.Sector.FloorHeight).ToString() != posZ.Text) posZ.Text = ""; } else if(((int)t.Position.z).ToString() != posZ.Text){ @@ -465,9 +467,28 @@ namespace CodeImp.DoomBuilder.Windows //mxd private void cbAbsoluteHeight_CheckedChanged(object sender, EventArgs e) { + if(preventchanges) return; useAbsoluteHeight = cbAbsoluteHeight.Checked; - zlabel.Text = useAbsoluteHeight ? "Abs. Z:" : "Z:"; - posZ.Text = (useAbsoluteHeight ? initialFloorHeight + initialPosition.z : initialPosition.z).ToString(); + zlabel.Text = (useAbsoluteHeight ? "Abs. Z:" : "Z:"); + + preventchanges = true; + + //update label text + Thing ft = General.GetByIndex(things, 0); + float z = ft.Position.z; + if(useAbsoluteHeight && ft.Sector != null) z += ft.Sector.FloorHeight; + posZ.Text = z.ToString(); + + foreach(Thing t in things) { + z = t.Position.z; + if(useAbsoluteHeight && t.Sector != null) z += t.Sector.FloorHeight; + if (posZ.Text != z.ToString()) { + posZ.Text = ""; + break; + } + } + + preventchanges = false; } //mxd @@ -501,18 +522,9 @@ namespace CodeImp.DoomBuilder.Windows if(preventchanges) return; int i = 0; - //restore values - if(string.IsNullOrEmpty(posX.Text)) { - // Apply position - foreach(Thing t in things) - t.Move(new Vector2D(thingProps[i++].X, t.Position.y)); - } else { //update values - float delta = posX.GetResultFloat(initialPosition.x) - initialPosition.x; - - // Apply position - foreach(Thing t in things) - t.Move(new Vector2D(thingProps[i++].X + delta, t.Position.y)); - } + // Update values + foreach(Thing t in things) + t.Move(new Vector2D(posX.GetResultFloat(thingProps[i++].X), t.Position.y)); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); @@ -523,18 +535,9 @@ namespace CodeImp.DoomBuilder.Windows if(preventchanges) return; int i = 0; - //restore values - if(string.IsNullOrEmpty(posY.Text)) { - // Apply position - foreach(Thing t in things) - t.Move(new Vector2D(t.Position.x, thingProps[i++].Y)); - } else { //update values - float delta = posY.GetResultFloat(initialPosition.y) - initialPosition.y; - - // Apply position - foreach(Thing t in things) - t.Move(new Vector2D(t.Position.x, thingProps[i++].Y + delta)); - } + // Update values + foreach(Thing t in things) + t.Move(new Vector2D(t.Position.x, posY.GetResultFloat(thingProps[i++].Y))); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); @@ -543,19 +546,18 @@ namespace CodeImp.DoomBuilder.Windows private void posZ_WhenTextChanged(object sender, EventArgs e) { if(preventchanges) return; + int i = 0; - //restore values if(string.IsNullOrEmpty(posZ.Text)) { - int i = 0; - - // Apply position + // Restore values foreach(Thing t in things) t.Move(new Vector3D(t.Position.x, t.Position.y, thingProps[i++].Z)); - } else { //update values - // Apply position + } else { + // Update values foreach(Thing t in things) { - float z = posZ.GetResultFloat((int)t.Position.z); - if(useAbsoluteHeight && t.Sector != null) z -= t.Sector.FloorHeight; + float z = posZ.GetResultFloat(thingProps[i++].Z); + if(useAbsoluteHeight && !posZ.CheckIsRelative() && t.Sector != null) + z -= t.Sector.FloorHeight; t.Move(new Vector3D(t.Position.x, t.Position.y, z)); } } diff --git a/Source/Core/Windows/ThingEditFormUDMF.Designer.cs b/Source/Core/Windows/ThingEditFormUDMF.Designer.cs index 53475fba..7c55db76 100644 --- a/Source/Core/Windows/ThingEditFormUDMF.Designer.cs +++ b/Source/Core/Windows/ThingEditFormUDMF.Designer.cs @@ -229,6 +229,7 @@ // anglecontrol // this.anglecontrol.Angle = 0; + this.anglecontrol.AngleOffset = 0; this.anglecontrol.Location = new System.Drawing.Point(7, 17); this.anglecontrol.Name = "anglecontrol"; this.anglecontrol.Size = new System.Drawing.Size(64, 64); @@ -303,6 +304,7 @@ // rollControl // this.rollControl.Angle = -90; + this.rollControl.AngleOffset = 0; this.rollControl.Location = new System.Drawing.Point(7, 17); this.rollControl.Name = "rollControl"; this.rollControl.Size = new System.Drawing.Size(64, 64); @@ -322,6 +324,7 @@ // pitchControl // this.pitchControl.Angle = -90; + this.pitchControl.AngleOffset = 0; this.pitchControl.Location = new System.Drawing.Point(7, 17); this.pitchControl.Name = "pitchControl"; this.pitchControl.Size = new System.Drawing.Size(64, 64); @@ -571,7 +574,7 @@ // // posX // - this.posX.AllowDecimal = false; + this.posX.AllowDecimal = true; this.posX.AllowNegative = true; this.posX.AllowRelative = true; this.posX.ButtonStep = 8; @@ -585,7 +588,7 @@ // // posY // - this.posY.AllowDecimal = false; + this.posY.AllowDecimal = true; this.posY.AllowNegative = true; this.posY.AllowRelative = true; this.posY.ButtonStep = 8; @@ -599,7 +602,7 @@ // // posZ // - this.posZ.AllowDecimal = false; + this.posZ.AllowDecimal = true; this.posZ.AllowNegative = true; this.posZ.AllowRelative = true; this.posZ.ButtonStep = 8; diff --git a/Source/Core/Windows/ThingEditFormUDMF.cs b/Source/Core/Windows/ThingEditFormUDMF.cs index 10ee8e10..6b48746a 100644 --- a/Source/Core/Windows/ThingEditFormUDMF.cs +++ b/Source/Core/Windows/ThingEditFormUDMF.cs @@ -48,8 +48,6 @@ namespace CodeImp.DoomBuilder.Windows private ICollection things; private ThingTypeInfo thinginfo; private bool preventchanges; - private Vector3D initialPosition; //initial position of a thing used to fill posX, posY and posZ fields - private int initialFloorHeight; //floor height of the sector first thing is in private static bool useAbsoluteHeight; private string arg0str; private bool haveArg0Str; @@ -61,7 +59,7 @@ namespace CodeImp.DoomBuilder.Windows private struct ThingProperties //mxd { - public readonly int Type; + //public readonly int Type; public readonly int AngleDoom; public readonly int Pitch; public readonly int Roll; @@ -76,7 +74,7 @@ namespace CodeImp.DoomBuilder.Windows X = t.Position.x; Y = t.Position.y; Z = t.Position.z; - Type = t.Type; + //Type = t.Type; AngleDoom = t.AngleDoom; Pitch = t.Pitch; Roll = t.Roll; @@ -193,11 +191,11 @@ namespace CodeImp.DoomBuilder.Windows cbAbsoluteHeight.Checked = useAbsoluteHeight; //mxd //mxd - initialPosition = ft.Position; - if(ft.Sector != null) initialFloorHeight = ft.Sector.FloorHeight; - posX.Text = ((int)ft.Position.x).ToString(); - posY.Text = ((int)ft.Position.y).ToString(); - posZ.Text = useAbsoluteHeight ? ((int)ft.Position.z + initialFloorHeight).ToString() : ((int)ft.Position.z).ToString(); + ft.DetermineSector(); + int floorheight = (ft.Sector != null ? ft.Sector.FloorHeight : 0); + posX.Text = (ft.Position.x).ToString(); + posY.Text = (ft.Position.y).ToString(); + posZ.Text = useAbsoluteHeight ? (ft.Position.z + floorheight).ToString() : (ft.Position.z).ToString(); posX.ButtonStep = General.Map.Grid.GridSize; posY.ButtonStep = General.Map.Grid.GridSize; posZ.ButtonStep = General.Map.Grid.GridSize; @@ -246,6 +244,9 @@ namespace CodeImp.DoomBuilder.Windows // Go for all things foreach(Thing t in things) { + //mxd. Update sector info + t.DetermineSector(); + // Type does not match? ThingTypeInfo info = thingtype.GetSelectedInfo(); //mxd if(info != null && info.Index != t.Type) thingtype.ClearSelectedType(); @@ -263,10 +264,12 @@ namespace CodeImp.DoomBuilder.Windows // Coordination if(t.AngleDoom.ToString() != angle.Text) angle.Text = ""; - //mxd + //mxd. Position + if((t.Position.x).ToString() != posX.Text) posX.Text = ""; + if((t.Position.y).ToString() != posY.Text) posY.Text = ""; if(useAbsoluteHeight && t.Sector != null) { - if(((int)t.Position.z + t.Sector.FloorHeight).ToString() != posZ.Text) posZ.Text = ""; - } else if(((int)t.Position.z).ToString() != posZ.Text) { + if((t.Position.z + t.Sector.FloorHeight).ToString() != posZ.Text) posZ.Text = ""; + } else if((t.Position.z).ToString() != posZ.Text) { posZ.Text = ""; } @@ -647,9 +650,28 @@ namespace CodeImp.DoomBuilder.Windows //mxd private void cbAbsoluteHeight_CheckedChanged(object sender, EventArgs e) { + if(preventchanges) return; useAbsoluteHeight = cbAbsoluteHeight.Checked; zlabel.Text = useAbsoluteHeight ? "Abs. Z:" : "Z:"; - posZ.Text = (useAbsoluteHeight ? initialFloorHeight + initialPosition.z : initialPosition.z).ToString(); + + preventchanges = true; + + //update label text + Thing ft = General.GetByIndex(things, 0); + float z = ft.Position.z; + if(useAbsoluteHeight && ft.Sector != null) z += ft.Sector.FloorHeight; + posZ.Text = z.ToString(); + + foreach(Thing t in things) { + z = t.Position.z; + if(useAbsoluteHeight && t.Sector != null) z += t.Sector.FloorHeight; + if(posZ.Text != z.ToString()) { + posZ.Text = ""; + break; + } + } + + preventchanges = false; } //mxd @@ -680,18 +702,9 @@ namespace CodeImp.DoomBuilder.Windows if(preventchanges) return; int i = 0; - //restore values - if(string.IsNullOrEmpty(posX.Text)) { - // Apply position - foreach(Thing t in things) - t.Move(new Vector2D(thingProps[i++].X, t.Position.y)); - } else { //update values - float delta = posX.GetResultFloat(initialPosition.x) - initialPosition.x; - - // Apply position - foreach(Thing t in things) - t.Move(new Vector2D(thingProps[i++].X + delta, t.Position.y)); - } + // Update values + foreach(Thing t in things) + t.Move(new Vector2D(posX.GetResultFloat(thingProps[i++].X), t.Position.y)); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); @@ -702,18 +715,9 @@ namespace CodeImp.DoomBuilder.Windows if(preventchanges) return; int i = 0; - //restore values - if(string.IsNullOrEmpty(posY.Text)) { - // Apply position - foreach(Thing t in things) - t.Move(new Vector2D(t.Position.x, thingProps[i++].Y)); - } else { //update values - float delta = posY.GetResultFloat(initialPosition.y) - initialPosition.y; - - // Apply position - foreach(Thing t in things) - t.Move(new Vector2D(t.Position.x, thingProps[i++].Y + delta)); - } + // Update values + foreach(Thing t in things) + t.Move(new Vector2D(t.Position.x, posY.GetResultFloat(thingProps[i++].Y))); General.Map.IsChanged = true; if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); @@ -722,19 +726,17 @@ namespace CodeImp.DoomBuilder.Windows private void posZ_WhenTextChanged(object sender, EventArgs e) { if(preventchanges) return; + int i = 0; - //restore values if(string.IsNullOrEmpty(posZ.Text)) { - int i = 0; - - // Apply position + // Restore values foreach(Thing t in things) t.Move(new Vector3D(t.Position.x, t.Position.y, thingProps[i++].Z)); - } else { //update values - // Apply position + } else { + // Update values foreach(Thing t in things) { - float z = posZ.GetResultFloat((int)t.Position.z); - if(useAbsoluteHeight && t.Sector != null) + float z = posZ.GetResultFloat(thingProps[i++].Z); + if(useAbsoluteHeight && !posZ.CheckIsRelative() && t.Sector != null) z -= t.Sector.FloorHeight; t.Move(new Vector3D(t.Position.x, t.Position.y, z)); }