From: Latif Khalifa Date: Tue, 12 Jul 2011 18:04:25 +0000 (+0000) Subject: Implement angular velocity interpolation (target omega). X-Git-Tag: 2.8~391 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=474ce90c862ff0b392bd630e4dc4ac0716ba54a1;p=radegast%2Fradegast.git Implement angular velocity interpolation (target omega). git-svn-id: https://radegast.googlecode.com/svn/trunk@980 f7a694da-4d33-11de-9ad6-1127a62b9fcd --- diff --git a/Radegast/GUI/Rendering/Rendering.cs b/Radegast/GUI/Rendering/Rendering.cs index 4bfa857..ea687fa 100644 --- a/Radegast/GUI/Rendering/Rendering.cs +++ b/Radegast/GUI/Rendering/Rendering.cs @@ -963,6 +963,19 @@ namespace Radegast.Rendering return pos; } + bool IsAttached(uint parentLocalID) + { + if (parentLocalID == 0) return false; + if (Client.Network.CurrentSim.ObjectsAvatars.ContainsKey(parentLocalID)) + { + return true; + } + else + { + return IsAttached(Client.Network.CurrentSim.ObjectsPrimitives[parentLocalID].ParentID); + } + } + SceneObject GetSceneObject(uint localID) { RenderPrimitive parent; @@ -1011,6 +1024,17 @@ namespace Radegast.Rendering p.PositionCalculated = true; } + if (p is RenderPrimitive && ((RenderPrimitive)p).Attached) + { + parentPos = p.SimPosition; + parentRot = p.SimRotation; + } + else + { + parentPos = p.RenderPosition; + parentRot = p.RenderRotation; + } + if (p is RenderPrimitive) { pos = parentPos + prim.Position * parentRot; @@ -1332,6 +1356,9 @@ namespace Radegast.Rendering int avatarNr = 0; foreach (RenderAvatar av in Avatars.Values) { + // Init interpolation state + if (!av.Initialized) av.Initialize(); + avatarNr++; if (av.glavatar._meshes.Count > 0) @@ -1354,7 +1381,7 @@ namespace Radegast.Rendering // Prim roation and position //GL.MultMatrix(Math3D.CreateTranslationMatrix(av.avatar.Position)); //GL.MultMatrix(Math3D.CreateRotationMatrix(av.avatar.Rotation)); - GL.MultMatrix(Math3D.CreateSRTMatrix(new Vector3(1, 1, 1), av.SimRotation, av.SimPosition)); + GL.MultMatrix(Math3D.CreateSRTMatrix(new Vector3(1, 1, 1), av.RenderRotation, av.RenderPosition)); // Special case for eyeballs we need to offset the mesh to the correct position // We have manually added the eyeball offset based on the headbone when we @@ -1811,7 +1838,16 @@ namespace Radegast.Rendering if (!mesh.Initialized) mesh.Initialize(); // Do any position interpolation - mesh.Step(lastFrameTime); + SceneObject parent = GetSceneObject(mesh.Prim.ParentID); + if (parent != null) + { + if (!mesh.AttachedStateKnown) + { + mesh.Attached = IsAttached(mesh.BasePrim.ParentID); + mesh.AttachedStateKnown = true; + } + mesh.Step(lastFrameTime); + } Primitive prim = mesh.Prim; @@ -1995,8 +2031,32 @@ namespace Radegast.Rendering obj.PositionCalculated = false; } + // First calculate positions and rotations of root objects + // Perform any position interpolation + foreach (SceneObject obj in SortedObjects) + { + if (obj.BasePrim.ParentID != 0) continue; + + if (obj is RenderPrimitive) + { + ((RenderPrimitive)obj).Attached = false; + } + + obj.Step(lastFrameTime); + + if (!obj.PositionCalculated) + { + PrimPosAndRot(obj.BasePrim, out obj.SimPosition, out obj.SimRotation); + obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.SimPosition); + obj.PositionCalculated = true; + } + } + + // Calculate position and rotations of child objects foreach (SceneObject obj in SortedObjects) { + if (obj.BasePrim.ParentID == 0) continue; + if (!obj.PositionCalculated) { PrimPosAndRot(obj.BasePrim, out obj.SimPosition, out obj.SimRotation); @@ -2368,7 +2428,11 @@ namespace Radegast.Rendering if (prim.Textures == null) return; RenderPrimitive rPrim = null; - if (!Prims.TryGetValue(prim.LocalID, out rPrim)) + if (Prims.TryGetValue(prim.LocalID, out rPrim)) + { + rPrim.AttachedStateKnown = false; + } + else { rPrim = new RenderPrimitive(); } diff --git a/Radegast/GUI/Rendering/RenderingHelpers.cs b/Radegast/GUI/Rendering/RenderingHelpers.cs index a7f46aa..e1b4f8f 100644 --- a/Radegast/GUI/Rendering/RenderingHelpers.cs +++ b/Radegast/GUI/Rendering/RenderingHelpers.cs @@ -327,6 +327,9 @@ namespace Radegast.Rendering /// public virtual void Initialize() { + RenderPosition = SimPosition; + RenderRotation = SimRotation; + Initialized = true; } /// @@ -359,6 +362,10 @@ namespace Radegast.Rendering { public Primitive Prim; public List Faces; + /// Is this object attached to an avatar + public bool Attached; + /// Do we know if object is attached + public bool AttachedStateKnown; public RenderPrimitive() { @@ -373,18 +380,32 @@ namespace Radegast.Rendering public override void Initialize() { - RenderPosition = SimPosition; - RenderRotation = SimRotation; - Initialized = true; + AttachedStateKnown = false; + base.Initialize(); } public override void Step(double time) { + // Don't interpolate positions of attached objects + if (Attached) + { + RenderPosition = SimPosition; + RenderRotation = SimRotation; + return; + } + if (RenderPosition != SimPosition) { RenderPosition = RHelp.Smoothed1stOrder(RenderPosition, SimPosition, time); } - if (RenderRotation != SimRotation) + if (Prim.AngularVelocity != Vector3.Zero) + { + Vector3 angVel = Prim.AngularVelocity; + float angle = (float)time * angVel.Length(); + Quaternion dQ = Quaternion.CreateFromAxisAngle(angVel, angle); + RenderRotation = dQ * RenderRotation; + } + else if (RenderRotation != SimRotation) { RenderRotation = SimRotation; } @@ -1618,6 +1639,16 @@ namespace Radegast.Rendering set { if (value is Avatar) avatar = (Avatar)value; } } + public override void Step(double time) + { + if (RenderPosition != SimPosition) + { + RenderPosition = RHelp.Smoothed1stOrder(RenderPosition, SimPosition, time); + } + RenderRotation = SimRotation; + base.Step(time); + } + public GLAvatar glavatar = new GLAvatar(); public Avatar avatar; public FaceData[] data = new FaceData[32];