OSDN Git Service

* Add avatars to general sorted list of stuff to render
authorLatif Khalifa <latifer@streamgrid.net>
Mon, 11 Jul 2011 12:31:04 +0000 (12:31 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Mon, 11 Jul 2011 12:31:04 +0000 (12:31 +0000)
* Calcilate sim rotation and position only once

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

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

index 4113c2f..4d899f4 100644 (file)
@@ -82,7 +82,7 @@ namespace Radegast.Rendering
         /// List of prims in the scene\r
         /// </summary>\r
         Dictionary<uint, RenderPrimitive> Prims = new Dictionary<uint, RenderPrimitive>();\r
-        List<RenderPrimitive> SortedPrims;\r
+        List<SceneObject> SortedObjects;\r
         Dictionary<uint, RenderAvatar> Avatars = new Dictionary<uint, RenderAvatar>();\r
 \r
         #endregion Public fields\r
@@ -927,7 +927,7 @@ namespace Radegast.Rendering
             return pos;\r
         }\r
 \r
-        object GetParent(uint localID)\r
+        SceneObject GetParent(uint localID)\r
         {\r
             RenderPrimitive parent;\r
             RenderAvatar avi;\r
@@ -955,22 +955,34 @@ namespace Radegast.Rendering
                 pos = new Vector3(99999f, 99999f, 99999f);\r
                 rot = Quaternion.Identity;\r
 \r
-                object p = GetParent(prim.ParentID);\r
+                SceneObject p = GetParent(prim.ParentID);\r
                 if (p == null) return;\r
 \r
-                Primitive parentPrim = null;\r
-                if (p is RenderPrimitive)\r
+                Vector3 parentPos;\r
+                Quaternion parentRot;\r
+                if (p.PositionUpdated)\r
                 {\r
-                    parentPrim = ((RenderPrimitive)p).Prim;\r
+                    parentPos = p.SimPosition;\r
+                    parentRot = p.SimRotation;\r
                 }\r
-                else if (p is RenderAvatar)\r
+                else\r
                 {\r
-                    parentPrim = ((RenderAvatar)p).avatar;\r
-                }\r
+                    Primitive parentPrim = null;\r
+                    if (p is RenderPrimitive)\r
+                    {\r
+                        parentPrim = ((RenderPrimitive)p).Prim;\r
+                    }\r
+                    else if (p is RenderAvatar)\r
+                    {\r
+                        parentPrim = ((RenderAvatar)p).avatar;\r
+                    }\r
 \r
-                Vector3 parentPos;\r
-                Quaternion parentRot;\r
-                PrimPosAndRot(parentPrim, out parentPos, out parentRot);\r
+                    PrimPosAndRot(parentPrim, out parentPos, out parentRot);\r
+                    p.SimPosition = parentPos;\r
+                    p.SimRotation = parentRot;\r
+                    p.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, p.SimPosition);\r
+                    p.PositionUpdated = true;\r
+                }\r
 \r
                 if (p is RenderPrimitive)\r
                 {\r
@@ -2024,21 +2036,43 @@ namespace Radegast.Rendering
             GL.PopMatrix();\r
         }\r
 \r
-        void SortPrims()\r
+        void SortObjects()\r
         {\r
+            SortedObjects = new List<SceneObject>(Prims.Count);\r
+            lock (Avatars)\r
+            {\r
+                SortedObjects.AddRange(Avatars.Values.ToArray());\r
+            }\r
+\r
             lock (Prims)\r
             {\r
-                SortedPrims = new List<RenderPrimitive>(Prims.Count);\r
-                foreach (RenderPrimitive prim in Prims.Values)\r
+                SortedObjects.AddRange(Prims.Values.ToArray());\r
+            }\r
+\r
+            foreach (SceneObject obj in SortedObjects)\r
+            {\r
+                obj.PositionUpdated = false;\r
+            }\r
+\r
+            foreach (SceneObject obj in SortedObjects)\r
+            {\r
+                if (!obj.PositionUpdated)\r
                 {\r
-                    PrimPosAndRot(prim.Prim, out prim.SimPosition, out prim.SimRotation);\r
-                    prim.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, prim.SimPosition);\r
-                    SortedPrims.Add(prim);\r
+                    Primitive prim = null;\r
+                    if (obj is RenderPrimitive)\r
+                        prim = ((RenderPrimitive)obj).Prim;\r
+                    else if (obj is RenderAvatar)\r
+                        prim = ((RenderAvatar)obj).avatar;\r
+\r
+                    PrimPosAndRot(prim, out obj.SimPosition, out obj.SimRotation);\r
+                    obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.SimPosition);\r
+                    obj.PositionUpdated = true;\r
                 }\r
