OSDN Git Service

Determine more info about image alpha channel. Don't render faces with fully transpar...
authorLatif Khalifa <latifer@streamgrid.net>
Mon, 11 Jul 2011 05:05:02 +0000 (05:05 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Mon, 11 Jul 2011 05:05:02 +0000 (05:05 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@970 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Rendering/Rendering.cs
Radegast/GUI/Rendering/RenderingHelpers.cs

index 1b1abff..f6d8fcb 100644 (file)
@@ -76,7 +76,7 @@ namespace Radegast.Rendering
         /// <summary>\r
         /// Object from up to this distance from us will be rendered\r
         /// </summary>\r
-        public float DrawDistance = 96f;\r
+        public float DrawDistance = 48f;\r
 \r
         /// <summary>\r
         /// List of prims in the scene\r
@@ -804,20 +804,49 @@ namespace Radegast.Rendering
                 {\r
                     ManagedImage mi;\r
                     Image img;\r
-                    if (!OpenJPEG.DecodeToImage(item.TextureData, out mi, out img)) continue;\r
-                    Bitmap bitmap = (Bitmap)img;\r
-                    \r
-                    bool hasAlpha;\r
-                    if (bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb)\r
+                    if (!OpenJPEG.DecodeToImage(item.TextureData, out mi)) continue;\r
+\r
+                    bool hasAlpha = false;\r
+                    bool fullAlpha = false;\r
+                    bool isMask = false;\r
+                    if ((mi.Channels & ManagedImage.ImageChannels.Alpha) != 0)\r
                     {\r
-                        hasAlpha = true;\r
+                        fullAlpha = true;\r
+                        isMask = true;\r
+\r
+                        // Do we really have alpha, is it all full alpha, or is it a mask\r
+                        for (int i = 0; i < mi.Alpha.Length; i++)\r
+                        {\r
+                            if (mi.Alpha[i] < 255)\r
+                            {\r
+                                hasAlpha = true;\r
+                            }\r
+                            if (mi.Alpha[i] != 0)\r
+                            {\r
+                                fullAlpha = false;\r
+                            }\r
+                            if (mi.Alpha[i] != 0 && mi.Alpha[i] != 255)\r
+                            {\r
+                                isMask = false;\r
+                            }\r
+                        }\r
+\r
+                        if (!hasAlpha)\r
+                        {\r
+                            mi.ConvertChannels(mi.Channels & ~ManagedImage.ImageChannels.Alpha);\r
+                        }\r
                     }\r
-                    else\r
+\r
+                    using (MemoryStream byteData = new MemoryStream(mi.ExportTGA()))\r
                     {\r
-                        hasAlpha = false;\r
+                        img = OpenMetaverse.Imaging.LoadTGAClass.LoadTGA(byteData);\r
                     }\r
+                    \r
+                    Bitmap bitmap = (Bitmap)img;\r
 \r
                     item.Data.TextureInfo.HasAlpha = hasAlpha;\r
+                    item.Data.TextureInfo.FullAlpha = fullAlpha;\r
+                    item.Data.TextureInfo.IsMask = isMask;\r
                     bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);\r
                     item.Data.TextureInfo.TexturePointer = GLLoadImage(bitmap, hasAlpha);\r
                     bitmap.Dispose();\r
@@ -1824,13 +1853,16 @@ namespace Radegast.Rendering
                         Primitive.TextureEntryFace teFace = mesh.Prim.Textures.FaceTextures[j];\r
                         Face face = mesh.Faces[j];\r
                         FaceData data = (FaceData)mesh.Faces[j].UserData;\r
-\r
+                        \r
                         if (teFace == null)\r
                             teFace = mesh.Prim.Textures.DefaultTexture;\r
 \r
                         if (teFace == null)\r
                             continue;\r
 \r
+                        // Don't render transparent faces\r
+                        if (data.TextureInfo.FullAlpha || teFace.RGBA.A <= 0.01f) continue;\r
+\r
                         int lightsEnabled;\r
                         GL.GetInteger(GetPName.Lighting, out lightsEnabled);\r
 \r
@@ -1841,9 +1873,6 @@ namespace Radegast.Rendering
                             if (belongToAlphaPass && pass != RenderPass.Alpha) continue;\r
                             if (!belongToAlphaPass && pass == RenderPass.Alpha) continue;\r
 \r
-                            // Don't render transparent faces\r
-                            if (teFace.RGBA.A <= 0.01f) continue;\r
-\r
                             if (teFace.Fullbright && lightsEnabled != 0)\r
                             {\r
                                 GL.Disable(EnableCap.Lighting);\r
index 7529a2e..d085f1b 100644 (file)
@@ -263,6 +263,8 @@ namespace Radegast.Rendering
         public System.Drawing.Image Texture;\r
         public int TexturePointer;\r
         public bool HasAlpha;\r
+        public bool FullAlpha;\r
+        public bool IsMask;\r
         public UUID TextureID;\r
     }\r
 \r