diff --git a/Build/Scripting/ZDoom_DECORATE.cfg b/Build/Scripting/ZDoom_DECORATE.cfg index fdf9bf4..6ed7eb7 100644 --- a/Build/Scripting/ZDoom_DECORATE.cfg +++ b/Build/Scripting/ZDoom_DECORATE.cfg @@ -1146,6 +1146,7 @@ constants TF_USEACTORFOG; TF_NOJUMP; TF_OVERRIDE; + TF_SENSITIVEZ; TIF_NOTAKEINFINITE; VAF_DMGTYPEAPPLYTODIRECT; WARPF_ABSOLUTEOFFSET; diff --git a/Source/Core/GZBuilder/Data/MapInfo.cs b/Source/Core/GZBuilder/Data/MapInfo.cs index 4900524..19e390f 100644 --- a/Source/Core/GZBuilder/Data/MapInfo.cs +++ b/Source/Core/GZBuilder/Data/MapInfo.cs @@ -62,6 +62,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Data { vertwallshade = 16; horizwallshade = -16; + fogdensity = 255; + outsidefogdensity = 255; } #endregion diff --git a/Source/Core/GZBuilder/GZDoom/GldefsParser.cs b/Source/Core/GZBuilder/GZDoom/GldefsParser.cs index c057451..cf0d88e 100644 --- a/Source/Core/GZBuilder/GZDoom/GldefsParser.cs +++ b/Source/Core/GZBuilder/GZDoom/GldefsParser.cs @@ -147,7 +147,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom // Find classname SkipWhitespace(true); - string lightname = StripTokenQuotes(ReadToken()).ToLowerInvariant(); + string lightname = StripTokenQuotes(ReadToken()); if (string.IsNullOrEmpty(lightname)) { @@ -442,7 +442,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom SkipWhitespace(true); // Read object class - string objectclass = StripTokenQuotes(ReadToken()).ToLowerInvariant(); + string objectclass = StripTokenQuotes(ReadToken()); if (string.IsNullOrEmpty(objectclass)) { @@ -479,7 +479,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom else if (!foundlight && foundframe && token == "light") // Just use first light and be done with it { SkipWhitespace(true); - token = ReadToken().ToLowerInvariant(); // Should be light name + token = ReadToken(); // Should be light name if (!string.IsNullOrEmpty(token)) { diff --git a/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs b/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs index 0e05d25..b323486 100644 --- a/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs +++ b/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs @@ -81,8 +81,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom while (SkipWhitespace(true)) { string token = ReadToken().ToLowerInvariant(); - if (string.IsNullOrEmpty(token)) break; - bool stopparsing = false; + if (string.IsNullOrEmpty(token) || token == "$gzdb_skip") break; switch (token) { @@ -158,20 +157,14 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom case "spawnnums": if (!ParseSpawnNums()) return false; break; - - case "$gzdb_skip": - stopparsing = true; // Finished with this file - break; } - - if (stopparsing) break; } // Check values - if (mapinfo.FadeColor.Red > 0 || mapinfo.FadeColor.Green > 0 || mapinfo.FadeColor.Blue > 0) + if (mapinfo.FogDensity > 0 && (mapinfo.FadeColor.Red > 0 || mapinfo.FadeColor.Green > 0 || mapinfo.FadeColor.Blue > 0)) mapinfo.HasFadeColor = true; - if (mapinfo.OutsideFogColor.Red > 0 || mapinfo.OutsideFogColor.Green > 0 || mapinfo.OutsideFogColor.Blue > 0) + if (mapinfo.OutsideFogDensity > 0 && (mapinfo.OutsideFogColor.Red > 0 || mapinfo.OutsideFogColor.Green > 0 || mapinfo.OutsideFogColor.Blue > 0)) mapinfo.HasOutsideFogColor = true; // All done @@ -649,10 +642,9 @@ namespace CodeImp.DoomBuilder.GZBuilder.GZDoom return false; } - if (densitytype == "fogdensity") - mapinfo.FogDensity = (int)(1024 * (256.0f / val)); - else - mapinfo.OutsideFogDensity = (int)(1024 * (256.0f / val)); + val = Math.Max(0, val); + if (densitytype == "fogdensity") mapinfo.FogDensity = val; + else mapinfo.OutsideFogDensity = val; // All done here return true; diff --git a/Source/Core/Map/Sector.cs b/Source/Core/Map/Sector.cs index 65b5bdf..772082a 100644 --- a/Source/Core/Map/Sector.cs +++ b/Source/Core/Map/Sector.cs @@ -29,7 +29,16 @@ using SlimDX; namespace CodeImp.DoomBuilder.Map { - public sealed class Sector : SelectableElement + public enum SectorFogMode //mxd + { + NONE, // no fog + CLASSIC, // black fog when sector brightness < 243 + FOGDENSITY, // sector uses "fogdensity" MAPINFO property + OUTSIDEFOGDENSITY, // sector uses "outsidefogdensity" MAPINFO property + FADE // sector uses UDMF "fade" sector property + } + + public sealed class Sector : SelectableElement { #region ================== Constants @@ -76,13 +85,12 @@ namespace CodeImp.DoomBuilder.Map private ReadOnlyCollection labels; private readonly SurfaceEntryCollection surfaceentries; - //mxd. Rendering - private Color4 fogColor; - private bool hasFogColor; - private bool useOutsideFog; + //mxd. Rendering + private Color4 fogcolor; + private SectorFogMode fogmode; - //mxd. Slopes - private Vector3D floorslope; + //mxd. Slopes + private Vector3D floorslope; private float flooroffset; private Vector3D ceilslope; private float ceiloffset; @@ -117,13 +125,12 @@ namespace CodeImp.DoomBuilder.Map public FlatVertex[] FlatVertices { get { return flatvertices; } } public ReadOnlyCollection Labels { get { return labels; } } - //mxd. Rednering - public Color4 FogColor { get { return fogColor; } } - public bool HasFogColor { get { return hasFogColor; } } - public bool UsesOutsideFog { get { return useOutsideFog; } } + //mxd. Rednering + public Color4 FogColor { get { return fogcolor; } } + public SectorFogMode FogMode { get { return fogmode; } } - //mxd. Slopes - public Vector3D FloorSlope { get { return floorslope; } set { BeforePropsChange(); floorslope = value; updateneeded = true; } } + //mxd. Slopes + public Vector3D FloorSlope { get { return floorslope; } set { BeforePropsChange(); floorslope = value; updateneeded = true; } } public float FloorSlopeOffset { get { return flooroffset; } set { BeforePropsChange(); flooroffset = value; updateneeded = true; } } public Vector3D CeilSlope { get { return ceilslope; } set { BeforePropsChange(); ceilslope = value; updateneeded = true; } } public float CeilSlopeOffset { get { return ceiloffset; } set { BeforePropsChange(); ceiloffset = value; updateneeded = true; } } @@ -473,11 +480,10 @@ namespace CodeImp.DoomBuilder.Map this.Fields.Clear(); if(isvirtual) this.Fields.Add(MapSet.VirtualSectorField, MapSet.VirtualSectorValue); this.Flags.Clear(); - hasFogColor = false; - useOutsideFog = false; + this.fogmode = SectorFogMode.NONE; - // Reset Slopes - floorslope = new Vector3D(); + // Reset Slopes + floorslope = new Vector3D(); flooroffset = 0; ceilslope = new Vector3D(); ceiloffset = 0; @@ -881,20 +887,29 @@ namespace CodeImp.DoomBuilder.Map //mxd public void UpdateFogColor() { - // Sector uses outisde fog when it's ceiling is sky or Sector_Outside effect (87) is set - useOutsideFog = (General.Map.Data.MapInfo.HasOutsideFogColor && (ceiltexname == General.Map.Config.SkyFlatName || (effect == 87 && General.Map.Config.SectorEffects.ContainsKey(effect)))); - - if(General.Map.UDMF && Fields.ContainsKey("fadecolor")) - fogColor = new Color4((int)Fields["fadecolor"].Value); - else if(useOutsideFog) - fogColor = General.Map.Data.MapInfo.OutsideFogColor; - else if(General.Map.Data.MapInfo.HasFadeColor) - fogColor = General.Map.Data.MapInfo.FadeColor; - else - fogColor = new Color4(); - - hasFogColor = fogColor.Red > 0 || fogColor.Green > 0 || fogColor.Blue > 0; - } + if (General.Map.UDMF && Fields.ContainsKey("fadecolor")) + { + fogcolor = new Color4((int)Fields["fadecolor"].Value); + fogmode = SectorFogMode.FADE; + } + // Sector uses outisde fog when it's ceiling is sky or Sector_Outside effect (87) is set + else if (General.Map.Data.MapInfo.HasOutsideFogColor && + (ceiltexname == General.Map.Config.SkyFlatName || (effect == 87 && General.Map.Config.SectorEffects.ContainsKey(effect)))) + { + fogcolor = General.Map.Data.MapInfo.OutsideFogColor; + fogmode = SectorFogMode.OUTSIDEFOGDENSITY; + } + else if (General.Map.Data.MapInfo.HasFadeColor) + { + fogcolor = General.Map.Data.MapInfo.FadeColor; + fogmode = SectorFogMode.FOGDENSITY; + } + else + { + fogcolor = new Color4(); + fogmode = (brightness < 248 ? SectorFogMode.CLASSIC : SectorFogMode.NONE); + } + } #endregion } diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs index adf9418..72621af 100644 --- a/Source/Core/Rendering/Renderer3D.cs +++ b/Source/Core/Rendering/Renderer3D.cs @@ -768,9 +768,9 @@ namespace CodeImp.DoomBuilder.Rendering // Determine the shader pass we want to use for this object int wantedshaderpass = (((g == highlighted) && showhighlight) || (g.Selected && showselection)) ? highshaderpass : shaderpass; - //mxd. Render fog? - if(General.Settings.GZDrawFog && !fullbrightness && sector.Sector.Brightness < 248) - wantedshaderpass += 8; + //mxd. Render fog? + if (General.Settings.GZDrawFog && !fullbrightness && sector.Sector.FogMode != SectorFogMode.NONE) + wantedshaderpass += 8; // Switch shader pass? if(currentshaderpass != wantedshaderpass) @@ -846,9 +846,9 @@ namespace CodeImp.DoomBuilder.Rendering // Determine the shader pass we want to use for this object int wantedshaderpass = (((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass; - //mxd. If fog is enagled, switch to shader, which calculates it - if(General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && (t.Thing.Sector.HasFogColor || t.Thing.Sector.Brightness < 248)) - wantedshaderpass += 8; + //mxd. If fog is enagled, switch to shader, which calculates it + if (General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && t.Thing.Sector.FogMode != SectorFogMode.NONE) + wantedshaderpass += 8; //mxd. Create the matrix for positioning world = CreateThingPositionMatrix(t); @@ -1046,9 +1046,9 @@ namespace CodeImp.DoomBuilder.Rendering // Determine the shader pass we want to use for this object int wantedshaderpass = (((g == highlighted) && showhighlight) || (g.Selected && showselection)) ? highshaderpass : shaderpass; - //mxd. Render fog? - if(General.Settings.GZDrawFog && !fullbrightness && sector.Sector.Brightness < 248) - wantedshaderpass += 8; + //mxd. Render fog? + if (General.Settings.GZDrawFog && !fullbrightness && sector.Sector.FogMode != SectorFogMode.NONE) + wantedshaderpass += 8; // Switch shader pass? if(currentshaderpass != wantedshaderpass) @@ -1155,9 +1155,9 @@ namespace CodeImp.DoomBuilder.Rendering // Determine the shader pass we want to use for this object int wantedshaderpass = (((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass; - //mxd. if fog is enagled, switch to shader, which calculates it - if(General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && (t.Thing.Sector.HasFogColor || t.Thing.Sector.Brightness < 248)) - wantedshaderpass += 8; + //mxd. if fog is enagled, switch to shader, which calculates it + if (General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && t.Thing.Sector.FogMode != SectorFogMode.NONE) + wantedshaderpass += 8; //mxd. Create the matrix for positioning world = CreateThingPositionMatrix(t); @@ -1408,9 +1408,9 @@ namespace CodeImp.DoomBuilder.Rendering // Determine the shader pass we want to use for this object int wantedshaderpass = ((((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass); - //mxd. if fog is enagled, switch to shader, which calculates it - if(General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && (t.Thing.Sector.HasFogColor || t.Thing.Sector.Brightness < 248)) - wantedshaderpass += 8; + //mxd. if fog is enagled, switch to shader, which calculates it + if (General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && t.Thing.Sector.FogMode != SectorFogMode.NONE) + wantedshaderpass += 8; // Switch shader pass? if(currentshaderpass != wantedshaderpass) @@ -1509,9 +1509,9 @@ namespace CodeImp.DoomBuilder.Rendering // Determine the shader pass we want to use for this object int wantedshaderpass = ((((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass); - //mxd. if fog is enagled, switch to shader, which calculates it - if(General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && (t.Thing.Sector.HasFogColor || t.Thing.Sector.Brightness < 248)) - wantedshaderpass += 8; + //mxd. if fog is enagled, switch to shader, which calculates it + if (General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && t.Thing.Sector.FogMode != SectorFogMode.NONE) + wantedshaderpass += 8; // Switch shader pass? if(currentshaderpass != wantedshaderpass) diff --git a/Source/Core/VisualModes/VisualGeometry.cs b/Source/Core/VisualModes/VisualGeometry.cs index a66dda6..c3834cd 100644 --- a/Source/Core/VisualModes/VisualGeometry.cs +++ b/Source/Core/VisualModes/VisualGeometry.cs @@ -198,40 +198,44 @@ namespace CodeImp.DoomBuilder.VisualModes boundingBox = BoundingBoxTools.CalculateBoundingPlane(bbs); } - //mxd. Calculate fogdistance - //TODO: this doesn't match any GZDoom light mode... - //GZDoom: gl_renderstate.h, SetFog(); - //GZDoom: gl_lightlevel.cpp gl_SetFog(); - protected float CalculateFogDensity(int brightness) - { - float density; - if(Sector.Sector.UsesOutsideFog && General.Map.Data.MapInfo.OutsideFogDensity > 0) - { - density = General.Map.Data.MapInfo.OutsideFogDensity; - } - else if(!Sector.Sector.UsesOutsideFog && General.Map.Data.MapInfo.FogDensity > 0) - { - density = General.Map.Data.MapInfo.FogDensity; - } - else if(brightness < 248) - { - density = General.Clamp(255 - brightness, 30, 255); - } - else - { - density = 0f; - } + //mxd. Calculate fogdistance + //TODO: this doesn't match any GZDoom light mode... + //GZDoom: gl_renderstate.h, SetFog(); + //GZDoom: gl_lightlevel.cpp gl_SetFog(); + protected float CalculateFogFactor(int brightness) { return CalculateFogFactor(Sector.Sector.FogMode, brightness); } + public static float CalculateFogFactor(SectorFogMode mode, int brightness) + { + float density; + switch (mode) + { + case SectorFogMode.OUTSIDEFOGDENSITY: + density = General.Map.Data.MapInfo.OutsideFogDensity; + break; - if(Sector.Sector.HasFogColor) - { - density *= 4; - } + case SectorFogMode.FOGDENSITY: + density = General.Map.Data.MapInfo.FogDensity; + break; - return density * FOG_DENSITY_SCALER; - } + case SectorFogMode.FADE: + density = General.Clamp(255 - brightness, 30, 255) * 4; + break; - //mxd. Used to get proper sector from 3d-floors - public virtual Sector GetControlSector() + case SectorFogMode.CLASSIC: + density = General.Clamp(255 - brightness, 30, 255); + break; + + case SectorFogMode.NONE: + density = 0f; + break; + + default: throw new NotImplementedException("Unknown SectorFogMode!"); + } + + return density * FOG_DENSITY_SCALER; + } + + //mxd. Used to get proper sector from 3d-floors + public virtual Sector GetControlSector() { return sector.Sector; } diff --git a/Source/Core/VisualModes/VisualMode.cs b/Source/Core/VisualModes/VisualMode.cs index d8c34dc..d45c4ea 100644 --- a/Source/Core/VisualModes/VisualMode.cs +++ b/Source/Core/VisualModes/VisualMode.cs @@ -73,8 +73,8 @@ namespace CodeImp.DoomBuilder.VisualModes protected Dictionary allthings; protected Dictionary allsectors; protected List visibleblocks; - protected List visiblethings; - protected Dictionary visiblesectors; + protected Dictionary visiblethings; + protected Dictionary visiblesectors; protected List visiblegeometry; #endregion @@ -102,12 +102,12 @@ namespace CodeImp.DoomBuilder.VisualModes this.renderer = General.Map.Renderer3D; this.blockmap = new VisualBlockMap(); this.allsectors = new Dictionary(General.Map.Map.Sectors.Count); - this.allthings = new Dictionary(General.Map.Map.Things.Count); - this.visibleblocks = new List(); + this.allthings = new Dictionary(General.Map.Map.Things.Count); + this.visibleblocks = new List(); this.visiblesectors = new Dictionary(50); this.visiblegeometry = new List(200); - this.visiblethings = new List(100); - this.processgeometry = true; + this.visiblethings = new Dictionary(100); + this.processgeometry = true; this.processthings = true; this.vertices = new Dictionary(); //mxd @@ -515,10 +515,10 @@ namespace CodeImp.DoomBuilder.VisualModes // Make collections visiblesectors = new Dictionary(visiblesectors.Count); visiblegeometry = new List(visiblegeometry.Capacity); - visiblethings = new List(visiblethings.Capacity); + visiblethings = new Dictionary(visiblethings.Count); - // Get the blocks within view range - visibleblocks = blockmap.GetFrustumRange(renderer.Frustum2D); + // Get the blocks within view range + visibleblocks = blockmap.GetFrustumRange(renderer.Frustum2D); // Fill collections with geometry and things foreach(VisualBlockEntry block in visibleblocks) @@ -569,11 +569,11 @@ namespace CodeImp.DoomBuilder.VisualModes allthings.Add(t, vt); } - if(vt != null) - { - visiblethings.Add(vt); - } - } + if (vt != null && !visiblethings.ContainsKey(vt.Thing)) + { + visiblethings.Add(vt.Thing, vt); + } + } } } @@ -797,12 +797,12 @@ namespace CodeImp.DoomBuilder.VisualModes } } } - - // Add all the visible things - foreach(VisualThing vt in visiblethings) pickables.Add(vt); - //mxd. And all visual vertices - if(General.Map.UDMF && General.Settings.GZShowVisualVertices) + // Add all the visible things + foreach (VisualThing vt in visiblethings.Values) pickables.Add(vt); + + //mxd. And all visual vertices + if (General.Map.UDMF && General.Settings.GZShowVisualVertices) { foreach(KeyValuePair pair in vertices) pickables.AddRange(pair.Value.Vertices); diff --git a/Source/Core/ZDoom/ActorStructure.cs b/Source/Core/ZDoom/ActorStructure.cs index 64c0820..fc99f25 100644 --- a/Source/Core/ZDoom/ActorStructure.cs +++ b/Source/Core/ZDoom/ActorStructure.cs @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Globalization; using CodeImp.DoomBuilder.Config; +using CodeImp.DoomBuilder.Data; #endregion @@ -590,6 +591,8 @@ namespace CodeImp.DoomBuilder.ZDoom if(HasPropertyWithValue("$sprite")) { string sprite = GetPropertyValueString("$sprite", 0); //mxd + if ((sprite.Length > DataManager.INTERNAL_PREFIX.Length) && + sprite.ToLowerInvariant().StartsWith(DataManager.INTERNAL_PREFIX)) return sprite; //mxd if (General.Map.Data.GetSpriteExists(sprite)) return sprite; //mxd. Added availability check //mxd. Bitch and moan diff --git a/Source/Core/ZDoom/DecorateParser.cs b/Source/Core/ZDoom/DecorateParser.cs index 6844e34..b1f582d 100644 --- a/Source/Core/ZDoom/DecorateParser.cs +++ b/Source/Core/ZDoom/DecorateParser.cs @@ -84,11 +84,11 @@ namespace CodeImp.DoomBuilder.ZDoom // Syntax whitespace = "\n \t\r\u00A0"; //mxd. non-breaking space is also space :) specialtokens = ":{}+-\n;,"; - - // Initialize - actors = new Dictionary(StringComparer.Ordinal); - archivedactors = new Dictionary(StringComparer.Ordinal); - parsedlumps = new HashSet(StringComparer.OrdinalIgnoreCase); //mxd + + // Initialize + actors = new Dictionary(StringComparer.OrdinalIgnoreCase); + archivedactors = new Dictionary(StringComparer.OrdinalIgnoreCase); + parsedlumps = new HashSet(StringComparer.OrdinalIgnoreCase); //mxd } // Disposer @@ -124,7 +124,8 @@ namespace CodeImp.DoomBuilder.ZDoom if(!string.IsNullOrEmpty(objdeclaration)) { objdeclaration = objdeclaration.ToLowerInvariant(); - switch(objdeclaration) + if (objdeclaration == "$gzdb_skip") break; + switch (objdeclaration) { case "actor": { @@ -226,8 +227,6 @@ namespace CodeImp.DoomBuilder.ZDoom } break; - case "$gzdb_skip": break; - default: { // Unknown structure! diff --git a/Source/Core/ZDoom/TexturesParser.cs b/Source/Core/ZDoom/TexturesParser.cs index ae213f0..4e61fb9 100644 --- a/Source/Core/ZDoom/TexturesParser.cs +++ b/Source/Core/ZDoom/TexturesParser.cs @@ -77,12 +77,23 @@ namespace CodeImp.DoomBuilder.ZDoom { if(!base.Parse(stream, sourcefilename, clearerrors)) return false; - //mxd. Make vitrual path from filename - string virtualpath = sourcefilename.Substring(8).TrimStart(pathtrimchars); - if(virtualpath.ToLowerInvariant() == "txt") virtualpath = string.Empty; - - // Continue until at the end of the stream - while(SkipWhitespace(true)) + //mxd. Make vitrual path from filename + string virtualpath; + if (sourcefilename.Contains("#")) // It's TEXTURES lump + { + virtualpath = Path.GetFileName(sourcefilename); + if (!string.IsNullOrEmpty(virtualpath)) virtualpath = virtualpath.Substring(0, virtualpath.LastIndexOf("#", StringComparison.Ordinal)); + } + else // If it's actual filename, try to use extension(s) as virtualpath + { + virtualpath = Path.GetFileName(sourcefilename); + if (!string.IsNullOrEmpty(virtualpath)) virtualpath = virtualpath.Substring(8).TrimStart(pathtrimchars); + if (!string.IsNullOrEmpty(virtualpath) && virtualpath.ToLowerInvariant() == "txt") virtualpath = string.Empty; + if (string.IsNullOrEmpty(virtualpath)) virtualpath = "[TEXTURES]"; + } + + // Continue until at the end of the stream + while (SkipWhitespace(true)) { // Read a token string objdeclaration = ReadToken(); @@ -194,9 +205,9 @@ namespace CodeImp.DoomBuilder.ZDoom } break; - case "$gzdb_skip": break; - - default: + case "$gzdb_skip": return !this.HasError; + + default: { // Unknown structure! // Best we can do now is just find the first { and then diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs index f39ad3c..391bcf6 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs @@ -215,20 +215,28 @@ namespace CodeImp.DoomBuilder.BuilderModes WallPolygon np = SplitPoly(ref p, plane, false); if(np.Count > 0) { - //mxd. Determine color - int lightlevel; + if (l.type == SectorLevelType.Glow) + { + //mxd. Glow levels should not affect light level + np.color = p.color; + } + else + { + //mxd. Determine color + int lightlevel; - // Sidedef part is not affected by 3d floor brightness - if(l.disablelighting || !l.extrafloor) - lightlevel = (lightabsolute ? lightvalue : l.brightnessbelow + lightvalue); - // 3d floor transfers brightness below it ignoring sidedef's brightness - else - lightlevel = l.brightnessbelow; + // Sidedef part is not affected by 3d floor brightness + if (l.type != SectorLevelType.Light && (l.disablelighting || !l.extrafloor)) + lightlevel = (lightabsolute ? lightvalue : l.brightnessbelow + lightvalue); + // 3d floors and light transfer effects transfers brightness below them ignoring sidedef's brightness + else + lightlevel = l.brightnessbelow; - PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef)); //mxd - np.color = PixelColor.Modulate(l.colorbelow, wallbrightness).WithAlpha(255).ToInt(); + PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef)); //mxd + np.color = PixelColor.Modulate(l.colorbelow, wallbrightness).WithAlpha(255).ToInt(); + } - if(p.Count == 0) + if (p.Count == 0) { polygons[pi] = np; } diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs index 2ad40d8..24d5275 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs @@ -1377,7 +1377,7 @@ namespace CodeImp.DoomBuilder.BuilderModes renderer.DrawThingCages = ((BuilderPlug.Me.ShowVisualThings & 2) != 0); // Render all visible things - foreach(VisualThing t in visiblethings) + foreach(VisualThing t in visiblethings.Values) renderer.AddThingGeometry(t); } diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs index 995c2ae..7e92263 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs @@ -226,21 +226,24 @@ namespace CodeImp.DoomBuilder.BuilderModes // Level is glowing if(level.affectedbyglow && level.type == SectorLevelType.Floor) { - // Get glow brightness - SectorData glowdata = (level.sector != Thing.Sector ? mode.GetSectorData(level.sector) : sd); - float planez = level.plane.GetZ(thingpos); + // Extrafloor glow doesn't affect thing brightness + if (level.sector == Thing.Sector) + { + float planez = level.plane.GetZ(thingpos); - int glowbrightness = glowdata.FloorGlow.Brightness / 2; - SectorLevel nexthigher = sd.GetLevelAbove(new Vector3D(thingpos, planez)); + // Get glow brightness + int glowbrightness = sd.FloorGlow.Brightness / 2; + SectorLevel nexthigher = sd.GetLevelAbove(new Vector3D(thingpos, planez)); - // Interpolate thing brightness between glow and regular ones - if(nexthigher != null) - { - float higherz = nexthigher.plane.GetZ(thingpos); - float delta = General.Clamp(1.0f - (thingpos.z - planez) / (higherz - planez), 0f, 1f); - brightness = (int)((glowbrightness + level.sector.Brightness / 2) * delta + nexthigher.sector.Brightness * (1.0f - delta)); - } - } + // Interpolate thing brightness between glow and regular ones + if (nexthigher != null) + { + float higherz = nexthigher.plane.GetZ(thingpos); + float delta = General.Clamp(1.0f - (thingpos.z - planez) / (higherz - planez), 0f, 1f); + brightness = (int)((glowbrightness + level.sector.Brightness / 2) * delta + nexthigher.sector.Brightness * (1.0f - delta)); + } + } + } // Level below this one is glowing. Only possible for floor glow(?) else if(level.type == SectorLevelType.Glow) { @@ -260,32 +263,9 @@ namespace CodeImp.DoomBuilder.BuilderModes PixelColor areacolor = PixelColor.Modulate(level.colorbelow, areabrightness); sectorcolor = areacolor.WithAlpha(alpha).ToInt(); - //mxd. Calculate fogfactor - float density; - if(Thing.Sector.UsesOutsideFog && General.Map.Data.MapInfo.OutsideFogDensity > 0) - { - density = General.Map.Data.MapInfo.OutsideFogDensity; - } - else if(!Thing.Sector.UsesOutsideFog && General.Map.Data.MapInfo.FogDensity > 0) - { - density = General.Map.Data.MapInfo.FogDensity; - } - else if(brightness < 248) - { - density = General.Clamp(255 - brightness, 30, 255); - } - else - { - density = 0f; - } - - if(level.sector.HasFogColor) - { - density *= 4; - } - - fogfactor = density * VisualGeometry.FOG_DENSITY_SCALER; - } + //mxd. Calculate fogfactor + fogfactor = VisualGeometry.CalculateFogFactor(level.sector.FogMode, brightness); + } } //TECH: even Bright Thing frames are affected by custom fade... else @@ -293,29 +273,11 @@ namespace CodeImp.DoomBuilder.BuilderModes Vector3D thingpos = new Vector3D(Thing.Position.x, Thing.Position.y, Thing.Position.z + sd.Floor.plane.GetZ(Thing.Position)); SectorLevel level = sd.GetLevelAboveOrAt(thingpos); - if(level != null && level.sector.HasFogColor) - { - //mxd. Calculate fogfactor - float density; - if(Thing.Sector.UsesOutsideFog && General.Map.Data.MapInfo.OutsideFogDensity > 0) - { - density = General.Map.Data.MapInfo.OutsideFogDensity; - } - else if(!Thing.Sector.UsesOutsideFog && General.Map.Data.MapInfo.FogDensity > 0) - { - density = General.Map.Data.MapInfo.FogDensity; - } - else if(level.brightnessbelow < 248) - { - density = General.Clamp(255 - level.brightnessbelow, 30, 255); - } - else - { - density = 0f; - } - - fogfactor = density * VisualGeometry.FOG_DENSITY_SCALER * 4; - } + if (level != null && level.sector.FogMode > SectorFogMode.CLASSIC) + { + //mxd. Calculate fogfactor + fogfactor = VisualGeometry.CalculateFogFactor(level.sector.FogMode, level.brightnessbelow); + } } } diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs index f253257..5c4e537 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs @@ -136,7 +136,7 @@ namespace CodeImp.DoomBuilder.BuilderModes } //mxd. Determine fog density - fogfactor = CalculateFogDensity(targetbrightness); + fogfactor = CalculateFogFactor(targetbrightness); // Make vertices ReadOnlyCollection triverts = Sector.Sector.Triangles.Vertices; diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs index 1975bac..dfed141 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs @@ -137,7 +137,7 @@ namespace CodeImp.DoomBuilder.BuilderModes } //mxd. Determine fog density - fogfactor = CalculateFogDensity(targetbrightness); + fogfactor = CalculateFogFactor(targetbrightness); // Make vertices ReadOnlyCollection triverts = Sector.Sector.Triangles.Vertices; diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFogBoundary.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFogBoundary.cs index 4a64469..297506f 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualFogBoundary.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualFogBoundary.cs @@ -95,9 +95,9 @@ namespace CodeImp.DoomBuilder.BuilderModes // Determine initial color int lightlevel = sd.Ceiling.brightnessbelow + lightvalue; - // Calculate fog density - fogfactor = CalculateFogDensity(lightlevel); - poly.color = PixelColor.INT_WHITE; + // Calculate fog density + fogfactor = CalculateFogFactor(lightlevel); + poly.color = PixelColor.INT_WHITE; // Cut off the part below the other floor and above the other ceiling CropPoly(ref poly, osd.Ceiling.plane, true); @@ -138,11 +138,9 @@ namespace CodeImp.DoomBuilder.BuilderModes private bool IsFogBoundary() { if(Sidedef.Sector.Index == Sidedef.Other.Sector.Index) return false; // There can't be a boundary if both sides are in the same sector. - if(Sidedef.Sector.HasFogColor == Sidedef.Other.Sector.HasFogColor) return false; - if(!Sidedef.Sector.HasFogColor && !Sidedef.Other.Sector.HasFogColor) return false; if(Sidedef.Sector.CeilTexture == General.Map.Config.SkyFlatName && Sidedef.Other.Sector.CeilTexture == General.Map.Config.SkyFlatName) return false; - return true; - } + return (Sidedef.Sector.FogMode > SectorFogMode.CLASSIC && Sidedef.Other.Sector.FogMode <= SectorFogMode.CLASSIC); + } // This performs a fast test in object picking public override bool PickFastReject(Vector3D from, Vector3D to, Vector3D dir) { return false; } diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualLower.cs b/Source/Plugins/BuilderModes/VisualModes/VisualLower.cs index d72e7cb..eb31bb0 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualLower.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualLower.cs @@ -176,8 +176,8 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd. This calculates light with doom-style wall shading PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef)); PixelColor wallcolor = PixelColor.Modulate(sd.Ceiling.colorbelow, wallbrightness); - fogfactor = CalculateFogDensity(lightlevel); - poly.color = wallcolor.WithAlpha(255).ToInt(); + fogfactor = CalculateFogFactor(lightlevel); + poly.color = wallcolor.WithAlpha(255).ToInt(); // Cut off the part above the other floor CropPoly(ref poly, osd.Floor.plane, false); diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs b/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs index 2aa1494..4fd828c 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs @@ -221,8 +221,8 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd. This calculates light with doom-style wall shading PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef)); PixelColor wallcolor = PixelColor.Modulate(sd.Ceiling.colorbelow, wallbrightness); - fogfactor = CalculateFogDensity(lightlevel); - poly.color = wallcolor.WithAlpha(255).ToInt(); + fogfactor = CalculateFogFactor(lightlevel); + poly.color = wallcolor.WithAlpha(255).ToInt(); // Cut off the part above the 3D floor and below the 3D ceiling CropPoly(ref poly, extrafloor.Floor.plane, false); diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleBack.cs b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleBack.cs index 6f91c0f..d07c5e2 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleBack.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleBack.cs @@ -209,10 +209,10 @@ namespace CodeImp.DoomBuilder.BuilderModes byte alpha = (byte)extrafloor.Alpha; if (extrafloor.DontRenderSides) alpha = 0; int wallcolor = PixelColor.Modulate(levelcolor, wallbrightness).WithAlpha(alpha).ToInt(); - fogfactor = CalculateFogDensity(lightlevel); + fogfactor = CalculateFogFactor(lightlevel); - // Cut off the part above the 3D floor and below the 3D ceiling - CropPoly(ref poly, bottom, false); + // Cut off the part above the 3D floor and below the 3D ceiling + CropPoly(ref poly, bottom, false); CropPoly(ref poly, top, false); // Cut out pieces that overlap 3D floors in this sector diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleDouble.cs b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleDouble.cs index e850e5e..f0ebc3c 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleDouble.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleDouble.cs @@ -184,8 +184,8 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd. This calculates light with doom-style wall shading PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef)); PixelColor wallcolor = PixelColor.Modulate(sd.Ceiling.colorbelow, wallbrightness); - fogfactor = CalculateFogDensity(lightlevel); - poly.color = wallcolor.WithAlpha(255).ToInt(); + fogfactor = CalculateFogFactor(lightlevel); + poly.color = wallcolor.WithAlpha(255).ToInt(); // Cut off the part below the other floor and above the other ceiling CropPoly(ref poly, osd.Ceiling.plane, true); diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs index 33353fa..51a4cb1 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs @@ -182,8 +182,8 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd. This calculates light with doom-style wall shading PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef)); PixelColor wallcolor = PixelColor.Modulate(sd.Ceiling.colorbelow, wallbrightness); - fogfactor = CalculateFogDensity(lightlevel); - poly.color = wallcolor.WithAlpha(255).ToInt(); + fogfactor = CalculateFogFactor(lightlevel); + poly.color = wallcolor.WithAlpha(255).ToInt(); // Cut out pieces that overlap 3D floors in this sector List polygons = new List { poly }; diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs b/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs index 4957fba..caf7ce8 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs @@ -171,8 +171,8 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd. This calculates light with doom-style wall shading PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef)); PixelColor wallcolor = PixelColor.Modulate(sd.Ceiling.colorbelow, wallbrightness); - fogfactor = CalculateFogDensity(lightlevel); - poly.color = wallcolor.WithAlpha(255).ToInt(); + fogfactor = CalculateFogFactor(lightlevel); + poly.color = wallcolor.WithAlpha(255).ToInt(); // Cut off the part below the other ceiling CropPoly(ref poly, osd.Ceiling.plane, false);