/// <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
{\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
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
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