From a9e58d61754ef4f3cf0c586ad343146418307c10 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Tue, 1 Dec 2015 10:15:38 +0000
Subject: some changes due to lookAt and RotLookAt

---
 .../Region/Framework/Scenes/SceneObjectGroup.cs    | 46 ++--------------
 OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 63 ++++++++++++++--------
 2 files changed, 46 insertions(+), 63 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index e780f86..4fb0afb 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2535,46 +2535,6 @@ namespace OpenSim.Region.Framework.Scenes
                 RootPart.ScheduleTerseUpdate(); // send a stop information
             }
         }
-        
-        public void rotLookAt(Quaternion target, float strength, float damping)
-        {
-            SceneObjectPart rootpart = m_rootPart;
-            if (rootpart != null)
-            {
-                if (IsAttachment)
-                {
-                /*
-                    ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
-                    if (avatar != null)
-                    {
-                    Rotate the Av?
-                    } */
-                }
-                else
-                {
-                    if (rootpart.PhysActor != null)
-                    {									// APID must be implemented in your physics system for this to function.
-                        rootpart.PhysActor.APIDTarget = new Quaternion(target.X, target.Y, target.Z, target.W);
-                        rootpart.PhysActor.APIDStrength = strength;
-                        rootpart.PhysActor.APIDDamping = damping;
-                        rootpart.PhysActor.APIDActive = true;
-                    }
-                }
-            }
-        }
-
-        public void stopLookAt()
-        {
-            SceneObjectPart rootpart = m_rootPart;
-            if (rootpart != null)
-            {
-                if (rootpart.PhysActor != null)
-                {							// APID must be implemented in your physics system for this to function.
-                    rootpart.PhysActor.APIDActive = false;
-                }
-            }
-        
-        }
 
         /// <summary>
         /// Uses a PID to attempt to clamp the object on the Z axis at the given height over tau seconds.
@@ -2726,12 +2686,14 @@ namespace OpenSim.Region.Framework.Scenes
                 }
             }
 
+            // while physics doesn't suports LookAt, we do it in RootPart
+            if (!IsSelected)
+                RootPart.UpdateLookAt();
+
             SceneObjectPart[] parts = m_parts.GetArray();
             for (int i = 0; i < parts.Length; i++)
             {
                 SceneObjectPart part = parts[i];
-                if (!IsSelected)
-                    part.UpdateLookAt();
                 part.SendScheduledUpdates();
             }
         }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 52f9b51..e8d976d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -458,6 +458,7 @@ namespace OpenSim.Region.Framework.Scenes
             Velocity = Vector3.Zero;
             AngularVelocity = Vector3.Zero;
             Acceleration = Vector3.Zero;
+            APIDActive = false;
             Flags = 0;
             CreateSelected = true;
 
@@ -1713,12 +1714,9 @@ namespace OpenSim.Region.Framework.Scenes
                     {
                         if (PhysActor != null)
                         {
-                            Velocity = new Vector3(0, 0, 0);
-                            Acceleration = new Vector3(0, 0, 0);
-                            if (ParentGroup.RootPart == this)
-                                AngularVelocity = new Vector3(0, 0, 0);
                             ParentGroup.Scene.RemovePhysicalPrim(1);
                             RemoveFromPhysics();
+                            Stop();
                         }
                     }
                     else if (PhysActor == null)
@@ -2350,9 +2348,7 @@ namespace OpenSim.Region.Framework.Scenes
                     ParentGroup.Scene.PhysicsScene.RequestJointDeletion(Name); // FIXME: what if the name changed?
 
                     // make sure client isn't interpolating the joint proxy object
-                    Velocity = Vector3.Zero;
-                    AngularVelocity = Vector3.Zero;
-                    Acceleration = Vector3.Zero;
+                    Stop();
                 }
             }
         }