-                // RenderPrimitive class has IComparable implementation\r
-                // that allows sorting by distance\r
-                SortedPrims.Sort();\r
             }\r
+\r
+            // RenderPrimitive class has IComparable implementation\r
+            // that allows sorting by distance\r
+            SortedObjects.Sort();\r
         }\r
 \r
         private void RenderObjects(RenderPass pass)\r
@@ -2049,20 +2083,26 @@ namespace Radegast.Rendering
 \r
             // When rendering alpha faces, draw from back towards the camers\r
             // otherwise from those closest to camera, to the farthest\r
-            int nrPrims = SortedPrims.Count;\r
+            int nrPrims = SortedObjects.Count;\r
             if (pass == RenderPass.Picking || pass == RenderPass.Simple)\r
             {\r
                 for (int i = 0; i < nrPrims; i++)\r
                 {\r
                     //RenderBoundingBox(SortedPrims[i]);\r
-                    RenderPrim(SortedPrims[i], pass, i);\r
+                    if (SortedObjects[i] is RenderPrimitive)\r
+                    {\r
+                        RenderPrim((RenderPrimitive)SortedObjects[i], pass, i);\r
+                    }\r
                 }\r
             }\r
             else if (pass == RenderPass.Alpha)\r
             {\r
                 for (int i = nrPrims - 1; i >= 0; i--)\r
                 {\r
-                    RenderPrim(SortedPrims[i], pass, i);\r
+                    if (SortedObjects[i] is RenderPrimitive)\r
+                    {\r
+                        RenderPrim((RenderPrimitive)SortedObjects[i], pass, i);\r
+                    }\r
                 }\r
             }\r
 \r
@@ -2139,7 +2179,7 @@ namespace Radegast.Rendering
                 Camera.Step(lastFrameTime);\r
             }\r
 \r
-            SortPrims();\r
+            SortObjects();\r
 \r
             if (picking)\r
             {\r
index c88c938..7f0222d 100644 (file)
@@ -283,22 +283,25 @@ namespace Radegast.Rendering
         Alpha\r
     }\r
 \r
-    public class RenderPrimitive : IComparable, IDisposable\r
+    public enum SceneObjectType\r
+    {\r
+        None,\r
+        Primitive,\r
+        Avatar,\r
+    }\r
+\r
+    public abstract class SceneObject: IComparable\r
     {\r
-        public Primitive Prim;\r
-        public List<Face> Faces;\r
         public Vector3 SimPosition;\r
         public Quaternion SimRotation;\r
         public float DistanceSquared;\r
         public BoundingVolume BoundingVolume;\r
-\r
-        public virtual void Dispose()\r
-        {\r
-        }\r
+        public bool PositionUpdated;\r
+        public SceneObjectType Type = SceneObjectType.None;\r
 \r
         public virtual int CompareTo(object other)\r
         {\r
-            RenderPrimitive o = (RenderPrimitive)other;\r
+            SceneObject o = (SceneObject)other;\r
             if (this.DistanceSquared < o.DistanceSquared)\r
                 return -1;\r
             else if (this.DistanceSquared > o.DistanceSquared)\r
@@ -306,6 +309,21 @@ namespace Radegast.Rendering
             else\r
                 return 0;\r
         }\r
+    }\r
+\r
+    public class RenderPrimitive : SceneObject, IDisposable\r
+    {\r
+        public Primitive Prim;\r
+        public List<Face> Faces;\r
+\r
+        public RenderPrimitive()\r
+        {\r
+            Type = SceneObjectType.Primitive;\r
+        }\r
+\r
+        public virtual void Dispose()\r
+        {\r
+        }\r
 \r
         public override string ToString()\r
         {\r
@@ -1522,8 +1540,13 @@ namespace Radegast.Rendering
         }\r
     }\r
 \r
-    class RenderAvatar\r
+    class RenderAvatar : SceneObject\r
     {\r
+        public RenderAvatar()\r
+        {\r
+            Type = SceneObjectType.Avatar;\r
+        }\r
+\r
         public GLAvatar glavatar = new GLAvatar();\r
         public Avatar avatar;\r
         public FaceData[] data = new FaceData[32];\r