OSDN Git Service

Add in a rendering option for lighter, but more computationally heavy, cull checking...
authorRevolution Smythe <ASDFISBETTERTHANJKL@gmail.com>
Mon, 1 Aug 2011 05:02:08 +0000 (05:02 +0000)
committerRevolution Smythe <ASDFISBETTERTHANJKL@gmail.com>
Mon, 1 Aug 2011 05:02:08 +0000 (05:02 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@1048 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Rendering/RenderSettings.cs
Radegast/GUI/Rendering/Rendering.cs

index e2fc01a..3c6cd56 100644 (file)
@@ -49,5 +49,7 @@ namespace Radegast.Rendering
         public static int TexturesToDownloadPerFrame = 2;
         /// <summary>Should we try to optimize by not drawing objects occluded behind other objects</summary>
         public static bool OcclusionCullingEnabled = true;
+        /// <summary>Should we try to make sure that large prims that are > our draw distance are in view when we are standing on them</summary>
+        public static bool HeavierDistanceChecking = true;
     }
 }
index ef9b280..b87ab04 100644 (file)
@@ -1248,7 +1248,7 @@ namespace Radegast.Rendering
                 if (!p.PositionCalculated)\r
                 {\r
                     PrimPosAndRot(p, out p.RenderPosition, out p.RenderRotation);\r
-                    p.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, p.RenderPosition);\r
+                    p.DistanceSquared = FindClosestDistanceSquared(Camera.RenderPosition, p);\r
                     p.PositionCalculated = true;\r
                 }\r
 \r
@@ -1300,6 +1300,97 @@ namespace Radegast.Rendering
             }\r
         }\r
 \r
+        /// <summary>\r
+        /// Finds the closest distance between the given pos and an object\r
+        /// (Assumes that the object is a box slightly)\r
+        /// </summary>\r
+        /// <param name="vector3"></param>\r
+        /// <param name="p"></param>\r
+        /// <returns></returns>\r
+        private float FindClosestDistanceSquared (Vector3 calcPos, SceneObject p)\r
+        {\r
+            if(!RenderSettings.HeavierDistanceChecking)\r
+                return Vector3.DistanceSquared(calcPos, p.RenderPosition);\r
+\r
+            Vector3 posToCheckFrom = Vector3.Zero;\r
+            //Get the bounding boxes for this prim\r
+            Vector3 boundingBoxMin = p.RenderPosition - (p.BasePrim.Scale / 2);\r
+            Vector3 boundingBoxMax = p.RenderPosition + (p.BasePrim.Scale / 2);\r
+            if(calcPos.X > boundingBoxMin.X &&\r
+                    calcPos.X < boundingBoxMax.X)\r
+            {\r
+                //Between the two\r
+                posToCheckFrom.X = calcPos.X;\r
+            }\r
+            else\r
+            {\r
+                float minX = Abs(boundingBoxMin.X - calcPos.X);\r
+                float maxX = Abs(boundingBoxMax.X - calcPos.X);\r
+                if(maxX > minX)\r
+                {\r
+                    //The min is closer in the X direction\r
+                    posToCheckFrom.X = boundingBoxMin.X;\r
+                }\r
+                else\r
+                {\r
+                    //The max is closer in the X direction\r
+                    posToCheckFrom.X = boundingBoxMax.X;\r
+                }\r
+            }\r
+\r
+            if(calcPos.Y > boundingBoxMin.Y &&\r
+                    calcPos.Y < boundingBoxMax.Y)\r
+            {\r
+                //Between the two\r
+                posToCheckFrom.Y = calcPos.Y;\r
+            }\r
+            else\r
+            {\r
+                float minY = Abs(boundingBoxMin.Y - calcPos.Y);\r
+                float maxY = Abs(boundingBoxMax.Y - calcPos.Y);\r
+                if(maxY > minY)\r
+                {\r
+                    //The min is closer in the Y direction\r
+                    posToCheckFrom.Y = boundingBoxMin.Y;\r
+                }\r
+                else\r
+                {\r
+                    //The max is closer in the Y direction\r
+                    posToCheckFrom.Y = boundingBoxMax.Y;\r
+                }\r
+            }\r
+\r
+            if(calcPos.Z > boundingBoxMin.Z &&\r
+                    calcPos.Z < boundingBoxMax.Z)\r
+            {\r
+                //Between the two\r
+                posToCheckFrom.Z = calcPos.Z;\r
+            }\r
+            else\r
+            {\r
+                float minZ = Abs(boundingBoxMin.Z - calcPos.Z);\r
+                float maxZ = Abs(boundingBoxMax.Z - calcPos.Z);\r
+                if(maxZ > minZ)\r
+                {\r
+                    //The min is closer in the Z direction\r
+                    posToCheckFrom.Z = boundingBoxMin.Z;\r
+                }\r
+                else\r
+                {\r
+                    //The max is closer in the Z direction\r
+                    posToCheckFrom.Z = boundingBoxMax.Z;\r
+                }\r
+            }\r
+            return Vector3.DistanceSquared(calcPos, posToCheckFrom);\r
+        }\r
+\r
+        private float Abs (float p)\r
+        {\r
+            if(p < 0)\r
+                p *= -1;\r
+            return p;\r
+        }\r
+\r
         private void SetPerspective()\r
         {\r
             float dAspRat = (float)glControl.Width / (float)glControl.Height;\r
@@ -1889,7 +1980,7 @@ namespace Radegast.Rendering
         }\r
         #endregion Keyboard\r
 \r
-        #region Terrian\r
+        #region Terrain\r
         bool TerrainModified = true;\r
         float[,] heightTable = new float[256, 256];\r
         Face terrainFace;\r
@@ -2416,7 +2507,7 @@ namespace Radegast.Rendering
                     if (!obj.PositionCalculated)\r
                     {\r
                         PrimPosAndRot(obj, out obj.RenderPosition, out obj.RenderRotation);\r
-                        obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.RenderPosition);\r
+                        obj.DistanceSquared = FindClosestDistanceSquared(Camera.RenderPosition, obj);\r
                         obj.PositionCalculated = true;\r
                     }\r
 \r
@@ -2442,7 +2533,7 @@ namespace Radegast.Rendering
                         if (!obj.Initialized) obj.Initialize();\r
                         if (AvatarRenderingEnabled) obj.Step(lastFrameTime);\r
                         PrimPosAndRot(obj, out obj.RenderPosition, out obj.RenderRotation);\r
-                        obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.RenderPosition);\r
+                        obj.DistanceSquared = FindClosestDistanceSquared(Camera.RenderPosition, obj);\r
                         obj.PositionCalculated = true;\r
 \r
                         if (!Frustum.ObjectInFrustum(obj.RenderPosition, obj.BoundingVolume, obj.BasePrim.Scale)) continue;\r
@@ -2475,7 +2566,7 @@ namespace Radegast.Rendering
                     if (!obj.PositionCalculated)\r
                     {\r
                         PrimPosAndRot(obj, out obj.RenderPosition, out obj.RenderRotation);\r
-                        obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.RenderPosition);\r
+                        obj.DistanceSquared = FindClosestDistanceSquared(Camera.RenderPosition, obj);\r
                         obj.PositionCalculated = true;\r
                     }\r
 \r
@@ -3281,6 +3372,8 @@ namespace Radegast.Rendering
         }\r
         #endregion Context menu\r
 \r
+        #region Winform hooks\r
+\r
         private void hsAmbient_Scroll(object sender, ScrollEventArgs e)\r
         {\r
             ambient = (float)hsAmbient.Value / 100f;\r
@@ -3441,5 +3534,7 @@ namespace Radegast.Rendering
             miscEnabled = cbMisc.Checked;\r
             RenderSettings.OcclusionCullingEnabled = miscEnabled;\r
         }\r
+\r
+        #endregion\r
     }\r
 }\r