diff --git a/Source/Plugins/BuilderModes/BuilderModes.csproj b/Source/Plugins/BuilderModes/BuilderModes.csproj index 210d4f8d..d69f2bf6 100644 --- a/Source/Plugins/BuilderModes/BuilderModes.csproj +++ b/Source/Plugins/BuilderModes/BuilderModes.csproj @@ -300,6 +300,7 @@ + diff --git a/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs b/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs index fb71aae3..f95e3303 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/VerticesMode.cs @@ -49,6 +49,7 @@ namespace CodeImp.DoomBuilder.BuilderModes // Highlighted item protected Vertex highlighted; + private Linedef highlightedLine; // Interface private bool editpressed; @@ -191,6 +192,27 @@ namespace CodeImp.DoomBuilder.BuilderModes else General.Interface.HideInfo(); } + + //mxd + private void HighlightLine(Linedef l) { + // Update display + if(renderer.StartPlotter(false)) { + // Undraw previous highlight + if((highlightedLine != null) && !highlightedLine.IsDisposed) + renderer.PlotLinedef(highlightedLine, renderer.DetermineLinedefColor(highlightedLine)); + + // Set new highlight + highlightedLine = l; + + // Render highlighted item + if((highlightedLine != null) && !highlightedLine.IsDisposed) + renderer.PlotLinedef(highlightedLine, General.Colors.InfoLine); + + // Done + renderer.Finish(); + renderer.Present(); + } + } // Selection protected override void OnSelectBegin() @@ -426,6 +448,13 @@ namespace CodeImp.DoomBuilder.BuilderModes // Highlight if not the same if(v != highlighted) Highlight(v); + + //mxd + // Find the nearest linedef within split linedefs range + Linedef l = General.Map.Map.NearestLinedefRange(mousemappos, BuilderPlug.Me.SplitLinedefsRange / renderer.Scale); + + // Highlight if not the same + if(l != highlightedLine) HighlightLine(l); } } diff --git a/Source/Plugins/BuilderModes/Interface/MenusForm.Designer.cs b/Source/Plugins/BuilderModes/Interface/MenusForm.Designer.cs index cef5b245..365dcd3b 100644 --- a/Source/Plugins/BuilderModes/Interface/MenusForm.Designer.cs +++ b/Source/Plugins/BuilderModes/Interface/MenusForm.Designer.cs @@ -44,25 +44,25 @@ namespace CodeImp.DoomBuilder.BuilderModes this.mergesectorsitem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); this.thingsmenu = new System.Windows.Forms.ToolStripMenuItem(); + this.alignToWallItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pointAtCursorItem = new System.Windows.Forms.ToolStripMenuItem(); this.globalstrip = new System.Windows.Forms.ToolStrip(); this.manualstrip = new System.Windows.Forms.ToolStrip(); - this.seperatorcopypaste = new System.Windows.Forms.ToolStripSeparator(); - this.separatorsectors1 = new System.Windows.Forms.ToolStripSeparator(); - this.brightnessGradientMode = new System.Windows.Forms.ToolStripComboBox(); this.buttoncopyproperties = new System.Windows.Forms.ToolStripButton(); this.buttonpasteproperties = new System.Windows.Forms.ToolStripButton(); + this.seperatorcopypaste = new System.Windows.Forms.ToolStripSeparator(); this.buttonselectionnumbers = new System.Windows.Forms.ToolStripButton(); + this.separatorsectors1 = new System.Windows.Forms.ToolStripSeparator(); this.buttonbrightnessgradient = new System.Windows.Forms.ToolStripButton(); this.buttonfloorgradient = new System.Windows.Forms.ToolStripButton(); this.buttonceilinggradient = new System.Windows.Forms.ToolStripButton(); this.buttonflipselectionh = new System.Windows.Forms.ToolStripButton(); this.buttonflipselectionv = new System.Windows.Forms.ToolStripButton(); this.buttoncurvelinedefs = new System.Windows.Forms.ToolStripButton(); + this.brightnessGradientMode = new System.Windows.Forms.ToolStripComboBox(); this.buttonMarqueSelectTouching = new System.Windows.Forms.ToolStripButton(); this.buttonAlignThingsToWall = new System.Windows.Forms.ToolStripButton(); this.buttonTextureOffsetLock = new System.Windows.Forms.ToolStripButton(); - this.alignToWallItem = new System.Windows.Forms.ToolStripMenuItem(); - this.pointAtCursorItem = new System.Windows.Forms.ToolStripMenuItem(); this.menustrip.SuspendLayout(); this.manualstrip.SuspendLayout(); this.SuspendLayout(); @@ -201,6 +201,24 @@ namespace CodeImp.DoomBuilder.BuilderModes this.thingsmenu.Text = "Things"; this.thingsmenu.Visible = false; // + // alignToWallItem + // + this.alignToWallItem.Image = global::CodeImp.DoomBuilder.BuilderModes.Properties.Resources.AlignThings; + this.alignToWallItem.Name = "alignToWallItem"; + this.alignToWallItem.Size = new System.Drawing.Size(202, 22); + this.alignToWallItem.Tag = "thingaligntowall"; + this.alignToWallItem.Text = "&Align To Closest Linedef"; + this.alignToWallItem.Click += new System.EventHandler(this.InvokeTaggedAction); + // + // pointAtCursorItem + // + this.pointAtCursorItem.Image = global::CodeImp.DoomBuilder.BuilderModes.Properties.Resources.ThingPointAtCursor; + this.pointAtCursorItem.Name = "pointAtCursorItem"; + this.pointAtCursorItem.Size = new System.Drawing.Size(202, 22); + this.pointAtCursorItem.Tag = "thinglookatcursor"; + this.pointAtCursorItem.Text = "&Point at Cursor"; + this.pointAtCursorItem.Click += new System.EventHandler(this.InvokeTaggedAction); + // // globalstrip // this.globalstrip.Location = new System.Drawing.Point(0, 24); @@ -233,25 +251,6 @@ namespace CodeImp.DoomBuilder.BuilderModes this.manualstrip.TabIndex = 2; this.manualstrip.Text = "toolStrip1"; // - // seperatorcopypaste - // - this.seperatorcopypaste.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.seperatorcopypaste.Name = "seperatorcopypaste"; - this.seperatorcopypaste.Size = new System.Drawing.Size(6, 25); - // - // separatorsectors1 - // - this.separatorsectors1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); - this.separatorsectors1.Name = "separatorsectors1"; - this.separatorsectors1.Size = new System.Drawing.Size(6, 25); - // - // brightnessGradientMode - // - this.brightnessGradientMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.brightnessGradientMode.Name = "brightnessGradientMode"; - this.brightnessGradientMode.Size = new System.Drawing.Size(75, 25); - this.brightnessGradientMode.ToolTipText = "Brightness Gradient affects:"; - // // buttoncopyproperties // this.buttoncopyproperties.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; @@ -274,6 +273,12 @@ namespace CodeImp.DoomBuilder.BuilderModes this.buttonpasteproperties.Text = "Paste Properties"; this.buttonpasteproperties.Click += new System.EventHandler(this.InvokeTaggedAction); // + // seperatorcopypaste + // + this.seperatorcopypaste.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.seperatorcopypaste.Name = "seperatorcopypaste"; + this.seperatorcopypaste.Size = new System.Drawing.Size(6, 25); + // // buttonselectionnumbers // this.buttonselectionnumbers.CheckOnClick = true; @@ -285,6 +290,12 @@ namespace CodeImp.DoomBuilder.BuilderModes this.buttonselectionnumbers.Text = "View Selection Numbering"; this.buttonselectionnumbers.Click += new System.EventHandler(this.buttonselectionnumbers_Click); // + // separatorsectors1 + // + this.separatorsectors1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0); + this.separatorsectors1.Name = "separatorsectors1"; + this.separatorsectors1.Size = new System.Drawing.Size(6, 25); + // // buttonbrightnessgradient // this.buttonbrightnessgradient.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; @@ -352,6 +363,13 @@ namespace CodeImp.DoomBuilder.BuilderModes this.buttoncurvelinedefs.Text = "Curve Linedefs"; this.buttoncurvelinedefs.Click += new System.EventHandler(this.InvokeTaggedAction); // + // brightnessGradientMode + // + this.brightnessGradientMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.brightnessGradientMode.Name = "brightnessGradientMode"; + this.brightnessGradientMode.Size = new System.Drawing.Size(75, 25); + this.brightnessGradientMode.ToolTipText = "Brightness Gradient affects:"; + // // buttonMarqueSelectTouching // this.buttonMarqueSelectTouching.CheckOnClick = true; @@ -384,28 +402,10 @@ namespace CodeImp.DoomBuilder.BuilderModes this.buttonTextureOffsetLock.ImageTransparentColor = System.Drawing.Color.Magenta; this.buttonTextureOffsetLock.Name = "buttonTextureOffsetLock"; this.buttonTextureOffsetLock.Size = new System.Drawing.Size(23, 22); - this.buttonTextureOffsetLock.ToolTipText = "When enabled, keeps floor and ceiling texture offsets\r\nconstant while sector is d" + - "ragged\r\n"; + this.buttonTextureOffsetLock.ToolTipText = "Pin Texture Offsets.\r\nWhen enabled, keeps floor and ceiling texture offsets\r\ncons" + + "tant while sector is dragged\r\n"; this.buttonTextureOffsetLock.Click += new System.EventHandler(this.buttonTextureOffsetLock_Click); // - // alignToWallItem - // - this.alignToWallItem.Image = global::CodeImp.DoomBuilder.BuilderModes.Properties.Resources.AlignThings; - this.alignToWallItem.Name = "alignToWallItem"; - this.alignToWallItem.Size = new System.Drawing.Size(202, 22); - this.alignToWallItem.Tag = "thingaligntowall"; - this.alignToWallItem.Text = "&Align To Closest Linedef"; - this.alignToWallItem.Click += new System.EventHandler(this.InvokeTaggedAction); - // - // pointAtCursorItem - // - this.pointAtCursorItem.Image = global::CodeImp.DoomBuilder.BuilderModes.Properties.Resources.ThingPointAtCursor; - this.pointAtCursorItem.Name = "pointAtCursorItem"; - this.pointAtCursorItem.Size = new System.Drawing.Size(202, 22); - this.pointAtCursorItem.Tag = "thinglookatcursor"; - this.pointAtCursorItem.Text = "&Point at Cursor"; - this.pointAtCursorItem.Click += new System.EventHandler(this.InvokeTaggedAction); - // // MenusForm // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs index 32e53d7a..125472f8 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs @@ -739,6 +739,40 @@ namespace CodeImp.DoomBuilder.BuilderModes sd.AddEffectLineSlope(l); } } + // ========== Plane Copy (mxd) (see http://zdoom.org/wiki/Plane_Copy) ========== + else if(l.Action == 118) + { + //check sodding flags... + bool floorCopyToBack = false; + bool floorCopyToFront = false; + bool ceilingCopyToBack = false; + bool ceilingCopyToFront = false; + + if(l.Args[4] > 0 && l.Args[4] != 3 && l.Args[4] != 12) { + floorCopyToBack = (l.Args[4] & 1) == 1; + floorCopyToFront = (l.Args[4] & 2) == 2; + ceilingCopyToBack = (l.Args[4] & 4) == 4; + ceilingCopyToFront = (l.Args[4] & 8) == 8; + } + + // Copy slope to front sector + //Flags: Back floor to front sector or Back ceiling to front sector + if(l.Front != null) { + if((l.Args[0] > 0 || l.Args[1] > 0) || (floorCopyToFront && l.Args[2] > 0) || (ceilingCopyToFront && l.Args[3] > 0)) { + SectorData sd = GetSectorData(l.Front.Sector); + sd.AddEffectPlaneClopySlope(l, true); + } + } + + // Copy slope to back sector + //Flags: Copy front floor to back sector or Front ceiling to back sector + if(l.Back != null) { + if((l.Args[2] > 0 || l.Args[3] > 0) || (floorCopyToBack && l.Args[0] > 0) || (ceilingCopyToBack && l.Args[1] > 0)) { + SectorData sd = GetSectorData(l.Back.Sector); + sd.AddEffectPlaneClopySlope(l, false); + } + } + } // ========== Sector 3D floor (see http://zdoom.org/wiki/Sector_Set3dFloor) ========== else if((l.Action == 160) && (l.Front != null)) { diff --git a/Source/Plugins/BuilderModes/VisualModes/EffectPlaneCopySlope.cs b/Source/Plugins/BuilderModes/VisualModes/EffectPlaneCopySlope.cs new file mode 100644 index 00000000..06b33415 --- /dev/null +++ b/Source/Plugins/BuilderModes/VisualModes/EffectPlaneCopySlope.cs @@ -0,0 +1,96 @@ +using CodeImp.DoomBuilder.Map; + +namespace CodeImp.DoomBuilder.BuilderModes +{ + internal class EffectPlaneCopySlope : SectorEffect + { + // Linedef that is used to create this effect + private Linedef linedef; + private bool isFront; + + public EffectPlaneCopySlope(SectorData data, Linedef sourcelinedef, bool front) : base(data) { + linedef = sourcelinedef; + isFront = front; + + // New effect added: This sector needs an update! + if(data.Mode.VisualSectorExists(data.Sector)) { + BaseVisualSector vs = (BaseVisualSector)data.Mode.GetVisualSector(data.Sector); + vs.UpdateSectorGeometry(true); + } + } + + // This makes sure we are updated with the source linedef information + public override void Update() { + Sector sourcesector = null; + SectorData sourcesectordata = null; + + //check flags + bool floorCopyToBack = false; + bool floorCopyToFront = false; + bool ceilingCopyToBack = false; + bool ceilingCopyToFront = false; + + if(linedef.Args[4] > 0 && linedef.Args[4] != 3 && linedef.Args[4] != 12) { + floorCopyToBack = linedef.Args[0] > 0 && (linedef.Args[4] & 1) == 1; + floorCopyToFront = linedef.Args[2] > 0 && (linedef.Args[4] & 2) == 2; + ceilingCopyToBack = linedef.Args[1] > 0 && (linedef.Args[4] & 4) == 4; + ceilingCopyToFront = linedef.Args[3] > 0 && (linedef.Args[4] & 8) == 8; + } + + //check which arguments we must use + int floorArg = -1; + int ceilingArg = -1; + + if(isFront) { + floorArg = floorCopyToFront ? 2 : 0; + ceilingArg = ceilingCopyToFront ? 3 : 1; + } else { + floorArg = floorCopyToBack ? 0 : 2; + ceilingArg = ceilingCopyToBack ? 1 : 3; + } + + //find sector to align floor to + if(linedef.Args[floorArg] > 0) { + foreach(Sector s in General.Map.Map.Sectors) { + if(s.Tag == linedef.Args[floorArg]) { + sourcesector = s; + break; + } + } + + if(sourcesector != null) { + sourcesectordata = data.Mode.GetSectorData(sourcesector); + if(!sourcesectordata.Updated) sourcesectordata.Update(); + + data.Floor.plane = sourcesectordata.Floor.plane; + sourcesectordata.AddUpdateSector(data.Sector, true); + } + } + + if(linedef.Args[ceilingArg] > 0) { + //find sector to align ceiling to + if(linedef.Args[ceilingArg] != linedef.Args[floorArg]) { + sourcesector = null; + + foreach(Sector s in General.Map.Map.Sectors) { + if(s.Tag == linedef.Args[ceilingArg]) { + sourcesector = s; + break; + } + } + + if(sourcesector != null) { + sourcesectordata = data.Mode.GetSectorData(sourcesector); + if(!sourcesectordata.Updated) sourcesectordata.Update(); + + data.Floor.plane = sourcesectordata.Floor.plane; + sourcesectordata.AddUpdateSector(data.Sector, true); + } + + } else if(sourcesector != null) { //ceiling uses the same sector as floor + data.Ceiling.plane = sourcesectordata.Ceiling.plane; + } + } + } + } +} diff --git a/Source/Plugins/BuilderModes/VisualModes/SectorData.cs b/Source/Plugins/BuilderModes/VisualModes/SectorData.cs index 287ed741..38b2791a 100644 --- a/Source/Plugins/BuilderModes/VisualModes/SectorData.cs +++ b/Source/Plugins/BuilderModes/VisualModes/SectorData.cs @@ -114,6 +114,12 @@ namespace CodeImp.DoomBuilder.BuilderModes alleffects.Add(e); } + //mxd. Plane copy slope effect + public void AddEffectPlaneClopySlope(Linedef sourcelinedef, bool front) { + EffectPlaneCopySlope e = new EffectPlaneCopySlope(this, sourcelinedef, front); + alleffects.Add(e); + } + // Copy slope effect public void AddEffectCopySlope(Thing sourcething) { diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs index 91e89bf8..49684fde 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs @@ -185,6 +185,26 @@ namespace CodeImp.DoomBuilder.BuilderModes s.UpdateNeeded = true; } + //mxd + public override void OnResetTextureOffset() { + if(!General.Map.UDMF) return; + + mode.CreateUndo("Reset texture offsets"); + mode.SetActionResult("Texture offsets reset."); + + if(Sector.Sector.Fields.ContainsKey("xpanningceiling")) { + Sector.Sector.Fields.Remove("xpanningceiling"); + Sector.Sector.UpdateNeeded = true; + } + if(Sector.Sector.Fields.ContainsKey("ypanningceiling")) { + Sector.Sector.Fields.Remove("ypanningceiling"); + Sector.Sector.UpdateNeeded = true; + } + + if(Sector.Sector.UpdateNeeded) + Sector.UpdateSectorGeometry(false); + } + // Paste texture public override void OnPasteTexture() { diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs index b8d75f2f..ed0083ca 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs @@ -183,6 +183,27 @@ namespace CodeImp.DoomBuilder.BuilderModes s.Fields["ypanningfloor"] = new UniValue(UniversalType.Float, oldy + (float)xy.Y); s.UpdateNeeded = true; } + + //mxd + public override void OnResetTextureOffset() { + if(!General.Map.UDMF) return; + + mode.CreateUndo("Reset texture offsets"); + mode.SetActionResult("Texture offsets reset."); + Sector.Sector.Fields.BeforeFieldsChange(); + + if(Sector.Sector.Fields.ContainsKey("xpanningfloor")) { + Sector.Sector.Fields.Remove("xpanningfloor"); + Sector.Sector.UpdateNeeded = true; + } + if(Sector.Sector.Fields.ContainsKey("ypanningfloor")) { + Sector.Sector.Fields.Remove("ypanningfloor"); + Sector.Sector.UpdateNeeded = true; + } + + if(Sector.Sector.UpdateNeeded) + Sector.UpdateSectorGeometry(false); + } // Paste texture public override void OnPasteTexture()