From e34fe0d32fcab430ad9f5651e0f30a18c31b9b3f Mon Sep 17 00:00:00 2001 From: MaxED Date: Wed, 15 Jun 2016 22:02:51 +0000 Subject: [PATCH] Added "Split Joined Sectors" Edit menu item and toolbar button. When enabled, joined sectors adjacent to drawn lines will be split. Added "doomthingrotationangles" Game Configuration property. When enabled, editor actions related to changing thing angle will snap the resulting angle to 45 degree increments. This property is set to true for vanilla game configurations. Fixed a crash when changing game configuration from one without Thing actions support to one with them while in Things mode. Fixed, cosmetic, DB2 bug: current editing mode button was deselected after reloading resources. Updated documentation ("Game Configuration - Basic Settings" page). --- Build/Configurations/Hexen_HexenHexen.cfg | 3 ++ Build/Configurations/Includes/Doom_common.cfg | 3 ++ Build/Configurations/SRB2-22.cfg | 3 ++ Help/gc_basicsettings.html | 6 ++- Source/Core/Builder.csproj | 1 + Source/Core/Config/GameConfiguration.cs | 3 ++ Source/Core/Config/ProgramConfiguration.cs | 6 ++- .../Core/GZBuilder/Controls/AngleControl.cs | 5 ++- Source/Core/General/MapManager.cs | 8 +++- Source/Core/Properties/Resources.Designer.cs | 10 +++-- Source/Core/Properties/Resources.resx | 3 ++ Source/Core/Resources/Actions.cfg | 11 ++++++ Source/Core/Resources/SplitSectors.png | Bin 0 -> 1678 bytes Source/Core/Windows/MainForm.Designer.cs | 30 +++++++++++++++ Source/Core/Windows/MainForm.cs | 13 +++++++ Source/Core/Windows/ThingEditForm.cs | 10 ++++- Source/Core/Windows/ThingEditFormUDMF.cs | 10 ++++- .../Interface/JitterThingsForm.cs | 8 +++- .../ClassicModes/DrawCurveMode.cs | 2 +- .../ClassicModes/DrawGeometryMode.cs | 2 +- .../BuilderModes/ClassicModes/DrawGridMode.cs | 2 +- .../ClassicModes/DrawRectangleMode.cs | 2 +- .../ClassicModes/EditSelectionMode.cs | 11 ++++-- .../BuilderModes/ClassicModes/ThingsMode.cs | 36 +++++++++++++----- .../VisualModes/BaseVisualMode.cs | 15 +++++--- 25 files changed, 170 insertions(+), 33 deletions(-) create mode 100644 Source/Core/Resources/SplitSectors.png 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 0000000000000000000000000000000000000000..a259ed0498495e843c041c89af4f3bd2ceacd169 GIT binary patch literal 1678 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU%v{0TQqR!T z+}y-mN5ROz&{W^RSl`${*T~q)#K6kLNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$IMft0!ZY(y z^2>`g!FqgstvvIJOA_;vQ$1a5m4K$`WoD*W85%em8=III1A&{Np{tpti<6s$i@B+> zxuLU(iJK8juSMv>2~2MaLN7=&cD*(J3ovn(~mttdZN0qkw7Ox$iU z#AzN>ZwhX=7~#~b4|I$^C~}b^8zuxyK_DhP=>j?M#Gjf6Oz}m)qF!J%OG+!igev#;K=~2=LBw=t+9i75KPGNN7n|WV5JKbk^;e+w6_!&b*&Fxvfd2=H&0~@9XdXzE{n1 zOoF4SVanWW%j`?9zp4v5h4;zWm@)lNOv&Q3)i}B~On9B{i{Fn|tgza5)6S;maMF>< zx!NCPpV~H`zaPBO#p__~ZKXGRl9=W93iC|W>tJ(N{Be-CY^%IZmFSb8BTYBYR@deE zXnU|O_nG~JN$|gbgwAQknR5*uO<(XigCXTl{)gc3gl#Qnj=KDE{7~Ac(YYa|RM+RR zkVf_fM*R~F&nKo#Iu|%$TI)T>f<5eC*o;L&t~u^67j}7M)X~+GGl^AnNm;WMBcUsq@475=j_b#i&XxNqgVKEHgfpc z@ekXWBXL{`0T?U;{3;$n>5aD`Sa=So79`{oMzcQ5%?kO zwZhPM!c_CF|E`ya@xMue*s))T2dFq&s<=ld9p5Czopr0ARg>z5oCK literal 0 HcmV?d00001 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)); } }