diff --git a/Build/Configurations/Includes/Doom_misc.cfg b/Build/Configurations/Includes/Doom_misc.cfg
index 9c94327f..16a5a718 100644
--- a/Build/Configurations/Includes/Doom_misc.cfg
+++ b/Build/Configurations/Includes/Doom_misc.cfg
@@ -15,7 +15,7 @@ skills
linedefflags
{
1 = "Impassable";
- 2 = "Block Monster";
+ 2 = "Block Monsters";
4 = "Double Sided";
8 = "Upper Unpegged";
16 = "Lower Unpegged";
diff --git a/Build/Configurations/Includes/UDMF_misc.cfg b/Build/Configurations/Includes/UDMF_misc.cfg
index c907527c..781eaadc 100644
--- a/Build/Configurations/Includes/UDMF_misc.cfg
+++ b/Build/Configurations/Includes/UDMF_misc.cfg
@@ -94,11 +94,11 @@ sectorflags
linedefflags
{
blocking = "Impassable";
- blockmonsters = "Block monster";
+ blockmonsters = "Block monsters";
twosided = "Doublesided";
dontpegtop = "Upper unpegged";
dontpegbottom = "Lower unpegged";
- secret = "Secret";
+ secret = "Shown as 1-sided on automap";
blocksound = "Block sound";
dontdraw = "Not shown on automap";
transparent = "Transparent (25% opacity)";
diff --git a/Build/Configurations/Includes/ZDoom_misc.cfg b/Build/Configurations/Includes/ZDoom_misc.cfg
index 42aff4c8..0b8708a6 100644
--- a/Build/Configurations/Includes/ZDoom_misc.cfg
+++ b/Build/Configurations/Includes/ZDoom_misc.cfg
@@ -33,7 +33,7 @@ linedefflags_udmf
blocking = "Impassable";
blockeverything = "Block everything";
blockplayers = "Block players";
- blockmonsters = "Block monster";
+ blockmonsters = "Block monsters";
blockfloaters = "Block floating monsters";
blocksound = "Block sound";
blockprojectiles = "Block projectiles";
@@ -45,13 +45,13 @@ linedefflags_udmf
jumpover = "Jump-over railing";
clipmidtex = "Clip middle texture";
wrapmidtex = "Wrap middle texture";
- mapped = "Initially shown on automap";
- dontdraw = "Not shown on automap";
+ mapped = "Initially shown on map";
+ secret = "Shown as 1-sided on map";
+ dontdraw = "Not shown on map";
transparent = "Transparent (25% opacity)";
translucent = "Translucent (obsolete)";
monsteractivate = "Monster activates";
zoneboundary = "Sound zone boundary";
- secret = "Secret";
}
diff --git a/Build/Scripting/ZDoom_DECORATE.cfg b/Build/Scripting/ZDoom_DECORATE.cfg
index 1550fca0..366f7e78 100644
--- a/Build/Scripting/ZDoom_DECORATE.cfg
+++ b/Build/Scripting/ZDoom_DECORATE.cfg
@@ -34,8 +34,8 @@ keywords
A_DamageTarget = "A_DamageTarget(int amount[, str damagetype = \"None\"[, int flags = 0[, str filter = \"None\"[, str species = \"None\"]]]])\namount: amount of damage to inflict. Use a negative value to heal.\ndamagetype: the type of damage to inflict.\nflags: DMSS flags.\nfilter: the actor class to damage.\nspecies: the actor species to damage.";
A_DamageTracer = "A_DamageTracer(int amount[, str damagetype = \"None\"[, int flags = 0[, str filter = \"None\"[, str species = \"None\"]]]])\namount: amount of damage to inflict. Use a negative value to heal.\ndamagetype: the type of damage to inflict.\nflags: DMSS flags.\nfilter: the actor class to damage.\nspecies: the actor species to damage.";
A_Die = "A_Die[(str damagetype)]";
- A_FaceTarget = "A_FaceTarget[(float angle = 0[, float pitch = 0])]";
- A_FaceMaster = "A_FaceMaster[(float angle = 0[, float pitch = 0])]";
+ A_FaceTarget = "A_FaceTarget[(float angle = 0[, float pitch = 0])]\nA_FaceTarget(float max_turn, float max_pitch, float ang_offset, float pitch_offset, int flags)";
+ A_FaceMaster = "A_FaceMaster[(float angle = 0[, float pitch = 0])]\nA_FaceMaster(float max_turn, float max_pitch, float ang_offset, float pitch_offset, int flags)";
A_FastChase = "A_FastChase";
A_KillChildren = "A_KillChildren[(str damagetype = \"None\"[, int flags = 0[, str filter = \"None\[, str species = \"None\]]])]\ndamagetype: if the actor dies, the actor will enter a death state based on damagetype if present (or pain state if using NODAMAGE).\nflags: KILS flags.\nfilter: the actor class to damage.\nspecies: the actor species to damage.";
A_KillMaster = "A_KillMaster[(str damagetype = \"None\"[, int flags = 0[, str filter = \"None\"[, str species = \"None\"]]])]\ndamagetype: if the actor dies, the actor will enter a death state based on damagetype if present (or pain state if using NODAMAGE).\nflags: KILS flags.\nfilter: the actor class to damage.\nspecies: the actor species to damage.";
@@ -177,6 +177,7 @@ keywords
A_SetReflective = "A_SetReflective";
A_SetReflectiveInvulnerable = "A_SetReflectiveInvulnerable";
A_SetScale = "A_SetScale(float scaleX[, float scaleY = scaleX[, int pointer = AAPTR_DEFAULT]])";
+ A_SetRoll = "A_SetRoll(float pitch[, int flags = 0[, int pointer = AAPTR_DEFAULT]])";
A_SetShadow = "A_SetShadow";
A_SetShootable = "A_SetShootable";
A_SetSolid = "A_SetSolid";
@@ -198,7 +199,7 @@ keywords
A_SeekerMissile = "A_SeekerMissile(angle threshold, angle maxturnangle[, int flags = 0[, int chance = 50[, int distance = 10]]])\nflags: SMF flags.";
A_Tracer = "A_Tracer";
A_Tracer2 = "A_Tracer2";
- A_FaceTracer = "A_FaceTracer[(float angle = 0[, float pitch = 0])]";
+ A_FaceTracer = "A_FaceTracer[(float angle = 0[, float pitch = 0])]\nA_FaceTracer(float max_turn, float max_pitch, float ang_offset, float pitch_offset, int flags)";
A_Fire = "A_Fire[(float height = 0)]";
A_Weave = "A_Weave(int horzspeed, int vertspeed, float horzdist, float vertdist)";
A_Warp = "A_Warp(int ptr_destination, float x-offset, float y-offset, float z-offset, float angle, int flags, str success_state)\nflags: WARPF flags.";
@@ -638,6 +639,7 @@ constants
SXF_SETTRACER;
SXF_NOPOINTERS;
SXF_ORIGINATOR;
+ SXF_TRANSFERSPRITEFRAME;
//weapon flags
WRF_NOBOB;
WRF_NOFIRE;
@@ -1130,4 +1132,9 @@ constants
MRF_UNDOBYDEATH;
MRF_UNDOBYDEATHFORCED;
MRF_UNDOBYDEATHSAVES;
+//A_FaceTraget/Master/Tracer flags
+ FAF_BOTTOM;
+ FAF_MIDDLE;
+ FAF_TOP;
+ FAF_NODISTFACTOR;
}
diff --git a/Source/Core/Geometry/Tools.cs b/Source/Core/Geometry/Tools.cs
index 9bdfe8fd..8703b896 100644
--- a/Source/Core/Geometry/Tools.cs
+++ b/Source/Core/Geometry/Tools.cs
@@ -496,7 +496,8 @@ namespace CodeImp.DoomBuilder.Geometry
}
}
- // Use default settings from neares linedef, if settings have been found yet
+ // Use default settings from the nearest linedef, if settings have not been found yet
+ Sector nearestsector = null; //mxd
if( (nearbylines != null) && (alllines.Count > 0) && (!foundsidedefaults || (sourcesector == null)) )
{
Vector2D testpoint = alllines[0].Line.GetSidePoint(alllines[0].Front);
@@ -511,6 +512,16 @@ namespace CodeImp.DoomBuilder.Geometry
if(sourcesector == null) sourcesector = defaultside.Sector;
TakeSidedefSettings(ref sourceside, defaultside);
}
+ else
+ {
+ //mxd. Any side is better than no side (but we'll want only basic settings from that)...
+ defaultside = (side < 0.0f ? nearest.Back : nearest.Front);
+ if(defaultside != null)
+ {
+ TakeSidedefSettings(ref sourceside, defaultside);
+ nearestsector = defaultside.Sector;
+ }
+ }
}
}
@@ -522,21 +533,34 @@ namespace CodeImp.DoomBuilder.Geometry
{
// Copy properties from source to new sector
sourcesector.CopyPropertiesTo(newsector);
-
- //mxd. Apply overrides
- if(useOverrides)
- {
- if (General.Map.Options.OverrideCeilingTexture) newsector.SetCeilTexture(General.Map.Options.DefaultCeilingTexture);
- if (General.Map.Options.OverrideFloorTexture) newsector.SetFloorTexture(General.Map.Options.DefaultFloorTexture);
- if (General.Map.Options.OverrideCeilingHeight) newsector.CeilHeight = General.Map.Options.CustomCeilingHeight;
- if (General.Map.Options.OverrideFloorHeight) newsector.FloorHeight = General.Map.Options.CustomFloorHeight;
- if (General.Map.Options.OverrideBrightness) newsector.Brightness = General.Map.Options.CustomBrightness;
- }
+ }
+ else if(nearestsector != null)
+ {
+ //mxd. Apply basic properties from the nearest sector
+ newsector.SetFloorTexture(nearestsector.FloorTexture);
+ newsector.SetCeilTexture(nearestsector.CeilTexture);
+ newsector.FloorHeight = nearestsector.FloorHeight;
+ newsector.CeilHeight = nearestsector.CeilHeight;
+ newsector.Brightness = nearestsector.Brightness;
}
else
{
// No source sector, apply default sector properties
- ApplyDefaultsToSector(newsector);
+ newsector.SetFloorTexture(General.Map.Options.DefaultFloorTexture);
+ newsector.SetCeilTexture(General.Map.Options.DefaultCeilingTexture);
+ newsector.FloorHeight = General.Settings.DefaultFloorHeight;
+ newsector.CeilHeight = General.Settings.DefaultCeilingHeight;
+ newsector.Brightness = General.Settings.DefaultBrightness;
+ }
+
+ //mxd. Apply overrides?
+ if(useOverrides)
+ {
+ if(General.Map.Options.OverrideCeilingTexture) newsector.SetCeilTexture(General.Map.Options.DefaultCeilingTexture);
+ if(General.Map.Options.OverrideFloorTexture) newsector.SetFloorTexture(General.Map.Options.DefaultFloorTexture);
+ if(General.Map.Options.OverrideCeilingHeight) newsector.CeilHeight = General.Map.Options.CustomCeilingHeight;
+ if(General.Map.Options.OverrideFloorHeight) newsector.FloorHeight = General.Map.Options.CustomFloorHeight;
+ if(General.Map.Options.OverrideBrightness) newsector.Brightness = General.Map.Options.CustomBrightness;
}
// Go for all sides to make sidedefs
@@ -712,16 +736,6 @@ namespace CodeImp.DoomBuilder.Geometry
if(sd.LowRequired() && sd.LongLowTexture == MapSet.EmptyLongName) sd.SetTextureLow(defaults.newtexlow); //mxd
}
- // This applies defaults to a sector
- private static void ApplyDefaultsToSector(Sector s)
- {
- s.SetFloorTexture(General.Map.Options.DefaultFloorTexture);
- s.SetCeilTexture(General.Map.Options.DefaultCeilingTexture);
- s.FloorHeight = (General.Map.Options.OverrideFloorHeight ? General.Map.Options.CustomFloorHeight : General.Settings.DefaultFloorHeight);
- s.CeilHeight = (General.Map.Options.OverrideCeilingHeight ? General.Map.Options.CustomCeilingHeight : General.Settings.DefaultCeilingHeight);
- s.Brightness = (General.Map.Options.OverrideBrightness ? General.Map.Options.CustomBrightness : General.Settings.DefaultBrightness);
- }
-
//mxd. This applies overrides to a sidedef
private static void ApplyOverridesToSidedef(Sidedef sd)
{
@@ -2168,6 +2182,51 @@ namespace CodeImp.DoomBuilder.Geometry
#endregion
+ #region ================== Sidedefs (mxd)
+
+ /// Updates the 'lightfog' UDMF flag to display sidedef brightness on fogged walls. Returns 1 if flag was added, -1 if it was removed, 0 if flag wasn't changed
+ public static int UpdateLightFogFlag(Sidedef side)
+ {
+ //Side requires the flag?
+ if(side.Sector == null) return 0;
+ if(!side.Fields.ContainsKey("light"))
+ {
+ //Unset the flag
+ if(side.IsFlagSet("lightfog"))
+ {
+ side.SetFlag("lightfog", false);
+ return -1;
+ }
+ return 0;
+ }
+
+ //Update the flag
+ if(General.Map.Data.MapInfo.HasFadeColor ||
+ (General.Map.Data.MapInfo.HasOutsideFogColor && side.Sector.CeilTexture == General.Map.Config.SkyFlatName) ||
+ side.Sector.Fields.ContainsKey("fadecolor"))
+ {
+ //Set the flag
+ if(!side.IsFlagSet("lightfog"))
+ {
+ side.SetFlag("lightfog", true);
+ return 1;
+ }
+ }
+ else
+ {
+ //Unset the flag
+ if(side.IsFlagSet("lightfog"))
+ {
+ side.SetFlag("lightfog", false);
+ return -1;
+ }
+ }
+
+ return 0;
+ }
+
+ #endregion
+
#region ================== Misc Exported Functions
///
diff --git a/Source/Core/VisualModes/VisualMode.cs b/Source/Core/VisualModes/VisualMode.cs
index 2b308324..938ab9d4 100644
--- a/Source/Core/VisualModes/VisualMode.cs
+++ b/Source/Core/VisualModes/VisualMode.cs
@@ -170,28 +170,40 @@ namespace CodeImp.DoomBuilder.VisualModes
//mxd. Synch camera position to cursor position or center of the screen in 2d-mode
if(General.Settings.GZSynchCameras)
{
- //if position is inside sector - adjust camera.z accordingly
- Sector sector = General.Map.Map.GetSectorByCoordinates(initialcameraposition, blockmap);
-
+ //If initial position is inside or nearby a sector - adjust camera.z accordingly
float posz = General.Map.VisualCamera.Position.z;
- if(sector != null)
+ Sector nearestsector = General.Map.Map.GetSectorByCoordinates(initialcameraposition, blockmap);
+
+ if(nearestsector == null)
{
- int sectorHeight = sector.CeilHeight - sector.FloorHeight;
- if(General.Map.VisualCamera.Position.z < sector.FloorHeight + 41)
+ Linedef nearestline = MapSet.NearestLinedef(General.Map.Map.Linedefs, initialcameraposition);
+ if(nearestline != null)
{
- if(sectorHeight < 41)
- posz = sector.FloorHeight + sectorHeight / 2;
- else
- posz = sector.FloorHeight + 41; // same as in doom
- }
- else if(General.Map.VisualCamera.Position.z > sector.CeilHeight)
- {
- if(sectorHeight < 41)
- posz = sector.FloorHeight + sectorHeight / 2;
- else
- posz = sector.CeilHeight - 4;
+ float side = nearestline.SideOfLine(initialcameraposition);
+ Sidedef nearestside = (side < 0.0f ? nearestline.Front : nearestline.Back) ?? (side < 0.0f ? nearestline.Back : nearestline.Front);
+ if(nearestside != null) nearestsector = nearestside.Sector;
}
}
+
+ if(nearestsector != null)
+ {
+ int sectorheight = nearestsector.CeilHeight - nearestsector.FloorHeight;
+ if(General.Map.VisualCamera.Position.z < nearestsector.FloorHeight + 41)
+ {
+ if(sectorheight < 41)
+ posz = nearestsector.FloorHeight + sectorheight / 2;
+ else
+ posz = nearestsector.FloorHeight + 41; // same as in doom
+ }
+ else if(General.Map.VisualCamera.Position.z > nearestsector.CeilHeight)
+ {
+ if(sectorheight < 41)
+ posz = nearestsector.FloorHeight + sectorheight / 2;
+ else
+ posz = nearestsector.CeilHeight - 4;
+ }
+ }
+
General.Map.VisualCamera.Position = new Vector3D(initialcameraposition.x, initialcameraposition.y, posz);
}
else
diff --git a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
index 024d92a2..5bc6cdf8 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
@@ -1516,41 +1516,30 @@ namespace CodeImp.DoomBuilder.BuilderModes
int removedcount = 0;
foreach(Linedef l in lines)
{
- if(l.Front != null) ToggleLightFogFlag(l.Front, ref addedcout, ref removedcount);
- if(l.Back != null) ToggleLightFogFlag(l.Back, ref addedcout, ref removedcount);
+ if(l.Front != null)
+ {
+ int result = Tools.UpdateLightFogFlag(l.Front);
+ switch(result)
+ {
+ case 1: addedcout++; break;
+ case -1: removedcount++; break;
+ }
+ }
+ if(l.Back != null)
+ {
+ int result = Tools.UpdateLightFogFlag(l.Back);
+ switch(result)
+ {
+ case 1: addedcout++; break;
+ case -1: removedcount++; break;
+ }
+ }
}
// Display info
General.Interface.DisplayStatus(StatusType.Action, "Added 'lightfog' flag to " + addedcout + " sidedefs, removed it from " + removedcount + " sidedefs.");
}
- //mxd
- private void ToggleLightFogFlag(Sidedef side, ref int addedcout, ref int removedcount)
- {
- //Side requires the flag?
- if(!side.Fields.ContainsKey("light") || side.Sector == null) return;
- if(General.Map.Data.MapInfo.HasFadeColor ||
- (General.Map.Data.MapInfo.HasOutsideFogColor && side.Sector.CeilTexture == General.Map.Config.SkyFlatName) ||
- side.Sector.Fields.ContainsKey("fade"))
- {
- //Set the flag
- if(!side.IsFlagSet("lightfog"))
- {
- side.SetFlag("lightfog", true);
- addedcout++;
- }
- }
- else
- {
- //Unset the flag
- if(side.IsFlagSet("lightfog"))
- {
- side.SetFlag("lightfog", false);
- removedcount++;
- }
- }
- }
-
#endregion
}
}
diff --git a/Source/Plugins/BuilderModes/Interface/MenusForm.Designer.cs b/Source/Plugins/BuilderModes/Interface/MenusForm.Designer.cs
index 7bd20183..55cd3568 100644
--- a/Source/Plugins/BuilderModes/Interface/MenusForm.Designer.cs
+++ b/Source/Plugins/BuilderModes/Interface/MenusForm.Designer.cs
@@ -42,7 +42,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
this.curvelinedefsitem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
this.splitlinedefsitem = new System.Windows.Forms.ToolStripMenuItem();
- this.alignLinedefsItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.aligntexturesitem = new System.Windows.Forms.ToolStripMenuItem();
this.alignFloorToFrontItem = new System.Windows.Forms.ToolStripMenuItem();
this.alignFloorToBackItem = new System.Windows.Forms.ToolStripMenuItem();
this.alignCeilingToFrontItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -100,6 +100,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
this.fileMenuStrip = new System.Windows.Forms.MenuStrip();
this.exportStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem();
+ this.updatelightfogitem = new System.Windows.Forms.ToolStripMenuItem();
this.menustrip.SuspendLayout();
this.manualstrip.SuspendLayout();
this.fileMenuStrip.SuspendLayout();
@@ -133,7 +134,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
this.curvelinedefsitem,
this.toolStripMenuItem3,
this.splitlinedefsitem,
- this.alignLinedefsItem,
+ this.updatelightfogitem,
+ this.aligntexturesitem,
this.toolStripSeparator5,
this.selectSimilarLinesItem});
this.linedefsmenu.Name = "linedefsmenu";
@@ -225,16 +227,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
this.splitlinedefsitem.Text = "S&plit Linedefs";
this.splitlinedefsitem.Click += new System.EventHandler(this.InvokeTaggedAction);
//
- // alignLinedefsItem
+ // aligntexturesitem
//
- this.alignLinedefsItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.aligntexturesitem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.alignFloorToFrontItem,
this.alignFloorToBackItem,
this.alignCeilingToFrontItem,
this.alignCeilingToBackItem});
- this.alignLinedefsItem.Name = "alignLinedefsItem";
- this.alignLinedefsItem.Size = new System.Drawing.Size(245, 22);
- this.alignLinedefsItem.Text = "&Align Textures";
+ this.aligntexturesitem.Name = "aligntexturesitem";
+ this.aligntexturesitem.Size = new System.Drawing.Size(245, 22);
+ this.aligntexturesitem.Text = "&Align Textures";
//
// alignFloorToFrontItem
//
@@ -737,7 +739,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
this.buttonTextureOffsetLock.Image = global::CodeImp.DoomBuilder.BuilderModes.Properties.Resources.TextureLock;
this.buttonTextureOffsetLock.ImageTransparentColor = System.Drawing.Color.Magenta;
this.buttonTextureOffsetLock.Name = "buttonTextureOffsetLock";
- this.buttonTextureOffsetLock.Size = new System.Drawing.Size(23, 20);
+ this.buttonTextureOffsetLock.Size = new System.Drawing.Size(23, 22);
this.buttonTextureOffsetLock.ToolTipText = "Pin Texture Offsets.\r\nWhen enabled, keeps floor and ceiling texture offsets\r\ncons" +
"tant while sector is dragged";
this.buttonTextureOffsetLock.Click += new System.EventHandler(this.buttonTextureOffsetLock_Click);
@@ -768,6 +770,13 @@ namespace CodeImp.DoomBuilder.BuilderModes
this.toolStripMenuItem5.Text = "Selection to Wavefront .obj...";
this.toolStripMenuItem5.Click += new System.EventHandler(this.InvokeTaggedAction);
//
+ // updatelightfogitem
+ //
+ this.updatelightfogitem.Name = "updatelightfogitem";
+ this.updatelightfogitem.Size = new System.Drawing.Size(245, 22);
+ this.updatelightfogitem.Tag = "applylightfogflag";
+ this.updatelightfogitem.Text = "&Update \'lightfog\' flag";
+ //
// MenusForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
@@ -834,7 +843,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
private System.Windows.Forms.ToolStripMenuItem pointAtCursorItem;
private System.Windows.Forms.ToolStripButton buttonTextureOffsetLock;
private System.Windows.Forms.ToolStripMenuItem selectInSectorsItem;
- private System.Windows.Forms.ToolStripMenuItem alignLinedefsItem;
+ private System.Windows.Forms.ToolStripMenuItem aligntexturesitem;
private System.Windows.Forms.ToolStripMenuItem alignFloorToFrontItem;
private System.Windows.Forms.ToolStripMenuItem alignFloorToBackItem;
private System.Windows.Forms.ToolStripMenuItem alignCeilingToFrontItem;
@@ -870,5 +879,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
private System.Windows.Forms.ToolStripComboBox gradientInterpolationMenu;
private System.Windows.Forms.ToolStripSeparator separatorsectors2;
private System.Windows.Forms.ToolStripSeparator separatorsectors3;
+ private System.Windows.Forms.ToolStripMenuItem updatelightfogitem;
}
}
\ No newline at end of file
diff --git a/Source/Plugins/BuilderModes/Interface/MenusForm.cs b/Source/Plugins/BuilderModes/Interface/MenusForm.cs
index 71c7a383..3012484c 100644
--- a/Source/Plugins/BuilderModes/Interface/MenusForm.cs
+++ b/Source/Plugins/BuilderModes/Interface/MenusForm.cs
@@ -237,7 +237,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
//mxd
private void linedefsmenu_DropDownOpening(object sender, EventArgs e)
{
- alignLinedefsItem.Enabled = General.Map.UDMF;
+ aligntexturesitem.Enabled = General.Map.UDMF;
+ updatelightfogitem.Enabled = General.Map.UDMF;
}
//mxd
diff --git a/Source/Plugins/BuilderModes/Interface/MenusForm.resx b/Source/Plugins/BuilderModes/Interface/MenusForm.resx
index e577d4cb..716f69dc 100644
--- a/Source/Plugins/BuilderModes/Interface/MenusForm.resx
+++ b/Source/Plugins/BuilderModes/Interface/MenusForm.resx
@@ -123,12 +123,12 @@
17, 17
-
- 118, 17
-
True
+
+ 118, 17
+
True
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
index 6f6e39b9..68b4b3a4 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
@@ -1347,22 +1347,23 @@ namespace CodeImp.DoomBuilder.BuilderModes
{
int light = Sidedef.Fields.GetValue("light", 0);
bool absolute = Sidedef.Fields.GetValue("lightabsolute", false);
- int newLight;
+ int newlight;
if(up)
- newLight = General.Map.Config.BrightnessLevels.GetNextHigher(light, absolute);
+ newlight = General.Map.Config.BrightnessLevels.GetNextHigher(light, absolute);
else
- newLight = General.Map.Config.BrightnessLevels.GetNextLower(light, absolute);
+ newlight = General.Map.Config.BrightnessLevels.GetNextLower(light, absolute);
- if(newLight == light) return;
+ if(newlight == light) return;
//create undo
mode.CreateUndo("Change wall brightness", UndoGroup.SurfaceBrightnessChange, Sector.Sector.FixedIndex);
Sidedef.Fields.BeforeFieldsChange();
//apply changes
- Sidedef.Fields["light"] = new UniValue(UniversalType.Integer, newLight);
- mode.SetActionResult("Changed wall brightness to " + newLight + ".");
+ UDMFTools.SetInteger(Sidedef.Fields, "light", newlight, (absolute ? int.MinValue : 0));
+ Tools.UpdateLightFogFlag(Sidedef);
+ mode.SetActionResult("Changed wall brightness to " + newlight + ".");
Sector.Sector.UpdateCache();
//rebuild sector
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
index e3d14ad3..03a418b9 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
@@ -101,6 +101,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
public Sidedef sidedef;
public float offsetx;
+ public float scaleX; //mxd
public float scaleY; //mxd
private Sidedef controlside; //mxd
@@ -2435,32 +2436,32 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
//get target brightness
- int targetBrightness;
+ int targetbrightness;
if(highlighted is VisualFloor)
{
VisualFloor v = highlighted as VisualFloor;
- targetBrightness = v.Level.sector.Fields.GetValue("lightfloor", 0);
+ targetbrightness = v.Level.sector.Fields.GetValue("lightfloor", 0);
if (!v.Level.sector.Fields.GetValue("lightfloorabsolute", false))
{
- targetBrightness += v.Level.sector.Brightness;
+ targetbrightness += v.Level.sector.Brightness;
}
}
else if(highlighted is VisualCeiling)
{
VisualCeiling v = highlighted as VisualCeiling;
- targetBrightness = v.Level.sector.Fields.GetValue("lightceiling", 0);
+ targetbrightness = v.Level.sector.Fields.GetValue("lightceiling", 0);
if(!v.Level.sector.Fields.GetValue("lightceilingabsolute", false))
{
- targetBrightness += v.Level.sector.Brightness;
+ targetbrightness += v.Level.sector.Brightness;
}
}
else if(highlighted is VisualUpper || highlighted is VisualMiddleSingle || highlighted is VisualMiddleDouble || highlighted is VisualLower)
{
BaseVisualGeometrySidedef v = highlighted as BaseVisualGeometrySidedef;
- targetBrightness = v.Sidedef.Fields.GetValue("light", 0);
+ targetbrightness = v.Sidedef.Fields.GetValue("light", 0);
if(!v.Sidedef.Fields.GetValue("lightabsolute", false))
{
- targetBrightness += v.Sidedef.Sector.Brightness;
+ targetbrightness += v.Sidedef.Sector.Brightness;
}
}
else if(highlighted is VisualMiddle3D)
@@ -2472,10 +2473,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
General.Interface.DisplayStatus(StatusType.Warning, "Highlight a surface, to which you want to match the brightness.");
return;
}
- targetBrightness = sd.Fields.GetValue("light", 0);
+ targetbrightness = sd.Fields.GetValue("light", 0);
if(!sd.Fields.GetValue("lightabsolute", false))
{
- targetBrightness += sd.Sector.Brightness;
+ targetbrightness += sd.Sector.Brightness;
}
}
@@ -2487,7 +2488,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
//make undo
CreateUndo("Match Brightness");
- targetBrightness = General.Clamp(targetBrightness, 0, 255);
+ targetbrightness = General.Clamp(targetbrightness, 0, 255);
//apply new brightness
foreach (IVisualEventReceiver obj in selectedobjects)
@@ -2502,11 +2503,11 @@ namespace CodeImp.DoomBuilder.BuilderModes
if (v.Level.sector.Fields.GetValue("lightfloorabsolute", false))
{
- v.Level.sector.Fields["lightfloor"] = new UniValue(UniversalType.Integer, targetBrightness);
+ UDMFTools.SetInteger(v.Level.sector.Fields, "lightfloor", targetbrightness, 0);
}
else
{
- v.Level.sector.Fields["lightfloor"] = new UniValue(UniversalType.Integer, targetBrightness - v.Level.sector.Brightness);
+ v.Level.sector.Fields["lightfloor"] = new UniValue(UniversalType.Integer, targetbrightness - v.Level.sector.Brightness);
}
v.Sector.UpdateSectorGeometry(false);
@@ -2519,11 +2520,11 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(v.Level.sector.Fields.GetValue("lightceilingabsolute", false))
{
- v.Level.sector.Fields["lightceiling"] = new UniValue(UniversalType.Integer, targetBrightness);
+ UDMFTools.SetInteger(v.Level.sector.Fields, "lightceiling", targetbrightness, 0);
}
else
{
- v.Level.sector.Fields["lightceiling"] = new UniValue(UniversalType.Integer, targetBrightness - v.Level.sector.Brightness);
+ v.Level.sector.Fields["lightceiling"] = new UniValue(UniversalType.Integer, targetbrightness - v.Level.sector.Brightness);
}
v.Sector.UpdateSectorGeometry(false);
@@ -2536,16 +2537,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
if (v.Sidedef.Fields.GetValue("lightabsolute", false))
{
- v.Sidedef.Fields["light"] = new UniValue(UniversalType.Integer, targetBrightness);
+ UDMFTools.SetInteger(v.Sidedef.Fields, "light", targetbrightness, 0);
}
else
{
- v.Sidedef.Fields["light"] = new UniValue(UniversalType.Integer, targetBrightness - v.Sidedef.Sector.Brightness);
+ v.Sidedef.Fields["light"] = new UniValue(UniversalType.Integer, targetbrightness - v.Sidedef.Sector.Brightness);
}
+
+ //Update 'lightfog' flag
+ Tools.UpdateLightFogFlag(v.Sidedef);
}
}
- //done
+ //Done
General.Interface.DisplayStatus(StatusType.Action, "Matched brightness for " + selectedobjects.Count + " surfaces.");
Interface_OnSectorEditFormValuesChanged(this, EventArgs.Empty);
}
@@ -3498,7 +3502,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
internal void AutoAlignTextures(BaseVisualGeometrySidedef start, ImageData texture, bool alignx, bool aligny, bool resetsidemarks, bool checkSelectedSidedefParts)
{
if(General.Map.UDMF)
- AutoAlignTexturesUdmf(start, texture, alignx, aligny, resetsidemarks, checkSelectedSidedefParts);
+ AutoAlignTexturesUDMF(start, texture, alignx, aligny, resetsidemarks, checkSelectedSidedefParts);
else
AutoAlignTextures(start, texture, alignx, aligny, resetsidemarks);
}
@@ -3606,7 +3610,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// When resetsidemarks is set to true, all sidedefs will first be marked false (not aligned).
// Setting resetsidemarks to false is usefull to align only within a specific selection
// (set the marked property to true for the sidedefs outside the selection)
- private void AutoAlignTexturesUdmf(BaseVisualGeometrySidedef start, ImageData texture, bool alignx, bool aligny, bool resetsidemarks, bool checkSelectedSidedefParts)
+ private void AutoAlignTexturesUDMF(BaseVisualGeometrySidedef start, ImageData texture, bool alignx, bool aligny, bool resetsidemarks, bool checkSelectedSidedefParts)
{
// Mark all sidedefs false (they will be marked true when the texture is aligned)
if(resetsidemarks) General.Map.Map.ClearMarkedSidedefs(false);
@@ -3639,17 +3643,20 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
}
- //mxd. scaleY
+ //mxd. Scale
switch(start.GeometryType)
{
case VisualGeometryType.WALL_UPPER:
+ first.scaleX = start.Sidedef.Fields.GetValue("scalex_top", 1.0f);
first.scaleY = start.Sidedef.Fields.GetValue("scaley_top", 1.0f);
break;
case VisualGeometryType.WALL_MIDDLE:
case VisualGeometryType.WALL_MIDDLE_3D:
+ first.scaleX = first.controlSide.Fields.GetValue("scalex_mid", 1.0f);
first.scaleY = first.controlSide.Fields.GetValue("scaley_mid", 1.0f);
break;
case VisualGeometryType.WALL_LOWER:
+ first.scaleX = start.Sidedef.Fields.GetValue("scalex_bottom", 1.0f);
first.scaleY = start.Sidedef.Fields.GetValue("scaley_bottom", 1.0f);
break;
}
@@ -3701,7 +3708,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
Vertex v;
float forwardoffset;
float backwardoffset;
- float offsetscalex = 1.0f;
// Get the align job to do
SidedefAlignJob j = todo.Pop();
@@ -3720,21 +3726,26 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
if(!matchbottom && !matchtop && !matchmid) continue; //mxd
-
- if(matchtop)
- offsetscalex = j.sidedef.Fields.GetValue("scalex_top", 1.0f);
- else if(matchbottom)
- offsetscalex = j.sidedef.Fields.GetValue("scalex_bottom", 1.0f);
- else if(matchmid)
- offsetscalex = j.controlSide.Fields.GetValue("scalex_mid", 1.0f);
j.sidedef.Fields.BeforeFieldsChange();
j.controlSide.Fields.BeforeFieldsChange(); //mxd
- //mxd. Apply scaleY
- if(matchtop) UDMFTools.SetFloat(j.sidedef.Fields, "scaley_top", j.scaleY, 1.0f);
- if(matchmid) UDMFTools.SetFloat(j.controlSide.Fields, "scaley_mid", j.scaleY, 1.0f);
- if(matchbottom) UDMFTools.SetFloat(j.sidedef.Fields, "scaley_bottom", j.scaleY, 1.0f);
+ //mxd. Apply Scale
+ if(matchtop)
+ {
+ UDMFTools.SetFloat(j.sidedef.Fields, "scalex_top", first.scaleX, 1.0f);
+ UDMFTools.SetFloat(j.sidedef.Fields, "scaley_top", j.scaleY, 1.0f);
+ }
+ if(matchmid)
+ {
+ UDMFTools.SetFloat(j.controlSide.Fields, "scalex_mid", first.scaleX, 1.0f);
+ UDMFTools.SetFloat(j.controlSide.Fields, "scaley_mid", j.scaleY, 1.0f);
+ }
+ if(matchbottom)
+ {
+ UDMFTools.SetFloat(j.sidedef.Fields, "scalex_bottom", first.scaleX, 1.0f);
+ UDMFTools.SetFloat(j.sidedef.Fields, "scaley_bottom", j.scaleY, 1.0f);
+ }
if(j.forward)
{
@@ -3806,7 +3817,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
}
- forwardoffset = j.offsetx + (int)Math.Round(j.sidedef.Line.Length / scalex * offsetscalex);
+ forwardoffset = j.offsetx + (int)Math.Round(j.sidedef.Line.Length / scalex * first.scaleX);
backwardoffset = j.offsetx;
// Done this sidedef
@@ -3826,7 +3837,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Apply alignment
if(alignx)
{
- float offset = j.offsetx - (int)Math.Round(j.sidedef.Line.Length / scalex * offsetscalex);
+ float offset = j.offsetx - (int)Math.Round(j.sidedef.Line.Length / scalex * first.scaleX);
offset -= j.sidedef.OffsetX;
if(matchtop)
@@ -3890,7 +3901,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
}
forwardoffset = j.offsetx;
- backwardoffset = j.offsetx - (int)Math.Round(j.sidedef.Line.Length / scalex * offsetscalex);
+ backwardoffset = j.offsetx - (int)Math.Round(j.sidedef.Line.Length / scalex * first.scaleX);
// Done this sidedef
j.sidedef.Marked = true;
diff --git a/Source/Plugins/BuilderModes/VisualModes/SectorLevelComparer.cs b/Source/Plugins/BuilderModes/VisualModes/SectorLevelComparer.cs
index af65402e..08dd08b5 100644
--- a/Source/Plugins/BuilderModes/VisualModes/SectorLevelComparer.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/SectorLevelComparer.cs
@@ -23,7 +23,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Comparer
public int Compare(SectorLevel x, SectorLevel y)
{
- return Math.Sign(x.plane.GetZ(center) - y.plane.GetZ(center));
+ return (x == y ? 0 : Math.Sign(x.plane.GetZ(center) - y.plane.GetZ(center))); //mxd. Added equality check
}
}
}