diff --git a/Build/Configurations/Hexen_HexenHexen.cfg b/Build/Configurations/Hexen_HexenHexen.cfg index 2de8824..574bcd0 100644 --- a/Build/Configurations/Hexen_HexenHexen.cfg +++ b/Build/Configurations/Hexen_HexenHexen.cfg @@ -32,6 +32,9 @@ include("Includes\\Game_Hexen.cfg"); //mxd. No DECORATE support in vanilla decorategames = ""; +//mxd. Don't do vanilla-style thing rotation angle clamping +doomthingrotationangles = false; + // Default thing filters // (these are not required, just useful for new users) thingsfilters diff --git a/Build/Configurations/Includes/Doom_common.cfg b/Build/Configurations/Includes/Doom_common.cfg index c8f96fe..5ced9a4 100644 --- a/Build/Configurations/Includes/Doom_common.cfg +++ b/Build/Configurations/Includes/Doom_common.cfg @@ -17,6 +17,9 @@ common defaultflatscale = 1.0f; scaledtextureoffsets = true; + //mxd. Do vanilla-style thing rotation angle clamping + doomthingrotationangles = true; + // Texture sources textures { diff --git a/Build/Configurations/SRB2-22.cfg b/Build/Configurations/SRB2-22.cfg index 352e1f8..abbb59e 100644 --- a/Build/Configurations/SRB2-22.cfg +++ b/Build/Configurations/SRB2-22.cfg @@ -45,6 +45,9 @@ formatinterface = "SRB2MapSetIO"; //Maximum safe map size check (0 means skip check) safeboundary = 0; +//Don't do vanilla-style thing rotation angle clamping +doomthingrotationangles = false; + //Sky textures for vanilla maps defaultskytextures { diff --git a/Help/gc_basicsettings.html b/Help/gc_basicsettings.html index dfbc58b..db65743 100644 --- a/Help/gc_basicsettings.html +++ b/Help/gc_basicsettings.html @@ -151,9 +151,13 @@ damagetypes = "None BFGSplash Drowning Slime"; Arguments for the linedef action number to put on the lines when making a door.

doomlightlevels (boolean)
- Set this to false to use linear lighting in Doom Builder. Normally Doom Builder uses a simulation of Doom's light levels.
+ Set this to false to use linear lighting in Doom Builder. Normally Doom Builder uses a simulation of Doom's light levels.
Default value is true.

+ doomthingrotationangles (boolean) - GZDB only.
+ When set to true, editor actions related to changing thing angle will snap the resulting angle to 45 degree increments.
+ Default value is false.
+
start3dmode (integer)
Thing type number that Doom Builder will use to keep your Visual Mode camera position stored in the map. Doom Builder will place a single thing of this type in your map and move it along as you move in Visual Mode.

diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj index baebb5b..db2ad86 100644 --- a/Source/Core/Builder.csproj +++ b/Source/Core/Builder.csproj @@ -1193,6 +1193,7 @@ + diff --git a/Source/Core/Config/GameConfiguration.cs b/Source/Core/Config/GameConfiguration.cs index de90fa5..b41fbea 100644 --- a/Source/Core/Config/GameConfiguration.cs +++ b/Source/Core/Config/GameConfiguration.cs @@ -87,6 +87,7 @@ namespace CodeImp.DoomBuilder.Config private readonly int bottomboundary; private readonly int safeboundary; //mxd private readonly bool doomlightlevels; + private readonly bool doomthingrotationangles; //mxd private readonly string actionspecialhelp; //mxd private readonly string thingclasshelp; //mxd private readonly bool sidedefcompressionignoresaction; //mxd @@ -215,6 +216,7 @@ namespace CodeImp.DoomBuilder.Config public int BottomBoundary { get { return bottomboundary; } } public int SafeBoundary { get { return safeboundary; } } //mxd public bool DoomLightLevels { get { return doomlightlevels; } } + public bool DoomThingRotationAngles { get { return doomthingrotationangles; } } //mxd. When set to true, thing rotation angles will be clamped to the nearest 45 deg increment public string ActionSpecialHelp { get { return actionspecialhelp; } } //mxd public string ThingClassHelp { get { return thingclasshelp; } } //mxd internal bool SidedefCompressionIgnoresAction { get { return sidedefcompressionignoresaction; } } //mxd @@ -374,6 +376,7 @@ namespace CodeImp.DoomBuilder.Config bottomboundary = cfg.ReadSetting("bottomboundary", -32768); safeboundary = cfg.ReadSetting("safeboundary", 32767); //mxd doomlightlevels = cfg.ReadSetting("doomlightlevels", true); + doomthingrotationangles = cfg.ReadSetting("doomthingrotationangles", false); //mxd actionspecialhelp = cfg.ReadSetting("actionspecialhelp", string.Empty); //mxd thingclasshelp = cfg.ReadSetting("thingclasshelp", string.Empty); //mxd sidedefcompressionignoresaction = cfg.ReadSetting("sidedefcompressionignoresaction", false); //mxd diff --git a/Source/Core/Config/ProgramConfiguration.cs b/Source/Core/Config/ProgramConfiguration.cs index 9182488..95f713b 100644 --- a/Source/Core/Config/ProgramConfiguration.cs +++ b/Source/Core/Config/ProgramConfiguration.cs @@ -92,6 +92,7 @@ namespace CodeImp.DoomBuilder.Config private bool keeptexturefilterfocused; //mxd private SplitLineBehavior splitlinebehavior; //mxd private MergeGeometryMode mergegeomode; //mxd + private bool splitjoinedsectors; //mxd private bool usehighlight; //mxd private bool switchviewmodes; //mxd @@ -217,7 +218,8 @@ namespace CodeImp.DoomBuilder.Config public bool KeepTextureFilterFocused { get { return keeptexturefilterfocused; } internal set { keeptexturefilterfocused = value; } } //mxd public SplitLineBehavior SplitLineBehavior { get { return splitlinebehavior; } set { splitlinebehavior = value; } } //mxd public MergeGeometryMode MergeGeometryMode { get { return mergegeomode; } internal set { mergegeomode = value; } } //mxd - + public bool SplitJoinedSectors { get { return splitjoinedsectors; } internal set { splitjoinedsectors = value; } } //mxd + //mxd. Highlight mode public bool UseHighlight { @@ -376,6 +378,7 @@ namespace CodeImp.DoomBuilder.Config keeptexturefilterfocused = cfg.ReadSetting("keeptexturefilterfocused", true); //mxd splitlinebehavior = (SplitLineBehavior)General.Clamp(cfg.ReadSetting("splitlinebehavior", 0), 0, Enum.GetValues(typeof(SplitLineBehavior)).Length - 1); //mxd mergegeomode = (MergeGeometryMode)General.Clamp(cfg.ReadSetting("mergegeometrymode", (int)MergeGeometryMode.REPLACE), 0, Enum.GetValues(typeof(MergeGeometryMode)).Length - 1); //mxd + splitjoinedsectors = cfg.ReadSetting("splitjoinedsectors", true); //mxd usehighlight = cfg.ReadSetting("usehighlight", true); //mxd switchviewmodes = cfg.ReadSetting("switchviewmodes", false); //mxd @@ -502,6 +505,7 @@ namespace CodeImp.DoomBuilder.Config cfg.WriteSetting("keeptexturefilterfocused", keeptexturefilterfocused); //mxd cfg.WriteSetting("splitlinebehavior", (int)splitlinebehavior); //mxd cfg.WriteSetting("mergegeometrymode", (int)mergegeomode); //mxd + cfg.WriteSetting("splitjoinedsectors", splitjoinedsectors); //mxd cfg.WriteSetting("usehighlight", usehighlight); //mxd cfg.WriteSetting("switchviewmodes", switchviewmodes); //mxd diff --git a/Source/Core/GZBuilder/Controls/AngleControl.cs b/Source/Core/GZBuilder/Controls/AngleControl.cs index f971c4a..41961e5 100644 --- a/Source/Core/GZBuilder/Controls/AngleControl.cs +++ b/Source/Core/GZBuilder/Controls/AngleControl.cs @@ -33,6 +33,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls private Point startClick; //JBR + private bool doomangleclamping; + //UI colors private readonly Color fillColor = SystemColors.Window; private readonly Color fillInactiveColor = SystemColors.Control; @@ -53,6 +55,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls public int Angle { get { return (angle == NO_ANGLE ? NO_ANGLE : angle - angleoffset); } set { angle = (value == NO_ANGLE ? NO_ANGLE : value + angleoffset); this.Refresh(); } } public int AngleOffset { get { return angleoffset; } set { angleoffset = value; this.Refresh(); } } + public bool DoomAngleClamping { get { return doomangleclamping; } set { doomangleclamping = value; } } public const int NO_ANGLE = int.MinValue; [Description("Allow loop changing, setting to false will restore old behaviour.")] @@ -295,7 +298,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls startClick = new Point(e.X, e.Y); int thisAngle = XYToDegrees(startClick, origin); - if (e.Button == MouseButtons.Left) + if(e.Button == MouseButtons.Left || doomangleclamping) { thisAngle = (int)Math.Round(thisAngle / 45f) * 45; if(thisAngle == 360) thisAngle = 0; diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs index ae7cada..f6730f1 100644 --- a/Source/Core/General/MapManager.cs +++ b/Source/Core/General/MapManager.cs @@ -2394,7 +2394,13 @@ namespace CodeImp.DoomBuilder General.Plugins.ReloadResources(); // Inform editing mode that the resources are reloaded - if(General.Editing.Mode != null) General.Editing.Mode.OnReloadResources(); + if(General.Editing.Mode != null) + { + General.Editing.Mode.OnReloadResources(); + + //mxd. Also Check appropriate button on interface + General.MainWindow.CheckEditModeButton(General.Editing.Mode.EditModeButtonName); + } // Reset status General.MainWindow.DisplayStatus(oldstatus); diff --git a/Source/Core/Properties/Resources.Designer.cs b/Source/Core/Properties/Resources.Designer.cs index 2247f75..27b305b 100644 --- a/Source/Core/Properties/Resources.Designer.cs +++ b/Source/Core/Properties/Resources.Designer.cs @@ -1328,9 +1328,13 @@ namespace CodeImp.DoomBuilder.Properties { } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// + internal static System.Drawing.Bitmap SplitSectors { + get { + object obj = ResourceManager.GetObject("SplitSectors", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + internal static System.Drawing.Bitmap Status0 { get { object obj = ResourceManager.GetObject("Status0", resourceCulture); diff --git a/Source/Core/Properties/Resources.resx b/Source/Core/Properties/Resources.resx index 4fb9d7e..45fc822 100644 --- a/Source/Core/Properties/Resources.resx +++ b/Source/Core/Properties/Resources.resx @@ -607,6 +607,9 @@ ..\Resources\MergeGeoRemoveLines.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\SplitSectors.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\Snap1mp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/Source/Core/Resources/Actions.cfg b/Source/Core/Resources/Actions.cfg index 774c13c..aba2dde 100644 --- a/Source/Core/Resources/Actions.cfg +++ b/Source/Core/Resources/Actions.cfg @@ -529,6 +529,17 @@ toggleautomerge allowscroll = true; } +//mxd +togglejoinedsectorssplitting +{ + title = "Split Joined Sectors"; + category = "edit"; + description = "When enabled, joined sectors adjacent to drawn lines will be split."; + allowkeys = true; + allowmouse = true; + allowscroll = true; +} + //mxd toggleautoclearsidetextures { diff --git a/Source/Core/Resources/SplitSectors.png b/Source/Core/Resources/SplitSectors.png new file mode 100644 index 0000000..a259ed0 Binary files /dev/null and b/Source/Core/Resources/SplitSectors.png differ diff --git a/Source/Core/Windows/MainForm.Designer.cs b/Source/Core/Windows/MainForm.Designer.cs index a4c9ed4..dcc9d84 100644 --- a/Source/Core/Windows/MainForm.Designer.cs +++ b/Source/Core/Windows/MainForm.Designer.cs @@ -74,6 +74,7 @@ namespace CodeImp.DoomBuilder.Windows this.itempastespecial = new System.Windows.Forms.ToolStripMenuItem(); this.itemsnaptogrid = new System.Windows.Forms.ToolStripMenuItem(); this.itemautomerge = new System.Windows.Forms.ToolStripMenuItem(); + this.itemsplitjoinedsectors = new System.Windows.Forms.ToolStripMenuItem(); this.itemautoclearsidetextures = new System.Windows.Forms.ToolStripMenuItem(); this.seperatoreditgeometry = new System.Windows.Forms.ToolStripSeparator(); this.itemgridinc = new System.Windows.Forms.ToolStripMenuItem(); @@ -193,6 +194,7 @@ namespace CodeImp.DoomBuilder.Windows this.buttonsnaptogrid = new System.Windows.Forms.ToolStripButton(); this.buttontoggledynamicgrid = new System.Windows.Forms.ToolStripButton(); this.buttonautomerge = new System.Windows.Forms.ToolStripButton(); + this.buttonsplitjoinedsectors = new System.Windows.Forms.ToolStripButton(); this.buttonautoclearsidetextures = new System.Windows.Forms.ToolStripButton(); this.buttontogglenightspath = new System.Windows.Forms.ToolStripButton(); this.seperatorgeometry = new System.Windows.Forms.ToolStripSeparator(); @@ -533,6 +535,7 @@ namespace CodeImp.DoomBuilder.Windows this.itemsnaptogrid, this.itemdynamicgridsize, this.itemautomerge, + this.itemsplitjoinedsectors, this.itemautoclearsidetextures, this.seperatoreditgeometry, this.itemgridinc, @@ -647,6 +650,17 @@ namespace CodeImp.DoomBuilder.Windows this.itemautomerge.Text = "Snap to &Geometry"; this.itemautomerge.Click += new System.EventHandler(this.InvokeTaggedAction); // + // itemsplitjoinedsectors + // + this.itemsplitjoinedsectors.Checked = true; + this.itemsplitjoinedsectors.CheckState = System.Windows.Forms.CheckState.Checked; + this.itemsplitjoinedsectors.Image = global::CodeImp.DoomBuilder.Properties.Resources.SplitSectors; + this.itemsplitjoinedsectors.Name = "itemsplitjoinedsectors"; + this.itemsplitjoinedsectors.Size = new System.Drawing.Size(219, 22); + this.itemsplitjoinedsectors.Tag = "builder_togglejoinedsectorssplitting"; + this.itemsplitjoinedsectors.Text = "Split &Joined Sectors when Drawing Lines"; + this.itemsplitjoinedsectors.Click += new System.EventHandler(this.InvokeTaggedAction); + // // itemautoclearsidetextures // this.itemautoclearsidetextures.Checked = true; @@ -1329,6 +1343,7 @@ namespace CodeImp.DoomBuilder.Windows this.buttonsnaptogrid, this.buttontoggledynamicgrid, this.buttonautomerge, + this.buttonsplitjoinedsectors, this.buttonautoclearsidetextures, this.buttontogglenightspath, this.seperatorgeometry, @@ -1844,6 +1859,19 @@ namespace CodeImp.DoomBuilder.Windows this.buttonautomerge.Text = "Snap to Geometry"; this.buttonautomerge.Click += new System.EventHandler(this.InvokeTaggedAction); // + // buttonsplitjoinedsectors + // + this.buttonsplitjoinedsectors.Checked = true; + this.buttonsplitjoinedsectors.CheckState = System.Windows.Forms.CheckState.Checked; + this.buttonsplitjoinedsectors.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.buttonsplitjoinedsectors.Image = global::CodeImp.DoomBuilder.Properties.Resources.SplitSectors; + this.buttonsplitjoinedsectors.ImageTransparentColor = System.Drawing.Color.Magenta; + this.buttonsplitjoinedsectors.Name = "buttonsplitjoinedsectors"; + this.buttonsplitjoinedsectors.Size = new System.Drawing.Size(23, 22); + this.buttonsplitjoinedsectors.Tag = "builder_togglejoinedsectorssplitting"; + this.buttonsplitjoinedsectors.Text = "Split Joined Sectors when Drawing Lines"; + this.buttonsplitjoinedsectors.Click += new System.EventHandler(this.InvokeTaggedAction); + // // buttonautoclearsidetextures // this.buttonautoclearsidetextures.Checked = true; @@ -2754,6 +2782,8 @@ namespace CodeImp.DoomBuilder.Windows private System.Windows.Forms.ToolStripMenuItem itemsnaptogrid; private System.Windows.Forms.ToolStripButton buttonautomerge; private System.Windows.Forms.ToolStripMenuItem itemautomerge; + private System.Windows.Forms.ToolStripButton buttonsplitjoinedsectors; + private System.Windows.Forms.ToolStripMenuItem itemsplitjoinedsectors; private System.Windows.Forms.Timer processor; private System.Windows.Forms.ToolStripSeparator separatorgzmodes; private System.Windows.Forms.ToolStripSeparator seperatorfilesave; diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs index 37a2442..aa5c93c 100644 --- a/Source/Core/Windows/MainForm.cs +++ b/Source/Core/Windows/MainForm.cs @@ -2107,6 +2107,8 @@ namespace CodeImp.DoomBuilder.Windows buttontogglenightspath.Visible = maploaded && General.Map.SRB2; buttontogglenightspath.Checked = General.Settings.RenderNiGHTSPath; buttonautomerge.Visible = General.Settings.ToolbarGeometry && maploaded; + buttonsplitjoinedsectors.Visible = General.Settings.ToolbarGeometry && maploaded; //mxd + buttonsplitjoinedsectors.Checked = General.Settings.SplitJoinedSectors; //mxd buttonautoclearsidetextures.Visible = General.Settings.ToolbarGeometry && maploaded; //mxd buttontest.Visible = General.Settings.ToolbarTesting && maploaded; @@ -2747,6 +2749,7 @@ namespace CodeImp.DoomBuilder.Windows itemcopy.Enabled = (General.Map != null) && (General.Editing.Mode != null) && General.Editing.Mode.Attributes.AllowCopyPaste; itempaste.Enabled = (General.Map != null) && (General.Editing.Mode != null) && General.Editing.Mode.Attributes.AllowCopyPaste; itempastespecial.Enabled = (General.Map != null) && (General.Editing.Mode != null) && General.Editing.Mode.Attributes.AllowCopyPaste; + itemsplitjoinedsectors.Checked = General.Settings.SplitJoinedSectors; //mxd itemautoclearsidetextures.Checked = General.Settings.AutoClearSidedefTextures; //mxd itemdynamicgridsize.Enabled = (General.Map != null); //mxd itemdynamicgridsize.Checked = General.Settings.DynamicGridSize; //mxd @@ -2879,6 +2882,16 @@ namespace CodeImp.DoomBuilder.Windows DisplayStatus(StatusType.Action, "Snap to geometry is " + (buttonautomerge.Checked ? "ENABLED" : "DISABLED")); } + //mxd + [BeginAction("togglejoinedsectorssplitting")] + internal void ToggleJoinedSectorsSplitting() + { + buttonsplitjoinedsectors.Checked = !buttonsplitjoinedsectors.Checked; + itemsplitjoinedsectors.Checked = buttonsplitjoinedsectors.Checked; + General.Settings.SplitJoinedSectors = buttonsplitjoinedsectors.Checked; + DisplayStatus(StatusType.Action, "Joined sectors splitting is " + (General.Settings.SplitJoinedSectors ? "ENABLED" : "DISABLED")); + } + //mxd [BeginAction("togglebrightness")] internal void ToggleBrightness() diff --git a/Source/Core/Windows/ThingEditForm.cs b/Source/Core/Windows/ThingEditForm.cs index 3be98d0..454a665 100644 --- a/Source/Core/Windows/ThingEditForm.cs +++ b/Source/Core/Windows/ThingEditForm.cs @@ -115,6 +115,9 @@ namespace CodeImp.DoomBuilder.Windows posZ.AllowDecimal = true; } + //mxd. Use doom angle clamping? + anglecontrol.DoomAngleClamping = General.Map.Config.DoomThingRotationAngles; + //mxd. Arrange inteface int targetheight; if(General.Map.FormatInterface.HasThingAction) @@ -411,7 +414,12 @@ namespace CodeImp.DoomBuilder.Windows foreach(Thing t in things) { // Coordination - if(cbRandomAngle.Checked) t.Rotate(General.Random(0, 359)); //mxd + if(cbRandomAngle.Checked) //mxd + { + int newangle = General.Random(0, 359); + if(General.Map.Config.DoomThingRotationAngles) newangle = newangle / 45 * 45; + t.Rotate(newangle); + } //mxd. Check position float px = General.Clamp(t.Position.x, General.Map.Config.LeftBoundary, General.Map.Config.RightBoundary); diff --git a/Source/Core/Windows/ThingEditFormUDMF.cs b/Source/Core/Windows/ThingEditFormUDMF.cs index 06405e7..70aa01e 100644 --- a/Source/Core/Windows/ThingEditFormUDMF.cs +++ b/Source/Core/Windows/ThingEditFormUDMF.cs @@ -147,6 +147,9 @@ namespace CodeImp.DoomBuilder.Windows posZ.AllowDecimal = true; } + //mxd. Use doom angle clamping? + anglecontrol.DoomAngleClamping = General.Map.Config.DoomThingRotationAngles; + // Value linking scale.LinkValues = linkscale; @@ -461,7 +464,12 @@ namespace CodeImp.DoomBuilder.Windows { // Coordination //mxd. Randomize rotations? - if(cbrandomangle.Checked) t.Rotate(General.Random(0, 359)); + if(cbrandomangle.Checked) + { + int newangle = General.Random(0, 359); + if(General.Map.Config.DoomThingRotationAngles) newangle = newangle / 45 * 45; + t.Rotate(newangle); + } if(cbrandompitch.Checked) t.SetPitch(General.Random(0, 359)); if(cbrandomroll.Checked) t.SetRoll(General.Random(0, 359)); diff --git a/Source/Plugins/BuilderEffects/Interface/JitterThingsForm.cs b/Source/Plugins/BuilderEffects/Interface/JitterThingsForm.cs index cc3c2b8..5802e48 100644 --- a/Source/Plugins/BuilderEffects/Interface/JitterThingsForm.cs +++ b/Source/Plugins/BuilderEffects/Interface/JitterThingsForm.cs @@ -201,9 +201,13 @@ namespace CodeImp.DoomBuilder.BuilderEffects private void ApplyRotation(int ammount) { for(int i = 0; i < selection.Count; i++) - selection[i].Rotate((int)((thingData[i].Angle + ammount * thingData[i].JitterRotation) % 360)); + { + int newangle = (int)Math.Round(thingData[i].Angle + ammount * thingData[i].JitterRotation); + if(General.Map.Config.DoomThingRotationAngles) newangle = newangle / 45 * 45; + selection[i].Rotate(newangle % 360); + } - //update view + // Update view if(editingModeName == "ThingsMode") General.Interface.RedrawDisplay(); } diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawCurveMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawCurveMode.cs index 13c895f..71e34f7 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawCurveMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawCurveMode.cs @@ -249,7 +249,7 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Map.Map.Update(); //mxd. Outer sectors may require some splittin... - Tools.SplitOuterSectors(General.Map.Map.GetMarkedLinedefs(true)); + if(General.Settings.SplitJoinedSectors) Tools.SplitOuterSectors(General.Map.Map.GetMarkedLinedefs(true)); // Edit new sectors? List newsectors = General.Map.Map.GetMarkedSectors(true); diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs index 364f349..346cac8 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs @@ -781,7 +781,7 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Map.Map.Update(); //mxd. Outer sectors may require some splittin... - Tools.SplitOuterSectors(General.Map.Map.GetMarkedLinedefs(true)); + if(General.Settings.SplitJoinedSectors) Tools.SplitOuterSectors(General.Map.Map.GetMarkedLinedefs(true)); // Edit new sectors? List newsectors = General.Map.Map.GetMarkedSectors(true); diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs index 30792f4..9d3be66 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs @@ -115,7 +115,7 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Map.Map.ClearAllSelected(); //mxd. Outer sectors may require some splittin... - Tools.SplitOuterSectors(General.Map.Map.GetMarkedLinedefs(true)); + if(General.Settings.SplitJoinedSectors) Tools.SplitOuterSectors(General.Map.Map.GetMarkedLinedefs(true)); // Edit new sectors? if(BuilderPlug.Me.EditNewSector && (newsectors.Count > 0)) diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs index 5245544..37f6512 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs @@ -386,7 +386,7 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Map.Map.Update(); //mxd. Outer sectors may require some splittin... - Tools.SplitOuterSectors(General.Map.Map.GetMarkedLinedefs(true)); + if(General.Settings.SplitJoinedSectors) Tools.SplitOuterSectors(General.Map.Map.GetMarkedLinedefs(true)); // Edit new sectors? List newsectors = General.Map.Map.GetMarkedSectors(true); diff --git a/Source/Plugins/BuilderModes/ClassicModes/EditSelectionMode.cs b/Source/Plugins/BuilderModes/ClassicModes/EditSelectionMode.cs index bae3512..fdda079 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/EditSelectionMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/EditSelectionMode.cs @@ -18,7 +18,6 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Drawing; using System.Windows.Forms; using CodeImp.DoomBuilder.Actions; @@ -849,8 +848,14 @@ namespace CodeImp.DoomBuilder.BuilderModes index = 0; foreach(Thing t in selectedthings) { - if(!fixedrotationthingtypes.Contains(t.SRB2Type) && newthingangle[index] != thingangle[index]) //mxd. Polyobject Anchors, I hate you! - t.Rotate(Angle2D.Normalized(newthingangle[index])); + //mxd. Added special Polyobj Anchor handling and Doom angle clamping + if(!fixedrotationthingtypes.Contains(t.SRB2Type)) + { + int newangle = Angle2D.RealToDoom(Angle2D.Normalized(newthingangle[index])); + if(General.Map.Config.DoomThingRotationAngles) newangle = newangle / 45 * 45; + t.Rotate(newangle); + } + index++; } diff --git a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs index 6b57dd3..ec05ce2 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs @@ -284,6 +284,10 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd. Render sector tag labels if(BuilderPlug.Me.ViewSelectionEffects && General.Map.FormatInterface.HasThingAction) { + //mxd. sectorlabels will be null after switching map configuration from one + // without ThingAction to one with it while in Things mode + if(sectorlabels == null) SetupSectorLabels(); + List torender = new List(sectorlabels.Count); foreach(KeyValuePair group in sectortexts) { @@ -1558,25 +1562,33 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Interface.DisplayStatus(StatusType.Action, "Rotated a thing."); } - //change angle - if(General.Interface.CtrlState) //point away + // Change angle + if(General.Interface.CtrlState) // Point away { foreach(Thing t in selected) { ThingTypeInfo info = General.Map.Data.GetThingInfo(t.SRB2Type); if(info == null || info.Category == null || info.Category.Arrow == 0) continue; - t.Rotate(Vector2D.GetAngle(mousemappos, t.Position) + Angle2D.PI); + + int newangle = Angle2D.RealToDoom(Vector2D.GetAngle(mousemappos, t.Position) + Angle2D.PI); + if(General.Map.Config.DoomThingRotationAngles) newangle = (newangle + 22) / 45 * 45; + + t.Rotate(newangle); } } - else //point at + else // Point at cursor { foreach(Thing t in selected) { ThingTypeInfo info = General.Map.Data.GetThingInfo(t.SRB2Type); if(info == null || info.Category == null || info.Category.Arrow == 0) continue; - t.Rotate(Vector2D.GetAngle(mousemappos, t.Position)); + + int newangle = Angle2D.RealToDoom(Vector2D.GetAngle(mousemappos, t.Position)); + if(General.Map.Config.DoomThingRotationAngles) newangle = (newangle + 22) / 45 * 45; + + t.Rotate(newangle); } } @@ -1601,14 +1613,14 @@ namespace CodeImp.DoomBuilder.BuilderModes [BeginAction("rotateclockwise")] public void RotateCW() { - RotateThings(-5); + RotateThings(General.Map.Config.DoomThingRotationAngles ? -45 : -5); } //mxd. rotate counterclockwise [BeginAction("rotatecounterclockwise")] public void RotateCCW() { - RotateThings(5); + RotateThings(General.Map.Config.DoomThingRotationAngles ? 45 : 5); } //mxd @@ -1637,8 +1649,14 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Interface.DisplayStatus(StatusType.Action, "Rotated a thing."); } - //change angle - foreach(Thing t in selected) t.Rotate(General.ClampAngle(t.AngleDoom + increment)); + // Change angle + foreach(Thing t in selected) + { + int newangle = t.AngleDoom + increment; + if(General.Map.Config.DoomThingRotationAngles) newangle = (newangle + 22) / 45 * 45; + + t.Rotate(General.ClampAngle(newangle)); + } // Redraw screen General.Interface.RedrawDisplay(); diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs index 28c8199..404d9c5 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs @@ -3519,18 +3519,18 @@ namespace CodeImp.DoomBuilder.BuilderModes [BeginAction("rotateclockwise")] public void RotateCW() { - RotateThingsAndTextures(5); + RotateThingsAndTextures(General.Map.Config.DoomThingRotationAngles ? 45 : 5, 5); } //mxd. Rotate counterclockwise [BeginAction("rotatecounterclockwise")] public void RotateCCW() { - RotateThingsAndTextures(-5); + RotateThingsAndTextures(General.Map.Config.DoomThingRotationAngles ? -45 : -5, - 5); } //mxd - private void RotateThingsAndTextures(int increment) + private void RotateThingsAndTextures(int thingangleincrement, int textureangleincrement) { PreAction(UndoGroup.ThingAngleChange); @@ -3542,7 +3542,10 @@ namespace CodeImp.DoomBuilder.BuilderModes if(obj is BaseVisualThing) { BaseVisualThing t = (BaseVisualThing)obj; - t.SetAngle(General.ClampAngle(t.Thing.AngleDoom + increment)); + + int newangle = t.Thing.AngleDoom + thingangleincrement; + if(General.Map.Config.DoomThingRotationAngles) newangle = newangle / 45 * 45; + t.SetAngle(General.ClampAngle(newangle)); // Visual sectors may be affected by this thing... if(thingdata.ContainsKey(t.Thing)) @@ -3562,12 +3565,12 @@ namespace CodeImp.DoomBuilder.BuilderModes else if(obj is VisualFloor) { VisualFloor vf = (VisualFloor)obj; - vf.OnChangeTextureRotation(General.ClampAngle(vf.GetControlSector().Fields.GetValue("rotationfloor", 0.0f) + increment)); + vf.OnChangeTextureRotation(General.ClampAngle(vf.GetControlSector().Fields.GetValue("rotationfloor", 0.0f) + textureangleincrement)); } else if(obj is VisualCeiling) { VisualCeiling vc = (VisualCeiling)obj; - vc.OnChangeTextureRotation(General.ClampAngle(vc.GetControlSector().Fields.GetValue("rotationceiling", 0.0f) + increment)); + vc.OnChangeTextureRotation(General.ClampAngle(vc.GetControlSector().Fields.GetValue("rotationceiling", 0.0f) + textureangleincrement)); } }