#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
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
/// <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
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
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
// 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