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