diff --git a/Build/Configurations/Hexen_HexenHexen.cfg b/Build/Configurations/Hexen_HexenHexen.cfg index 297acefb7b93a1e4c37877184b51d2ba0153cda6..ac59c055bc085ca483e81e4249afa739f5176039 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 b895513cfaf73aadab3cc32caff40a998e4e2d41..b3f1d0cb48b2d26b350c6ec8af25296ae2b5dff1 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/Help/gc_basicsettings.html b/Help/gc_basicsettings.html index 8a9de024c3411ae6b1ad8b1686158291ff93640e..2474fcd28ed76170d7c588c6452e834209563f92 100644 --- a/Help/gc_basicsettings.html +++ b/Help/gc_basicsettings.html @@ -145,9 +145,13 @@ damagetypes = "None BFGSplash Drowning Slime"; Arguments for the linedef action number to put on the lines when making a door.<br /> <br /> <b class="fat">doomlightlevels</b> (boolean)<br /> - Set this to <b>false</b> to use linear lighting in Doom Builder. Normally Doom Builder uses a simulation of Doom's light levels. <br /> + Set this to <b>false</b> to use linear lighting in Doom Builder. Normally Doom Builder uses a simulation of Doom's light levels.<br /> Default value is <b>true</b>.<br /> <br /> + <b class="fat">doomthingrotationangles</b> (boolean) - <span class="red">GZDB only</span>.<br /> + When set to <b>true</b>, editor actions related to changing thing angle will snap the resulting angle to 45 degree increments.<br /> + Default value is <b>false</b>.<br /> + <br /> <b class="fat">start3dmode</b> (integer)<br /> 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.<br /> <br /> diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj index 9087bcad361ad8d675dd472c2ce76b6ce60d283b..9135c2ac729cfb4f7dfaa5c789dc72aea0fc2ba0 100644 --- a/Source/Core/Builder.csproj +++ b/Source/Core/Builder.csproj @@ -1179,6 +1179,7 @@ <None Include="Resources\ModelDisabled.png" /> <None Include="Resources\ModelFiltered.png" /> <Content Include="Resources\Model_selected.png" /> + <None Include="Resources\SplitSectors.png" /> <None Include="Resources\ScriptProperty.png" /> <None Include="Resources\TextWhitespace.png" /> <None Include="Resources\TextIndent.png" /> diff --git a/Source/Core/Config/GameConfiguration.cs b/Source/Core/Config/GameConfiguration.cs index 7fb6807aeaea227ece66b475e58f926e10d1819b..28188dd15d9b1dcb908da0fd9782f89a9c67d8d3 100644 --- a/Source/Core/Config/GameConfiguration.cs +++ b/Source/Core/Config/GameConfiguration.cs @@ -85,6 +85,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 @@ -208,6 +209,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 @@ -360,6 +362,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 541e8b93b54de3aeadaed37a578354e98385911b..1c1e9fd785deafd8d2ca50b606c03268b82a29dc 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 @@ -207,7 +208,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 { @@ -356,6 +358,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 @@ -474,6 +477,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/Controls/AngleControlEx.cs b/Source/Core/Controls/AngleControlEx.cs index 1cf2dd87a165df29f4de825fcef104f0a629ab9c..3cb9889fcda6a5b291f1d4b46cd11c6ab6a1de95 100644 --- a/Source/Core/Controls/AngleControlEx.cs +++ b/Source/Core/Controls/AngleControlEx.cs @@ -26,6 +26,8 @@ namespace CodeImp.DoomBuilder.Controls private const int markScaler = 5; private Point origin; + private bool doomangleclamping; + //UI colors private readonly Color fillColor = SystemColors.Window; private readonly Color fillInactiveColor = SystemColors.Control; @@ -44,6 +46,7 @@ namespace CodeImp.DoomBuilder.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; #endregion @@ -189,7 +192,7 @@ namespace CodeImp.DoomBuilder.Controls { int thisAngle = XYToDegrees(new Point(e.X, e.Y), 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 05a23000bd8c0de2d1c8ad861a67ce8e45a2de57..901320dea81f33a41ab0d39ef6859423fd5e4d8d 100644 --- a/Source/Core/General/MapManager.cs +++ b/Source/Core/General/MapManager.cs @@ -2258,7 +2258,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 086ad5f231c74a303227576435a363b21a6c6a09..1c089b0e4fbb5fac1f1551f5f5ea11448a25553a 100644 --- a/Source/Core/Properties/Resources.Designer.cs +++ b/Source/Core/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. -// Runtime Version:2.0.50727.5466 +// Runtime Version:2.0.50727.5485 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -963,6 +963,13 @@ namespace CodeImp.DoomBuilder.Properties { } } + 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 a114545da3d6f84407754b6fbfdf855cfb7961fa..afdf57b68d7412ce4f3dc811d5b6966f36745876 100644 --- a/Source/Core/Properties/Resources.resx +++ b/Source/Core/Properties/Resources.resx @@ -595,4 +595,7 @@ <data name="MergeGeoRemoveLines" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\MergeGeoRemoveLines.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="SplitSectors" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\SplitSectors.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> </root> \ No newline at end of file diff --git a/Source/Core/Resources/Actions.cfg b/Source/Core/Resources/Actions.cfg index ff40bfa7aa98112820a233a2f13aae3b9700918c..ffb6cd7c7b62d85b56363240977b81bc3e6cf02c 100644 --- a/Source/Core/Resources/Actions.cfg +++ b/Source/Core/Resources/Actions.cfg @@ -507,6 +507,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 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 c0c5841b750b37f041ba27becbc77ef4b4f1a1c0..29a84ee2c3bfca0f7ee581c5989a14f5cf8b18d9 100644 --- a/Source/Core/Windows/MainForm.Designer.cs +++ b/Source/Core/Windows/MainForm.Designer.cs @@ -75,6 +75,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.buttontogglefixedthingsscale = new System.Windows.Forms.ToolStripButton(); this.buttonsnaptogrid = 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.seperatorgeometry = new System.Windows.Forms.ToolStripSeparator(); this.buttontogglefx = new System.Windows.Forms.ToolStripButton(); @@ -533,6 +535,7 @@ namespace CodeImp.DoomBuilder.Windows this.itemsnaptogrid, this.itemdynamicgridsize, this.itemautomerge, + this.itemsplitjoinedsectors, this.itemautoclearsidetextures, this.seperatoreditgeometry, this.itemgridinc, @@ -634,6 +637,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; @@ -1306,6 +1320,7 @@ namespace CodeImp.DoomBuilder.Windows this.buttonsnaptogrid, this.buttontoggledynamicgrid, this.buttonautomerge, + this.buttonsplitjoinedsectors, this.buttonautoclearsidetextures, this.seperatorgeometry, this.buttontogglefx, @@ -1793,6 +1808,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; @@ -2680,6 +2708,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 2e6e2b2bea6b8578f59556d486b238c9e5e59af8..78da8864192839c72a4ce754c171b1b4700897a4 100644 --- a/Source/Core/Windows/MainForm.cs +++ b/Source/Core/Windows/MainForm.cs @@ -2114,6 +2114,8 @@ namespace CodeImp.DoomBuilder.Windows buttontoggledynamicgrid.Visible = General.Settings.ToolbarGeometry && maploaded; //mxd buttontoggledynamicgrid.Checked = General.Settings.DynamicGridSize; //mxd 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; @@ -2762,6 +2764,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 @@ -2894,6 +2897,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 0d33ded8d85b9cb3e069eaf4a5a13bd679dd7679..76dc045fcf9737c245e27b826d203bc543da8c2b 100644 --- a/Source/Core/Windows/ThingEditForm.cs +++ b/Source/Core/Windows/ThingEditForm.cs @@ -114,6 +114,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) @@ -364,7 +367,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 68198a1c4062aace5fafe4e489d56357c74bef92..8f3350aa94e02049f77a77f2162a93df5b974f92 100644 --- a/Source/Core/Windows/ThingEditFormUDMF.cs +++ b/Source/Core/Windows/ThingEditFormUDMF.cs @@ -148,6 +148,9 @@ namespace CodeImp.DoomBuilder.Windows posZ.AllowDecimal = true; } + //mxd. Use doom angle clamping? + anglecontrol.DoomAngleClamping = General.Map.Config.DoomThingRotationAngles; + // Value linking scale.LinkValues = linkscale; @@ -462,7 +465,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 886282cdb374781c86b054082c9d653fcc432d33..8db1304252e354f180fd8598473316a985591fe8 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 81c77308ef48e6888a0fdf67f9e06b26c09097fc..e3c91078ede84aa546cb275ffa0b02ef0ad7e1c3 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<Sector> newsectors = General.Map.Map.GetMarkedSectors(true); diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs index 21f77f343f9bd1a3a3e4b6419af61b0dc6121229..d90164e34e1339a9edf10d343187e1549dc6647b 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs @@ -780,7 +780,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<Sector> newsectors = General.Map.Map.GetMarkedSectors(true); diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs index ba91d7467d67448c74102aad11b12b64810606d4..3fc76b695c32a8e71f11b55f55a4f7fc8ea8d061 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 0f07350c7770fff46c4f9f4f6ff758cf1713c635..d3a016c3e2011f12ba90f021b1a3a3810b9d189e 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<Sector> newsectors = General.Map.Map.GetMarkedSectors(true); diff --git a/Source/Plugins/BuilderModes/ClassicModes/EditSelectionMode.cs b/Source/Plugins/BuilderModes/ClassicModes/EditSelectionMode.cs index 17bc3b9f20372a0d939fc418c47b8f39e90edccf..64c6ebfed6856546bd0d3c8423cb46178615621e 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; @@ -848,8 +847,14 @@ namespace CodeImp.DoomBuilder.BuilderModes index = 0; foreach(Thing t in selectedthings) { - if(!fixedrotationthingtypes.Contains(t.Type)) //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.Type)) + { + 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 b6937b37f853533c0ac28f6d39baeb63a0abebaf..f48e3829f16506a454ad28e686d920a25e85132a 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs @@ -265,6 +265,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<ITextLabel> torender = new List<ITextLabel>(sectorlabels.Count); foreach(KeyValuePair<Sector, string[]> group in sectortexts) { @@ -1494,25 +1498,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.Type); 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.Type); 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); } } @@ -1524,14 +1536,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 @@ -1560,8 +1572,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 0fa83bb09e97ede213cb08541e5bb3767fad4fcf..9512836a21f78a3ea4bae2e39d4d4bbe8adf3d76 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs @@ -3204,18 +3204,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); @@ -3227,7 +3227,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)) @@ -3247,12 +3250,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)); } }