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).
This commit is contained in:
MaxED 2016-06-15 22:02:51 +00:00 committed by spherallic
parent 584d649839
commit e34fe0d32f
25 changed files with 170 additions and 33 deletions

View File

@ -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

View File

@ -17,6 +17,9 @@ common
defaultflatscale = 1.0f;
scaledtextureoffsets = true;
//mxd. Do vanilla-style thing rotation angle clamping
doomthingrotationangles = true;
// Texture sources
textures
{

View File

@ -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
{

View File

@ -151,9 +151,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 />

View File

@ -1193,6 +1193,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" />

View File

@ -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

View File

@ -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,6 +218,7 @@ 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

View File

@ -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;

View File

@ -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);

View File

@ -1328,9 +1328,13 @@ namespace CodeImp.DoomBuilder.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
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);

View File

@ -607,6 +607,9 @@
<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>
<data name="Snap1mp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Snap1mp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>

View File

@ -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
{

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -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;

View File

@ -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()

View File

@ -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);

View File

@ -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));

View File

@ -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();
}

View File

@ -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);

View File

@ -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<Sector> newsectors = General.Map.Map.GetMarkedSectors(true);

View File

@ -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))

View File

@ -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);

View File

@ -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++;
}

View File

@ -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<ITextLabel> torender = new List<ITextLabel>(sectorlabels.Count);
foreach(KeyValuePair<Sector, string[]> 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();

View File

@ -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));
}
}