OSDN Git Service

Alpha masking and blending correct phases of the rendering process.
authorLatif Khalifa <latifer@streamgrid.net>
Tue, 12 Jul 2011 21:02:28 +0000 (21:02 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Tue, 12 Jul 2011 21:02:28 +0000 (21:02 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@981 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Rendering/Rendering.cs

index ea687fa..2950bf5 100644 (file)
@@ -512,7 +512,7 @@ namespace Radegast.Rendering
                 GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);\r
                 GL.MatrixMode(MatrixMode.Projection);\r
 \r
-                GL.Enable(EnableCap.Blend);\r
+                GL.AlphaFunc(AlphaFunction.Greater, 0.5f);\r
                 GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);\r
                 string glExtensions = GL.GetString(StringName.Extensions);\r
                 hasMipmap = glExtensions.Contains("GL_SGIS_generate_mipmap");\r
@@ -1849,6 +1849,8 @@ namespace Radegast.Rendering
                 mesh.Step(lastFrameTime);\r
             }\r
 \r
+            if (!AvatarRenderingEnabled && mesh.Attached) return;\r
+\r
             Primitive prim = mesh.Prim;\r
 \r
             // Individual prim matrix\r
@@ -1888,7 +1890,7 @@ namespace Radegast.Rendering
 \r
                 if (pass != RenderPass.Picking)\r
                 {\r
-                    bool belongToAlphaPass = (teFace.RGBA.A < 0.99) || data.TextureInfo.HasAlpha;\r
+                    bool belongToAlphaPass = (teFace.RGBA.A < 0.99f) || (data.TextureInfo.HasAlpha && !data.TextureInfo.IsMask);\r
 \r
                     if (belongToAlphaPass && pass != RenderPass.Alpha) continue;\r
                     if (!belongToAlphaPass && pass == RenderPass.Alpha) continue;\r
@@ -2196,22 +2198,26 @@ namespace Radegast.Rendering
             }\r
             else\r
             {\r
+                // Alpha mask elements, no blending, alpha test for A > 0.5\r
+                GL.Enable(EnableCap.AlphaTest);\r
                 RenderTerrain();\r
                 RenderObjects(RenderPass.Simple);\r
                 RenderAvatarsSkeleton(RenderPass.Simple);\r
                 RenderAvatars(RenderPass.Simple);\r
+                GL.Disable(EnableCap.AlphaTest);\r
 \r
-                GL.Disable(EnableCap.Lighting);\r
+                // Alpha blending elements, disable writing to depth buffer\r
+                GL.Enable(EnableCap.Blend);\r
                 GL.DepthMask(false);\r
                 RenderWater();\r
                 RenderObjects(RenderPass.Alpha);\r
                 GL.DepthMask(true);\r
-                GL.Enable(EnableCap.Lighting);\r
 \r
                 GLHUDBegin();\r
                 RenderText();\r
                 RenderStats();\r
                 GLHUDEnd();\r
+                GL.Disable(EnableCap.Blend);\r
             }\r
 \r
             // Pop the world matrix\r
@@ -2807,6 +2813,7 @@ namespace Radegast.Rendering
         private void cbMisc_CheckedChanged(object sender, EventArgs e)\r
         {\r
             miscEnabled = cbMisc.Checked;\r
+            AvatarRenderingEnabled = miscEnabled;\r
         }\r
 \r
 \r