OSDN Git Service

Remove redundant data copying.
authorLatif Khalifa <latifer@streamgrid.net>
Sun, 10 Jul 2011 20:42:19 +0000 (20:42 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Sun, 10 Jul 2011 20:42:19 +0000 (20:42 +0000)
Fix picking after refactor to RenderPrimitive.

git-svn-id: https://radegast.googlecode.com/svn/trunk@968 f7a694da-4d33-11de-9ad6-1127a62b9fcd

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

index ef7d538..d758eef 100644 (file)
@@ -170,23 +170,35 @@ namespace Radegast.Rendering
         public Vector3 Max = new Vector3(-99999, -99999, -99999);
         public float R = 0;
 
-        //public void CreateBoundingVolume(FaceData mesh)
-        //{
-        //    for (int q = 0; q < mesh.VertexBuffer.Length; q++)
-        //    {
-        //        if (mesh.VertexBuffer[q].Position.X < Min.X) Min.X = mesh.VertexBuffer[q].Position.X;
-        //        if (mesh.VertexBuffer[q].Position.Y < Min.Y) Min.Y = mesh.VertexBuffer[q].Position.Y;
-        //        if (mesh.VertexBuffer[q].Position.Z < Min.Z) Min.Z = mesh.VertexBuffer[q].Position.Z;
+        public void CreateBoundingVolume(OpenMetaverse.Rendering.Face mesh)
+        {
+            for (int q = 0; q < mesh.Vertices.Count; q++)
+            {
+                if (mesh.Vertices[q].Position.X < Min.X) Min.X = mesh.Vertices[q].Position.X;
+                if (mesh.Vertices[q].Position.Y < Min.Y) Min.Y = mesh.Vertices[q].Position.Y;
+                if (mesh.Vertices[q].Position.Z < Min.Z) Min.Z = mesh.Vertices[q].Position.Z;
 
-        //        if (mesh.VertexBuffer[q].Position.X > Max.X) Max.X = mesh.VertexBuffer[q].Position.X;
-        //        if (mesh.VertexBuffer[q].Position.Y > Max.Y) Max.Y = mesh.VertexBuffer[q].Position.Y;
-        //        if (mesh.VertexBuffer[q].Position.Z > Max.Z) Max.Z = mesh.VertexBuffer[q].Position.Z;
-        //    }
+                if (mesh.Vertices[q].Position.X > Max.X) Max.X = mesh.Vertices[q].Position.X;
+                if (mesh.Vertices[q].Position.Y > Max.Y) Max.Y = mesh.Vertices[q].Position.Y;
+                if (mesh.Vertices[q].Position.Z > Max.Z) Max.Z = mesh.Vertices[q].Position.Z;
+            }
 
-        //    Vector3 dist = Max - Min;
-        //    R = dist.Length;
-        //    mesh.ObjCenter = Min + (dist / 2); // objektin keskikohta
-        //}
+            Vector3 dist = Max - Min;
+            R = Vector3.Distance(Min, Max);
+            mesh.Center = Min + (dist / 2);
+        }
+
+        public void AddVolume(BoundingSphere vol)
+        {
+            if (vol.Min.X < this.Min.X) this.Min.X = vol.Min.X;
+            if (vol.Min.Y < this.Min.Y) this.Min.Y = vol.Min.Y;
+            if (vol.Min.Z < this.Min.Z) this.Min.Z = vol.Min.Z;
+
+            if (vol.Max.X > this.Max.X) this.Max.X = vol.Max.X;
+            if (vol.Max.Y > this.Max.Y) this.Max.Y = vol.Max.Y;
+            if (vol.Max.Z > this.Max.Z) this.Max.Z = vol.Max.Z;
+            R = Vector3.Distance(Min, Max);
+        }
 
         //public void CreateBoundingVolume(Model mesh, Vector3 min, Vector3 max)
         //{
index 8337bba..d1c6951 100644 (file)
@@ -587,7 +587,7 @@ namespace Radegast.Rendering
         {\r
         }\r
 \r
-        FacetedMesh RightclickedPrim;\r
+        RenderPrimitive RightclickedPrim;\r
         int RightclickedFaceID;\r
 \r
         private void glControl_MouseDown(object sender, MouseEventArgs e)\r
@@ -603,9 +603,9 @@ namespace Radegast.Rendering
                 object picked;\r
                 if (TryPick(e.X, e.Y, out picked, out RightclickedFaceID))\r
                 {\r
-                    if (picked is FacetedMesh)\r
+                    if (picked is RenderPrimitive)\r
                     {\r
-                        RightclickedPrim = (FacetedMesh)picked;\r
+                        RightclickedPrim = (RenderPrimitive)picked;\r
                         ctxObjects.Show(glControl, e.X, e.Y);\r
                     }\r
                     else if (picked is RenderAvatar)\r
@@ -676,9 +676,9 @@ namespace Radegast.Rendering
                     int faceID;\r
                     if (TryPick(e.X, e.Y, out clicked, out faceID))\r
                     {\r
-                        if (clicked is FacetedMesh)\r
+                        if (clicked is RenderPrimitive)\r
                         {\r
-                            FacetedMesh picked = (FacetedMesh)clicked;\r
+                            RenderPrimitive picked = (RenderPrimitive)clicked;\r
 \r
                             if (ModifierKeys == Keys.None)\r
                             {\r
@@ -1674,13 +1674,13 @@ namespace Radegast.Rendering
                     {\r
                         Primitive.TextureEntryFace teFace = mesh.Prim.Textures.FaceTextures[j];\r
                         Face face = mesh.Faces[j];\r
-                        FaceData data = (FaceData)face.UserData;\r
+                        FaceData data = (FaceData)mesh.Faces[j].UserData;\r
 \r
                         // Don't render objects too small to matter\r
-                        if (LODFactor(primPos, prim.Scale, data.BoundingSphere.R) < minLODFactor) continue;\r
+                        if (LODFactor(primPos, prim.Scale, data.BoundingVolume.R) < minLODFactor) continue;\r
 \r
                         // Don't render objects not in the field of view\r
-                        if (!Frustum.ObjectInFrustum(primPos, data.BoundingSphere, prim.Scale)) continue;\r
+                        if (!Frustum.ObjectInFrustum(primPos, data.BoundingVolume, prim.Scale)) continue;\r
 \r
                         if (teFace == null)\r
                             teFace = mesh.Prim.Textures.DefaultTexture;\r
@@ -2035,7 +2035,7 @@ namespace Radegast.Rendering
             }\r
         }\r
 \r
-        private void MeshPrim(Primitive prim, RenderPrimitive mesh)\r
+        private void MeshPrim(Primitive prim, RenderPrimitive rprim)\r
         {\r
             RenderPrimitive existingMesh = null;\r
 \r
@@ -2047,42 +2047,18 @@ namespace Radegast.Rendering
                 }\r
             }\r
 \r
-            // Create a FaceData struct for each face that stores the 3D data\r
-            // in a OpenGL friendly format\r
-            for (int j = 0; j < mesh.Faces.Count; j++)\r
+            // Calculate bounding volumes for each prim and adjust textures\r
+            rprim.BoundingVolume = new BoundingSphere();\r
+            for (int j = 0; j < rprim.Faces.Count; j++)\r
             {\r
                 Primitive.TextureEntryFace teFace = prim.Textures.GetFace((uint)j);\r
                 if (teFace == null) continue;\r
 \r
-                Face face = mesh.Faces[j];\r
+                Face face = rprim.Faces[j];\r
                 FaceData data = new FaceData();\r
 \r
-                // Vertices for this face\r
-                data.Vertices = new float[face.Vertices.Count * 3];\r
-                data.Normals = new float[face.Vertices.Count * 3];\r
-                for (int k = 0; k < face.Vertices.Count; k++)\r
-                {\r
-                    data.Vertices[k * 3 + 0] = face.Vertices[k].Position.X;\r
-                    data.Vertices[k * 3 + 1] = face.Vertices[k].Position.Y;\r
-                    data.Vertices[k * 3 + 2] = face.Vertices[k].Position.Z;\r
-\r
-                    if (data.Vertices[k * 3 + 0] < data.BoundingSphere.Min.X) data.BoundingSphere.Min.X = data.Vertices[k * 3 + 0];\r
-                    if (data.Vertices[k * 3 + 1] < data.BoundingSphere.Min.Y) data.BoundingSphere.Min.Y = data.Vertices[k * 3 + 1];\r
-                    if (data.Vertices[k * 3 + 2] < data.BoundingSphere.Min.Z) data.BoundingSphere.Min.Z = data.Vertices[k * 3 + 2];\r
-\r
-                    if (data.Vertices[k * 3 + 0] > data.BoundingSphere.Max.X) data.BoundingSphere.Max.X = data.Vertices[k * 3 + 0];\r
-                    if (data.Vertices[k * 3 + 1] > data.BoundingSphere.Max.Y) data.BoundingSphere.Max.Y = data.Vertices[k * 3 + 1];\r
-                    if (data.Vertices[k * 3 + 2] > data.BoundingSphere.Max.Z) data.BoundingSphere.Max.Z = data.Vertices[k * 3 + 2];\r
-\r
-                    data.Normals[k * 3 + 0] = face.Vertices[k].Normal.X;\r
-                    data.Normals[k * 3 + 1] = face.Vertices[k].Normal.Y;\r
-                    data.Normals[k * 3 + 2] = face.Vertices[k].Normal.Z;\r
-                }\r
-\r
-                data.BoundingSphere.R = (data.BoundingSphere.Max - data.BoundingSphere.Min).Length();\r
-\r
-                // Indices for this face\r
-                data.Indices = face.Indices.ToArray();\r
+                data.BoundingVolume.CreateBoundingVolume(face);\r
+                rprim.BoundingVolume.AddVolume(data.BoundingVolume);\r
 \r
                 // With linear texture animation in effect, texture repeats and offset are ignored\r
                 if ((prim.TextureAnim.Flags & Primitive.TextureAnimMode.ANIM_ON) != 0\r
@@ -2106,18 +2082,9 @@ namespace Radegast.Rendering
                 // Texture transform for this face\r
                 renderer.TransformTexCoords(face.Vertices, face.Center, teFace);\r
 \r
-                // Texcoords for this face\r
-                data.TexCoords = new float[face.Vertices.Count * 2];\r
-                for (int k = 0; k < face.Vertices.Count; k++)\r
-                {\r
-                    data.TexCoords[k * 2 + 0] = face.Vertices[k].TexCoord.X;\r
-                    data.TexCoords[k * 2 + 1] = face.Vertices[k].TexCoord.Y;\r
-                }\r
-\r
                 // Set the UserData for this face to our FaceData struct\r
                 face.UserData = data;\r
-                mesh.Faces[j] = face;\r
-\r
+                rprim.Faces[j] = face;\r
 \r
                 if (existingMesh != null &&\r
                     j < existingMesh.Faces.Count &&\r
@@ -2142,7 +2109,7 @@ namespace Radegast.Rendering
 \r
             lock (Prims)\r
             {\r
-                Prims[prim.LocalID] = mesh;\r
+                Prims[prim.LocalID] = rprim;\r
             }\r
         }\r
 \r
index c2f352a..ccf5c6c 100644 (file)
@@ -23,7 +23,7 @@ namespace Radegast.Rendering
         public int VertexVBO = -1;\r
         public int IndexVBO = -1;\r
         public TextureInfo TextureInfo = new TextureInfo();\r
-        public BoundingSphere BoundingSphere = new BoundingSphere();\r
+        public BoundingSphere BoundingVolume = new BoundingSphere();\r
         public static int VertexSize = 32; // sizeof (vertex), 2  x vector3 + 1 x vector2 = 8 floats x 4 bytes = 32 bytes \r
         public TextureAnimationInfo AnimInfo;\r
         public bool Occluded = false;\r
@@ -286,7 +286,7 @@ namespace Radegast.Rendering
         public Primitive Prim;\r
         public List<Face> Faces;\r
         public float DistanceSquared;\r
-        public BoundingSphere Bounding;\r
+        public BoundingSphere BoundingVolume;\r
 \r
         public virtual void Dispose()\r
         {\r