@@ -2391,8 +2387,8 @@ namespace OpenSim.Region.Framework.Scenes
 
                                 Velocity = new Vector3(0, 0, 0);
                                 Acceleration = new Vector3(0, 0, 0);
-                                if (ParentGroup.RootPart == this)
-                                    AngularVelocity = new Vector3(0, 0, 0);
+                                AngularVelocity = new Vector3(0, 0, 0);
+                                APIDActive = false;
 
                                 if (pa.Phantom && !VolumeDetectActive)
                                 {
@@ -2994,7 +2990,7 @@ namespace OpenSim.Region.Framework.Scenes
                 }
                 //ParentGroup.RootPart.m_groupPosition = newpos;
             }
-/* ubit:  there are no flexible links 
+/*
             if (pa != null && ParentID != 0 && ParentGroup != null)
             {
                 // Special case where a child object is requesting property updates.
@@ -3095,6 +3091,14 @@ namespace OpenSim.Region.Framework.Scenes
         
         public void RotLookAt(Quaternion target, float strength, float damping)
         {
+            // non physical is done on LSL
+            // physical is a rootpart thing
+            if(ParentGroup.IsDeleted)
+                return;
+
+            if(ParentGroup.RootPart != this)
+                ParentGroup.RootPart.RotLookAt(target, strength, damping);
+
             if (ParentGroup.IsAttachment)
             {
                 /*
@@ -3125,15 +3129,30 @@ namespace OpenSim.Region.Framework.Scenes
 
         public void StartLookAt(Quaternion target, float strength, float damping)
         {
+           // non physical is done on LSL
+            // physical is a rootpart thing
+            if(ParentGroup.IsDeleted)
+                return;
+
+            if(ParentGroup.RootPart != this)
+                ParentGroup.RootPart.RotLookAt(target, strength, damping);
+
             RotLookAt(target,strength,damping);
         }
 
         public void StopLookAt()
         {
-            APIDActive = false;
-        }
+            if(ParentGroup.IsDeleted)
+                return;
 
+            if(ParentGroup.RootPart != this)
+                 ParentGroup.RootPart.StopLookAt();
 
+            if(APIDActive)
+                AngularVelocity = Vector3.Zero;
+
+            APIDActive = false;
+        }
 
         public void ScheduleFullUpdateIfNone()
         {
@@ -3543,7 +3562,6 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
             }
         }
 
-
         public int VehicleType
         {
             get
@@ -4733,10 +4751,7 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
                     RemoveFromPhysics();
                 }
 
-                Velocity = new Vector3(0, 0, 0);
-                Acceleration = new Vector3(0, 0, 0);
-                if (ParentGroup.RootPart == this)
-                    AngularVelocity = new Vector3(0, 0, 0);
+                Stop();
             }
             
             else 
@@ -4909,17 +4924,15 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
                     }
                 }
 
-                if (applyDynamics) 
+                if (applyDynamics && LocalId != ParentGroup.RootPart.LocalId) 
                     // do independent of isphysical so parameters get setted (at least some)                   
                 {
                     Velocity = velocity;
                     AngularVelocity = rotationalVelocity;
-//                    pa.Velocity = velocity;
                     pa.RotationalVelocity = rotationalVelocity;
 
                     // if not vehicle and root part apply force and torque
-                    if ((m_vehicleParams == null || m_vehicleParams.Type == Vehicle.TYPE_NONE)
-                            && LocalId == ParentGroup.RootPart.LocalId)
+                    if ((m_vehicleParams == null || m_vehicleParams.Type == Vehicle.TYPE_NONE))
                     {
                         pa.Force = Force;
                         pa.Torque = Torque;
@@ -5629,5 +5642,13 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
                     return m_sittingAvatars.Count;
             }
         }
+
+        public void Stop()
+        {
+            Velocity = Vector3.Zero;
+            AngularVelocity = Vector3.Zero;
+            Acceleration = Vector3.Zero;
+            APIDActive = false;
+        }
     }
 }
-- 
cgit v1.1