From e37c4e878ca28fd3afa5ad71364e0d66be6621af Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 1 Dec 2015 12:11:48 +0000 Subject: more changes on lookAt and RotLookAt; do something in attachments --- .../Region/Framework/Scenes/SceneObjectGroup.cs | 53 ++++++++++++++++++++ OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 58 +++++++++++----------- .../Shared/Api/Implementation/LSL_Api.cs | 16 ++++-- 3 files changed, 92 insertions(+), 35 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 4fb0afb..6e01d2d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -329,6 +329,7 @@ namespace OpenSim.Region.Framework.Scenes get { return (RootPart.Flags & PrimFlags.Physics) != 0; } } + /// /// Is this scene object temporary? /// @@ -2536,6 +2537,58 @@ namespace OpenSim.Region.Framework.Scenes } } + public void RotLookAt(Quaternion target, float strength, float damping) + { + if(IsDeleted) + return; + + // non physical is handle in LSL api + if(!UsesPhysics || IsAttachment) + return; + + SceneObjectPart rootpart = m_rootPart; + if (rootpart != null) + { +/* physics still doesnt suport this + if (rootpart.PhysActor != null) + { + 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; + } +*/ + // so do it in rootpart + rootpart.RotLookAt(target, strength, damping); + } + } + + public void StartLookAt(Quaternion target, float strength, float damping) + { + if(IsDeleted) + return; + + // non physical is done by LSL APi + if(!UsesPhysics || IsAttachment) + return; + + if (m_rootPart != null) + m_rootPart.RotLookAt(target, strength, damping); + } + + public void StopLookAt() + { + SceneObjectPart rootpart = m_rootPart; + if (rootpart != null) + { + if (rootpart.PhysActor != null) + { + rootpart.PhysActor.APIDActive = false; + } + + rootpart.StopLookAt(); + } + } /// /// Uses a PID to attempt to clamp the object on the Z axis at the given height over tau seconds. /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index e8d976d..33c1c4e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3091,37 +3091,31 @@ 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); + // for now we only handle physics case + if(!ParentGroup.UsesPhysics || ParentGroup.IsAttachment) + return; - if (ParentGroup.IsAttachment) + // physical is SOG + if(ParentGroup.RootPart != this) { - /* - ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar); - if (avatar != null) - { - Rotate the Av? - } */ + ParentGroup.RotLookAt(target, strength, damping); + return; } - else - { - APIDDamp = damping; - APIDStrength = strength; - APIDTarget = target; - if (APIDStrength <= 0) - { - m_log.WarnFormat("[SceneObjectPart] Invalid rotation strength {0}",APIDStrength); - return; - } - - APIDActive = true; + APIDDamp = damping; + APIDStrength = strength; + APIDTarget = target; + + if (APIDStrength <= 0) + { + m_log.WarnFormat("[SceneObjectPart] Invalid rotation strength {0}",APIDStrength); + return; } + + APIDActive = true; // Necessary to get the lookat deltas applied ParentGroup.QueueForUpdateCheck(); @@ -3129,15 +3123,18 @@ 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); + // non physical is done on LSL + if(ParentGroup.IsAttachment || !ParentGroup.UsesPhysics) + return; - RotLookAt(target,strength,damping); + // physical is SOG + if(ParentGroup.RootPart != this) + ParentGroup.RotLookAt(target, strength, damping); + else + RotLookAt(target,strength,damping); } public void StopLookAt() @@ -3145,9 +3142,10 @@ namespace OpenSim.Region.Framework.Scenes if(ParentGroup.IsDeleted) return; - if(ParentGroup.RootPart != this) - ParentGroup.RootPart.StopLookAt(); + if(ParentGroup.RootPart != this && ParentGroup.UsesPhysics) + ParentGroup.StopLookAt(); + // just in case do this always if(APIDActive) AngularVelocity = Vector3.Zero; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 8d59c2d..a2abbeb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -3569,7 +3569,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // and rotate so Z points to target with X below horizont LSL_Rotation rot = new LSL_Rotation(0.0, 0.707107, 0.0, 0.707107) * llAxes2Rot(dir, left, up); - if (m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) + SceneObjectGroup sog = m_host.ParentGroup; + if(sog == null || sog.IsDeleted) + return; + + if (!sog.UsesPhysics || sog.IsAttachment) { // Do nothing if either value is 0 (this has been checked in SL) if (strength <= 0.0 || damping <= 0.0) @@ -3585,7 +3589,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; } - m_host.StartLookAt(rot, (float)strength, (float)damping); + sog.StartLookAt(rot, (float)strength, (float)damping); } } @@ -3991,15 +3995,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // Per discussion with Melanie, for non-physical objects llLookAt appears to simply // set the rotation of the object, copy that behavior - PhysicsActor pa = m_host.PhysActor; + SceneObjectGroup sog = m_host.ParentGroup; + if(sog == null || sog.IsDeleted) + return; - if (strength == 0 || pa == null || !pa.IsPhysical) + if (strength == 0 || !sog.UsesPhysics || sog.IsAttachment) { llSetLocalRot(target); } else { - m_host.RotLookAt(target, (float)strength, (float)damping); + sog.RotLookAt(target, (float)strength, (float)damping); } } -- cgit v1.1