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