mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-26 22:01:45 +00:00
Sector drawing: basic properties (textures, brightness, floor and ceiling height) are now taken from the nearest sector when a new isolated sector (e.g. a sector, which doesn't not intersect with already existing map geometry and is not inside of it) is drawn.
Visual mode: when "Synch camera position" setting is enabled, and the cursor was outside of a sector when entering Visual mode, camera height is now adjusted based on nearest sector (previously the height was adjusted only when the cursor was inside of a sector). "Auto-align textures X", "Auto-align textures X and Y" actions, UDMF: alignment source sidedef part's horizontal scale is now applied to all aligned sidedefs. Visual mode, UDMF: 'lightfog' flag is now automatically updated when changing sidedef brightness or using "Match Brightness" action. Linedefs mode: added "Update 'lightfog' flag" menu item. Game configurations: cosmetic changes in UDMF linedef flag names. Updated ZDoom_DECORATE.cfg.
This commit is contained in:
parent
3d3905e31c
commit
133e1367d8
13 changed files with 223 additions and 133 deletions
|
@ -15,7 +15,7 @@ skills
|
|||
linedefflags
|
||||
{
|
||||
1 = "Impassable";
|
||||
2 = "Block Monster";
|
||||
2 = "Block Monsters";
|
||||
4 = "Double Sided";
|
||||
8 = "Upper Unpegged";
|
||||
16 = "Lower Unpegged";
|
||||
|
|
|
@ -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)";
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
||||
/// <summary>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</summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -123,12 +123,12 @@
|
|||
<metadata name="menustrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="globalstrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>118, 17</value>
|
||||
</metadata>
|
||||
<metadata name="globalstrip.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="globalstrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>118, 17</value>
|
||||
</metadata>
|
||||
<metadata name="manualstrip.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue