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
}\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
}\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
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
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
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
}\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
miscEnabled = cbMisc.Checked;\r
RenderSettings.OcclusionCullingEnabled = miscEnabled;\r
}\r
+\r
+ #endregion\r
}\r
}\r