From ad6ae1112eb3ff97beeb43e21849e3db27a7318e Mon Sep 17 00:00:00 2001
From: ZZYZX <zzyzx@virtual>
Date: Sat, 29 Apr 2017 13:56:06 +0300
Subject: [PATCH] Fixed: render sorting issues with multiple translucent 3D
 floors next to each other on different heights

---
 Source/Core/Properties/AssemblyInfo.cs        |  4 +-
 Source/Core/Rendering/Renderer3D.cs           | 69 ++++++++-----------
 .../BuilderModes/Properties/AssemblyInfo.cs   |  2 +-
 3 files changed, 33 insertions(+), 42 deletions(-)

diff --git a/Source/Core/Properties/AssemblyInfo.cs b/Source/Core/Properties/AssemblyInfo.cs
index 888a088b2..e599f32d4 100755
--- a/Source/Core/Properties/AssemblyInfo.cs
+++ b/Source/Core/Properties/AssemblyInfo.cs
@@ -30,6 +30,6 @@ using CodeImp.DoomBuilder;
 //      Build Number
 //      Revision
 //
-[assembly: AssemblyVersion("2.3.0.2972")]
+[assembly: AssemblyVersion("2.3.0.2973")]
 [assembly: NeutralResourcesLanguageAttribute("en")]
-[assembly: AssemblyHash("b4d38e3")]
+[assembly: AssemblyHash("de7445b")]
diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs
index 4e44b53d6..f77592940 100755
--- a/Source/Core/Rendering/Renderer3D.cs
+++ b/Source/Core/Rendering/Renderer3D.cs
@@ -391,7 +391,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			//mxd. Sort lights
 			if(General.Settings.GZDrawLightsMode != LightRenderMode.NONE && !fullbrightness && lightthings.Count > 0)
 				UpdateLights();
-			
+
 			// Initial renderstates
 			graphics.Device.SetRenderState(RenderState.CullMode, Cull.Counterclockwise);
 			graphics.Device.SetRenderState(RenderState.ZEnable, true);
@@ -412,7 +412,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			// SOLID PASS
 			world = Matrix.Identity;
 			ApplyMatrices3D();
-			RenderSinglePass(solidgeo, solidthings);
+            RenderSinglePass(solidgeo, solidthings);
 
 			//mxd. Render models, without backface culling
 			if(maskedmodelthings.Count > 0)
@@ -467,7 +467,6 @@ namespace CodeImp.DoomBuilder.Rendering
                 graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
                 graphics.Device.SetRenderState(RenderState.ZWriteEnable, false);
                 graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.One);
-
                 RenderTranslucentLights(translucentgeo, lightthings);
             }
 
@@ -972,46 +971,38 @@ namespace CodeImp.DoomBuilder.Rendering
 			int highshaderpass = shaderpass + 2;
 
 			// Sort geometry by camera distance. First vertex of the BoundingBox is it's center
-			if(General.Map.VisualCamera.Sector != null)
+            geopass.Sort(delegate(VisualGeometry vg1, VisualGeometry vg2)
 			{
-				// If the camera is inside a sector, compare z coordinates
-				geopass.Sort(delegate(VisualGeometry vg1, VisualGeometry vg2)
-				{
-					if(vg1 == vg2) return 0;
-					float camdist1, camdist2;
+                /*if(vg1 == vg2) return 0;
+				return (int)((General.Map.VisualCamera.Position - vg2.BoundingBox[0]).GetLengthSq()
+					        -(General.Map.VisualCamera.Position - vg1.BoundingBox[0]).GetLengthSq());*/
 
-					if((vg1.GeometryType == VisualGeometryType.FLOOR || vg1.GeometryType == VisualGeometryType.CEILING)
-						&& General.Map.VisualCamera.Sector.Index == vg1.Sector.Sector.Index)
-					{
-						camdist1 = Math.Abs(General.Map.VisualCamera.Position.z - vg1.BoundingBox[0].z);
-					}
-					else
-					{
-						camdist1 = (General.Map.VisualCamera.Position - vg1.BoundingBox[0]).GetLengthSq();
-					}
+                // This does not work when you have huge translucent 3D floor combined with small translucent something over it.
+                // The huge translucent 3D floor may easily have it's center CLOSER and thus get drawn over everything, which is certainly not expected behavior.
 
-					if((vg2.GeometryType == VisualGeometryType.FLOOR || vg2.GeometryType == VisualGeometryType.CEILING)
-						&& General.Map.VisualCamera.Sector.Index == vg2.Sector.Sector.Index)
-					{
-						camdist2 = Math.Abs(General.Map.VisualCamera.Position.z - vg2.BoundingBox[0].z);
-					}
-					else
-					{
-						camdist2 = (General.Map.VisualCamera.Position - vg2.BoundingBox[0]).GetLengthSq();
-					}
+                if (vg1 == vg2)
+                    return 0;
 
-					return (int)(camdist2 - camdist1);
-				});
-			}
-			else
-			{
-                geopass.Sort(delegate(VisualGeometry vg1, VisualGeometry vg2)
-				{
-					if(vg1 == vg2) return 0;
-					return (int)((General.Map.VisualCamera.Position - vg2.BoundingBox[0]).GetLengthSq()
-					           - (General.Map.VisualCamera.Position - vg1.BoundingBox[0]).GetLengthSq());
-				});
-			}
+                double dist1, dist2;
+                Vector3D cameraPos = General.Map.VisualCamera.Position;
+                Vector2D cameraPos2 = new Vector2D(cameraPos);
+
+                // if one of the things being compared is a plane, use easier formula. (3d floor compatibility)
+                if (vg1.GeometryType == VisualGeometryType.FLOOR || vg1.GeometryType == VisualGeometryType.CEILING ||
+                    vg2.GeometryType == VisualGeometryType.FLOOR || vg2.GeometryType == VisualGeometryType.CEILING)
+                {
+                    // more magic
+                    dist1 = Math.Abs(vg1.BoundingBox[0].z - cameraPos.z);
+                    dist2 = Math.Abs(vg2.BoundingBox[0].z - cameraPos.z);
+                }
+                else
+                {
+                    dist1 = (General.Map.VisualCamera.Position - vg1.BoundingBox[0]).GetLengthSq();
+                    dist2 = (General.Map.VisualCamera.Position - vg2.BoundingBox[0]).GetLengthSq();
+                }
+
+                return (int)(dist2 - dist1);
+			});
 
 			ImageData curtexture;
 			VisualSector sector = null;
diff --git a/Source/Plugins/BuilderModes/Properties/AssemblyInfo.cs b/Source/Plugins/BuilderModes/Properties/AssemblyInfo.cs
index 5f4d3f2b7..6c5fb9e6d 100755
--- a/Source/Plugins/BuilderModes/Properties/AssemblyInfo.cs
+++ b/Source/Plugins/BuilderModes/Properties/AssemblyInfo.cs
@@ -29,5 +29,5 @@ using System.Resources;
 //      Build Number
 //      Revision
 //
-[assembly: AssemblyVersion("2.3.0.2972")]
+[assembly: AssemblyVersion("2.3.0.2973")]
 [assembly: NeutralResourcesLanguageAttribute("en")]
-- 
GitLab