OSDN Git Service

Move camera tracking code to the main render loop and track based on render position.
authorLatif Khalifa <latifer@streamgrid.net>
Fri, 29 Jul 2011 18:31:39 +0000 (18:31 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Fri, 29 Jul 2011 18:31:39 +0000 (18:31 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@1033 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Rendering/Rendering.cs

index b378b2e..fc306aa 100644 (file)
@@ -127,6 +127,11 @@ namespace Radegast.Rendering
         #region Private fields\r
 \r
         Camera Camera;\r
+        SceneObject trackedObject;\r
+        Vector3 lastTrackedObjectPos = RHelp.InvalidPosition;\r
+        RenderAvatar myself;\r
+        bool cameraLocked = false;\r
+\r
         Dictionary<UUID, TextureInfo> TexturesPtrMap = new Dictionary<UUID, TextureInfo>();\r
         MeshmerizerR renderer;\r
         OpenTK.Graphics.GraphicsMode GLMode = null;\r
@@ -379,8 +384,10 @@ namespace Radegast.Rendering
         void Objects_TerseObjectUpdate(object sender, TerseObjectUpdateEventArgs e)\r
         {\r
             if (e.Simulator.Handle != Client.Network.CurrentSim.Handle) return;\r
-            if(e.Prim.ID == Client.Self.AgentID)\r
-                UpdateCameraClientMovement (e.Update.Position);//Update our camera with the new pos (if nessessary)\r
+            if (e.Prim.ID == Client.Self.AgentID)\r
+            {\r
+                trackedObject = myself;\r
+            }\r
 \r
             //If it is an avatar, we don't need to deal with the terse update stuff, unless it sends textures to us\r
             if(e.Prim.PrimData.PCode == PCode.Avatar && e.Update.Textures == null)\r
@@ -721,7 +728,6 @@ namespace Radegast.Rendering
         /// <summary>\r
         /// The camera doesn't move when ctrl-alt has been used, so don't move it if the user moves around\r
         /// </summary>\r
-        bool cameraLocked = false;\r
         private Vector3 lastCachedClientCameraPos = Vector3.Zero;\r
 \r
         private void glControl_MouseWheel(object sender, MouseEventArgs e)\r
@@ -729,23 +735,6 @@ namespace Radegast.Rendering
             Camera.Position += (Camera.Position - Camera.FocalPoint) * (e.Delta / -500f);\r
         }\r
 \r
-        private void UpdateCameraClientMovement(Vector3 newPos)\r
-        {\r
-            if(!cameraLocked)\r
-            {\r
-                if(lastCachedClientCameraPos != Vector3.Zero)\r
-                {\r
-                    //Add in the changes to the position, but don't reset the camera\r
-                    Vector3 diffPos = (newPos - lastCachedClientCameraPos);\r
-                    Camera.Position += diffPos;\r
-                    Camera.FocalPoint += diffPos;\r
-                }\r
-                else\r
-                    InitCamera();//Reset the camera, we don't have a previous position\r
-                lastCachedClientCameraPos = newPos;\r
-            }\r
-        }\r
-\r
         SceneObject RightclickedObject;\r
         int RightclickedFaceID;\r
 \r
@@ -1432,7 +1421,10 @@ namespace Radegast.Rendering
                     updateAVtes(ra);\r
                     Avatars.Add(av.LocalID, ra);\r
                     ra.glavatar.morph(av);\r
-\r
+                    if (av.LocalID == Client.Self.LocalID)\r
+                    {\r
+                        myself = ra;\r
+                    }\r
                 }\r
             }\r
         }\r
@@ -2507,6 +2499,21 @@ namespace Radegast.Rendering
             // Push the world matrix\r
             GL.PushMatrix();\r
 \r
+            if (!cameraLocked && trackedObject != null)\r
+            {\r
+                if (lastTrackedObjectPos == RHelp.InvalidPosition)\r
+                {\r
+                    lastTrackedObjectPos = trackedObject.RenderPosition;\r
+                } \r
+                else if (lastTrackedObjectPos != trackedObject.RenderPosition)\r
+                {\r
+                    Vector3 diffPos = (trackedObject.RenderPosition - lastTrackedObjectPos);\r
+                    Camera.Position += diffPos;\r
+                    Camera.FocalPoint += diffPos;\r
+                    lastTrackedObjectPos = trackedObject.RenderPosition;\r
+                }\r
+            }\r
+\r
             if (Camera.Modified)\r
             {\r
                 GL.GetFloat(GetPName.ProjectionMatrix, out ProjectionMatrix);\r