From 0ac4ee5f0c8fc825c7dd8ac261b6051667885e73 Mon Sep 17 00:00:00 2001 From: sphere Date: Thu, 21 Oct 2021 12:21:27 +0200 Subject: [PATCH] Make skywall rendering much more accurate to 2.2, and take horizon lines into account. --- Source/Core/IO/DoomMapSetIO.cs | 3 ++- Source/Core/IO/HexenMapSetIO.cs | 3 ++- Source/Core/IO/IMapSetIO.cs | 3 ++- Source/Core/IO/MapSetIO.cs | 3 ++- Source/Core/IO/SRB2MapSetIO.cs | 1 + Source/Core/IO/UniversalMapSetIO.cs | 3 ++- Source/Core/Map/Linedef.cs | 3 ++- Source/Core/Map/Sidedef.cs | 19 +++++++++++--- .../BuilderModes/VisualModes/VisualCeiling.cs | 3 +-- .../BuilderModes/VisualModes/VisualFloor.cs | 26 ++++++++++++++----- .../BuilderModes/VisualModes/VisualLower.cs | 11 +++++++- .../VisualModes/VisualMiddleSingle.cs | 3 ++- .../BuilderModes/VisualModes/VisualUpper.cs | 1 - 13 files changed, 61 insertions(+), 21 deletions(-) diff --git a/Source/Core/IO/DoomMapSetIO.cs b/Source/Core/IO/DoomMapSetIO.cs index c9672f2..20b8549 100644 --- a/Source/Core/IO/DoomMapSetIO.cs +++ b/Source/Core/IO/DoomMapSetIO.cs @@ -95,7 +95,8 @@ namespace CodeImp.DoomBuilder.IO public override int SlopeVertexType { get { return 9500; } } public override int ColormapType { get { return -1; } } public override int FlatAlignmentType { get { return -1; } } - public override int AxisType { get { return -1; } } + public override int HorizonLineType { get { return -1; } } + public override int AxisType { get { return -1; } } public override int AxisTransferType { get { return -1; } } public override int AxisTransferLineType { get { return -1; } } public override int WaypointType { get { return -1; } } diff --git a/Source/Core/IO/HexenMapSetIO.cs b/Source/Core/IO/HexenMapSetIO.cs index cdc61b0..2ca2cd5 100644 --- a/Source/Core/IO/HexenMapSetIO.cs +++ b/Source/Core/IO/HexenMapSetIO.cs @@ -95,7 +95,8 @@ namespace CodeImp.DoomBuilder.IO public override int SlopeVertexType { get { return 9500; } } public override int ColormapType { get { return -1; } } public override int FlatAlignmentType { get { return -1; } } - public override int AxisType { get { return -1; } } + public override int HorizonLineType { get { return -1; } } + public override int AxisType { get { return -1; } } public override int AxisTransferType { get { return -1; } } public override int AxisTransferLineType { get { return -1; } } public override int WaypointType { get { return -1; } } diff --git a/Source/Core/IO/IMapSetIO.cs b/Source/Core/IO/IMapSetIO.cs index feeb927..11429ec 100644 --- a/Source/Core/IO/IMapSetIO.cs +++ b/Source/Core/IO/IMapSetIO.cs @@ -74,7 +74,8 @@ namespace CodeImp.DoomBuilder.IO int SlopeVertexType { get; } int ColormapType { get; } int FlatAlignmentType { get; } - int AxisType { get; } + int HorizonLineType { get; } + int AxisType { get; } int AxisTransferType { get; } int AxisTransferLineType { get; } int WaypointType { get; } diff --git a/Source/Core/IO/MapSetIO.cs b/Source/Core/IO/MapSetIO.cs index 57c18e7..4fdfde2 100644 --- a/Source/Core/IO/MapSetIO.cs +++ b/Source/Core/IO/MapSetIO.cs @@ -97,7 +97,8 @@ namespace CodeImp.DoomBuilder.IO public abstract int SlopeVertexType { get; } public abstract int ColormapType { get; } public abstract int FlatAlignmentType { get; } - public abstract int AxisType { get; } + public abstract int HorizonLineType { get; } + public abstract int AxisType { get; } public abstract int AxisTransferType { get; } public abstract int AxisTransferLineType { get; } public abstract int WaypointType { get; } diff --git a/Source/Core/IO/SRB2MapSetIO.cs b/Source/Core/IO/SRB2MapSetIO.cs index 9483cf2..f14887b 100644 --- a/Source/Core/IO/SRB2MapSetIO.cs +++ b/Source/Core/IO/SRB2MapSetIO.cs @@ -64,6 +64,7 @@ namespace CodeImp.DoomBuilder.IO public override int MinThingHeight { get { return 0; } } public override int ColormapType { get { return 606; } } public override int FlatAlignmentType { get { return 7; } } + public override int HorizonLineType { get { return 41; } } public override int AxisType { get { return 1700; } } public override int AxisTransferType { get { return 1701; } } public override int AxisTransferLineType { get { return 1702; } } diff --git a/Source/Core/IO/UniversalMapSetIO.cs b/Source/Core/IO/UniversalMapSetIO.cs index 7cc3f1d..105dac5 100644 --- a/Source/Core/IO/UniversalMapSetIO.cs +++ b/Source/Core/IO/UniversalMapSetIO.cs @@ -146,7 +146,8 @@ namespace CodeImp.DoomBuilder.IO public override int SlopeVertexType { get { return 9500; } } public override int ColormapType { get { return -1; } } public override int FlatAlignmentType { get { return -1; } } - public override int AxisType { get { return -1; } } + public override int HorizonLineType { get { return -1; } } + public override int AxisType { get { return -1; } } public override int AxisTransferType { get { return -1; } } public override int AxisTransferLineType { get { return -1; } } public override int WaypointType { get { return -1; } } diff --git a/Source/Core/Map/Linedef.cs b/Source/Core/Map/Linedef.cs index c3ab79b..2197291 100644 --- a/Source/Core/Map/Linedef.cs +++ b/Source/Core/Map/Linedef.cs @@ -99,7 +99,8 @@ namespace CodeImp.DoomBuilder.Map public bool IsTranslucentLine { get { return General.Map.FormatInterface.TranslucentLineTypes.ContainsKey(Action); } } public bool IsColormap { get { return Action == General.Map.FormatInterface.ColormapType; } } public bool IsFlatAlignment { get { return Action == General.Map.FormatInterface.FlatAlignmentType; } } - public int Tag { get { return tags[0]; } set { BeforePropsChange(); tags[0] = value; if((value < General.Map.FormatInterface.MinTag) || (value > General.Map.FormatInterface.MaxTag)) throw new ArgumentOutOfRangeException("Tag", "Invalid tag number"); } } //mxd + public bool IsHorizonLine { get { return Action == General.Map.FormatInterface.HorizonLineType; } } + public int Tag { get { return tags[0]; } set { BeforePropsChange(); tags[0] = value; if((value < General.Map.FormatInterface.MinTag) || (value > General.Map.FormatInterface.MaxTag)) throw new ArgumentOutOfRangeException("Tag", "Invalid tag number"); } } //mxd public List Tags { get { return tags; } set { BeforePropsChange(); tags = value; } } //mxd public float LengthSq { get { return lengthsq; } } public float Length { get { return length; } } diff --git a/Source/Core/Map/Sidedef.cs b/Source/Core/Map/Sidedef.cs index 0712ac2..f6557b2 100644 --- a/Source/Core/Map/Sidedef.cs +++ b/Source/Core/Map/Sidedef.cs @@ -439,7 +439,12 @@ namespace CodeImp.DoomBuilder.Map // Texture is required when our start or end vertex is higher than on the other side. if(thisstartz > otherstartz || thisendz > otherendz) return true; } - + + if (General.Map.SRB2) + { + if (Other.sector.CeilTexture == General.Map.Config.SkyFlatName) return false; + } + // Texture is required when ceiling of other side is lower return (Other.sector.CeilHeight < this.sector.CeilHeight); } @@ -452,8 +457,11 @@ namespace CodeImp.DoomBuilder.Map /// public bool MiddleRequired() { - // Texture is required when the line is singlesided - return (Other == null); + // Texture is required when the line is singlesided and not a horizon line + if (General.Map.SRB2) + return (Other == null && !(this.Line.IsHorizonLine)); + else + return (Other == null); } /// @@ -502,6 +510,11 @@ namespace CodeImp.DoomBuilder.Map if(thisstartz < otherstartz || thisendz < otherendz) return true; } + if (General.Map.SRB2) + { + if (Other.sector.FloorTexture == General.Map.Config.SkyFlatName) return false; + } + // Texture is required when floor of other side is higher return (Other.sector.FloorHeight > this.sector.FloorHeight); } diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs index 7995239..b7ac836 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs @@ -206,8 +206,7 @@ namespace CodeImp.DoomBuilder.BuilderModes else if (parts.middlesingle != null) parts.middlesingle.UpdateSkyRenderFlag(); // On the other side as well... - if (side.Other != null && side.Other.Sector != null && - side.Other.Sector.CeilTexture == General.Map.Config.SkyFlatName) + if (side.Other != null && side.Other.Sector != null) { BaseVisualSector other = (BaseVisualSector)mode.GetVisualSector(side.Other.Sector); if (other != null && other.Sides != null) diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs index ffc0200..def1854 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs @@ -203,17 +203,29 @@ namespace CodeImp.DoomBuilder.BuilderModes foreach (Sidedef side in level.sector.Sidedefs) { VisualSidedefParts parts = Sector.GetSidedefParts(side); - if (parts.middlesingle != null) parts.middlesingle.UpdateSkyRenderFlag(); - } + if (parts.lower != null) parts.lower.UpdateSkyRenderFlag(); + else if (parts.middlesingle != null) parts.middlesingle.UpdateSkyRenderFlag(); + + // On the other side as well... + if (side.Other != null && side.Other.Sector != null) + { + BaseVisualSector other = (BaseVisualSector)mode.GetVisualSector(side.Other.Sector); + if (other != null && other.Sides != null) + { + parts = other.GetSidedefParts(side.Other); + if (parts.lower != null) parts.lower.UpdateSkyRenderFlag(); + } + } + } } - } + } - #endregion + #endregion - #region ================== Methods + #region ================== Methods - // Return texture coordinates - protected override Point GetTextureOffset() + // Return texture coordinates + protected override Point GetTextureOffset() { return new Point { X = (int)Sector.Sector.Fields.GetValue("xpanningfloor", 0.0f), Y = (int)Sector.Sector.Fields.GetValue("ypanningfloor", 0.0f) }; diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualLower.cs b/Source/Plugins/BuilderModes/VisualModes/VisualLower.cs index 6f12f45..d2a2793 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualLower.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualLower.cs @@ -62,6 +62,8 @@ namespace CodeImp.DoomBuilder.BuilderModes { Vector2D vl, vr; + UpdateSkyRenderFlag(); + //mxd. lightfog flag support int lightvalue; bool lightabsolute; @@ -253,7 +255,14 @@ namespace CodeImp.DoomBuilder.BuilderModes base.SetVertices(null); //mxd return false; } - + + internal void UpdateSkyRenderFlag() + { + renderassky = (Sidedef.Other != null && Sidedef.Sector != null && Sidedef.Other.Sector != null && + Sidedef.Other.Sector.FloorTexture == General.Map.Config.SkyFlatName && + Sidedef.LongLowTexture == MapSet.EmptyLongName); + } + #endregion #region ================== Methods diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs index b48c2dd..9537345 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs @@ -252,7 +252,8 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd internal void UpdateSkyRenderFlag() { - renderassky = (Sidedef.LongMiddleTexture == MapSet.EmptyLongName && Sidedef.Sector != null && Sidedef.Sector.CeilTexture == General.Map.Config.SkyFlatName); + renderassky = (Sidedef.LongMiddleTexture == MapSet.EmptyLongName && Sidedef.Sector != null && + Sidedef.Line.IsHorizonLine); } #endregion diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs b/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs index 8b849a9..5bb6463 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs @@ -255,7 +255,6 @@ namespace CodeImp.DoomBuilder.BuilderModes internal void UpdateSkyRenderFlag() { renderassky = (Sidedef.Other != null && Sidedef.Sector != null && Sidedef.Other.Sector != null && - Sidedef.Sector.CeilTexture == General.Map.Config.SkyFlatName && Sidedef.Other.Sector.CeilTexture == General.Map.Config.SkyFlatName); }