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
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
#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
// 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
}\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
});\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
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
private void btnReset_Click(object sender, EventArgs e)\r
{\r
InitCamera();\r
+ UpdateCamera();\r
scrollZoom.Value = 0;\r
}\r
\r