From 0ebba7bdb967372dc13e3090282b776c45cf57d0 Mon Sep 17 00:00:00 2001
From: biwa <6475593+biwa@users.noreply.github.com>
Date: Fri, 27 Dec 2019 18:49:12 +0100
Subject: [PATCH] Fixed a bug where flats on a 3D floor could not be
 auto-aligned (auto-aligning the flats of the tagged sector instead). Fixes
 #338.

---
 .../VisualModes/BaseVisualGeometrySector.cs   | 66 +++++++++++++++----
 1 file changed, 53 insertions(+), 13 deletions(-)

diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
index c1e3c18c6..809ebb448 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
@@ -242,23 +242,37 @@ namespace CodeImp.DoomBuilder.BuilderModes
 
 			if(mode.HighlightedTarget is VisualFloor) 
 			{
-				VisualFloor target = (VisualFloor)mode.HighlightedTarget;
+				Sector target;
+				VisualFloor vf = (VisualFloor)mode.HighlightedTarget;
+
+				// Use the control sector if the floor belongs to a 3D floor
+				if (vf.ExtraFloor == null)
+					target = vf.Sector.Sector;
+				else
+					target = vf.GetControlSector();
 
 				// Check texture
-				if(target.Sector.Sector.FloorTexture != (isFloor ? Sector.Sector.FloorTexture : Sector.Sector.CeilTexture))	return;
+				if(target.FloorTexture != (isFloor ? Sector.Sector.FloorTexture : Sector.Sector.CeilTexture))	return;
 
-				scaleX = target.Sector.Sector.Fields.GetValue("xscalefloor", 1.0f);
-				scaleY = target.Sector.Sector.Fields.GetValue("yscalefloor", 1.0f);
+				scaleX = target.Fields.GetValue("xscalefloor", 1.0f);
+				scaleY = target.Fields.GetValue("yscalefloor", 1.0f);
 			} 
 			else 
 			{
-				VisualCeiling target = (VisualCeiling)mode.HighlightedTarget;
+				Sector target;
+				VisualCeiling vc = (VisualCeiling)mode.HighlightedTarget;
+
+				// Use the control sector if the ceiling belongs to a 3D floor
+				if (vc.ExtraFloor == null)
+					target = vc.Sector.Sector;
+				else
+					target = vc.GetControlSector();
 
 				// Check texture
-				if(target.Sector.Sector.CeilTexture != (isFloor ? Sector.Sector.FloorTexture : Sector.Sector.CeilTexture)) return;
+				if(target.CeilTexture != (isFloor ? Sector.Sector.FloorTexture : Sector.Sector.CeilTexture)) return;
 
-				scaleX = target.Sector.Sector.Fields.GetValue("xscaleceiling", 1.0f);
-				scaleY = target.Sector.Sector.Fields.GetValue("yscaleceiling", 1.0f);
+				scaleX = target.Fields.GetValue("xscaleceiling", 1.0f);
+				scaleY = target.Fields.GetValue("yscaleceiling", 1.0f);
 			}
 
 			//find a linedef to align to
@@ -688,13 +702,39 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			{
 				if(vg.GeometryType == VisualGeometryType.FLOOR || vg.GeometryType == VisualGeometryType.CEILING) 
 				{
-					if(vg.GeometryType == VisualGeometryType.FLOOR)
-						((VisualFloor)vg).AlignTexture(alignx, aligny);
+					// Might be a 3D floor, so we might need another VisualGeometry
+					VisualGeometry realvg;
+
+					if (vg.GeometryType == VisualGeometryType.FLOOR)
+					{
+						if (((VisualFloor)vg).ExtraFloor == null)
+							realvg = vg;
+						else
+						{
+							Sector s = ((VisualFloor)vg).GetControlSector();
+							BaseVisualSector vs = (BaseVisualSector)mode.GetVisualSector(s);
+							realvg = vs.Floor;
+						}
+					}
+					else
+					{
+						if (((VisualCeiling)vg).ExtraFloor == null)
+							realvg = vg;
+						else
+						{
+							Sector s = ((VisualCeiling)vg).GetControlSector();
+							BaseVisualSector vs = (BaseVisualSector)mode.GetVisualSector(s);
+							realvg = vs.Ceiling;
+						}
+					}
+
+					if(realvg.GeometryType == VisualGeometryType.FLOOR)
+							((VisualFloor)realvg).AlignTexture(alignx, aligny);
 					else
-						((VisualCeiling)vg).AlignTexture(alignx, aligny);
+							((VisualCeiling)realvg).AlignTexture(alignx, aligny);
 
-					vg.Sector.Sector.UpdateNeeded = true;
-					vg.Sector.Sector.UpdateCache();
+					realvg.Sector.Sector.UpdateNeeded = true;
+					realvg.Sector.Sector.UpdateCache();
 				}
 			}
 
-- 
GitLab