OSDN Git Service

Make 3D view work across teleports.
authorLatif Khalifa <latifer@streamgrid.net>
Sun, 26 Jun 2011 21:25:55 +0000 (21:25 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Sun, 26 Jun 2011 21:25:55 +0000 (21:25 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@907 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Rendering/Rendering.cs

index 6d0cc6f..affad93 100644 (file)
@@ -116,7 +116,9 @@ namespace Radegast
             Client.Objects.ObjectUpdate += new EventHandler<PrimEventArgs>(Objects_ObjectUpdate);\r
             Client.Objects.ObjectDataBlockUpdate += new EventHandler<ObjectDataBlockUpdateEventArgs>(Objects_ObjectDataBlockUpdate);\r
             Client.Objects.KillObject += new EventHandler<KillObjectEventArgs>(Objects_KillObject);\r
-\r
+            Client.Network.SimChanged += new EventHandler<SimChangedEventArgs>(Network_SimChanged);\r
+            Client.Self.TeleportProgress += new EventHandler<TeleportEventArgs>(Self_TeleportProgress);\r
+            Instance.Netcom.ClientDisconnected += new EventHandler<DisconnectedEventArgs>(Netcom_ClientDisconnected);\r
             Application.Idle += new EventHandler(Application_Idle);\r
         }\r
 \r
@@ -127,6 +129,9 @@ namespace Radegast
             Client.Objects.ObjectUpdate -= new EventHandler<PrimEventArgs>(Objects_ObjectUpdate);\r
             Client.Objects.ObjectDataBlockUpdate -= new EventHandler<ObjectDataBlockUpdateEventArgs>(Objects_ObjectDataBlockUpdate);\r
             Client.Objects.KillObject -= new EventHandler<KillObjectEventArgs>(Objects_KillObject);\r
+            Client.Network.SimChanged -= new EventHandler<SimChangedEventArgs>(Network_SimChanged);\r
+            Client.Self.TeleportProgress -= new EventHandler<TeleportEventArgs>(Self_TeleportProgress);\r
+            Instance.Netcom.ClientDisconnected -= new EventHandler<DisconnectedEventArgs>(Netcom_ClientDisconnected);\r
 \r
             if (glControl != null)\r
             {\r
@@ -151,23 +156,72 @@ namespace Radegast
         #endregion Construction and disposal\r
 \r
         #region Network messaage handlers\r
+        void Netcom_ClientDisconnected(object sender, DisconnectedEventArgs e)\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                if (IsHandleCreated || !instance.MonoRuntime)\r
+                {\r
+                    BeginInvoke(new MethodInvoker(() => Netcom_ClientDisconnected(sender, e)));\r
+                }\r
+                return;\r
+            }\r
+\r
+            Dispose();\r
+        }\r
+\r
+        void Self_TeleportProgress(object sender, TeleportEventArgs e)\r
+        {\r
+            switch (e.Status)\r
+            {\r
+                case TeleportStatus.Progress:\r
+                case TeleportStatus.Start:\r
+                    RenderingEnabled = false;\r
+                    break;\r
+\r
+                case TeleportStatus.Cancelled:\r
+                case TeleportStatus.Failed:\r
+                    RenderingEnabled = true;\r
+                    break;\r
+\r
+                case TeleportStatus.Finished:\r
+                    ThreadPool.QueueUserWorkItem(sync =>\r
+                    {\r
+                        Thread.Sleep(3000);\r
+                        InitCamera();\r
+                        LoadCurrentPrims();\r
+                        RenderingEnabled = true;\r
+                    });\r
+                    break;\r
+            }\r
+        }\r
+\r
+        void Network_SimChanged(object sender, SimChangedEventArgs e)\r
+        {\r
+            lock (Prims) Prims.Clear();\r
+        }\r
+\r
         void Objects_KillObject(object sender, KillObjectEventArgs e)\r
         {\r
+            if (e.Simulator.Handle != Client.Network.CurrentSim.Handle) return;\r
             lock (Prims) Prims.Remove(e.ObjectLocalID);\r
         }\r
 \r
         void Objects_TerseObjectUpdate(object sender, TerseObjectUpdateEventArgs e)\r
         {\r
+            if (e.Simulator.Handle != Client.Network.CurrentSim.Handle) return;\r
             UpdatePrimBlocking(e.Prim);\r
         }\r
 \r
         void Objects_ObjectUpdate(object sender, PrimEventArgs e)\r
         {\r
+            if (e.Simulator.Handle != Client.Network.CurrentSim.Handle) return;\r
             UpdatePrimBlocking(e.Prim);\r
         }\r
 \r
         void Objects_ObjectDataBlockUpdate(object sender, ObjectDataBlockUpdateEventArgs e)\r
         {\r
+            if (e.Simulator.Handle != Client.Network.CurrentSim.Handle) return;\r
             UpdatePrimBlocking(e.Prim);\r
         }\r
         #endregion Network messaage handlers\r
@@ -421,8 +475,8 @@ namespace Radegast
                     // Rotate camera in a vertical circle around target on up down mouse movement\r
                     if (ModifierKeys == (Keys.Alt | Keys.Control))\r
                     {\r
-                        Camera.Position = Camera.FocalPoint + \r
-                            (Camera.Position - Camera.FocalPoint) \r
+                        Camera.Position = Camera.FocalPoint +\r
+                            (Camera.Position - Camera.FocalPoint)\r
                             * Quaternion.CreateFromAxisAngle((Camera.Position - Camera.FocalPoint) % new Vector3(0f, 0f, 1f), deltaY * pixelToM);\r
                         var dx = -(deltaX * pixelToM);\r
                         Camera.Position = Camera.FocalPoint + (Camera.Position - Camera.FocalPoint) * new Quaternion(0f, 0f, (float)Math.Sin(dx), (float)Math.Cos(dx));\r
@@ -556,10 +610,8 @@ namespace Radegast
         }\r
         #endregion Texture thread\r
 \r
-        private void frmPrimWorkshop_Shown(object sender, EventArgs e)\r
+        void LoadCurrentPrims()\r
         {\r
-            SetupGLControl();\r
-            UpdateCamera();\r
             ThreadPool.QueueUserWorkItem(sync =>\r
                 {\r
                     Client.Network.CurrentSim.ObjectsPrimitives.FindAll((Primitive root) => root.ParentID == 0).ForEach((Primitive mainPrim) =>\r
@@ -571,7 +623,13 @@ namespace Radegast
                     });\r
                 }\r
             );\r
+        }\r
 \r
+        private void frmPrimWorkshop_Shown(object sender, EventArgs e)\r
+        {\r
+            SetupGLControl();\r
+            UpdateCamera();\r
+            LoadCurrentPrims();\r
         }\r
 \r
         #region Private methods (the meat)\r
@@ -603,7 +661,6 @@ namespace Radegast
             Camera.FocalPoint = Client.Self.SimPosition + new Vector3(5, 0, 0) * Client.Self.Movement.BodyRotation;\r
             Camera.Zoom = 1.0f;\r
             Camera.Far = 128.0f;\r
-            UpdateCamera();\r
         }\r
 \r
         Vector3 PrimPos(Primitive prim)\r
@@ -1131,6 +1188,7 @@ namespace Radegast
         private void btnReset_Click(object sender, EventArgs e)\r
         {\r
             InitCamera();\r
+            UpdateCamera();\r
             scrollZoom.Value = 0;\r
         }\r
 \r