diff options
author | Mic Bowman | 2012-01-13 14:48:56 -0800 |
---|---|---|
committer | Mic Bowman | 2012-01-13 14:48:56 -0800 |
commit | e1a2c44ebe8f10cf00a14578e44b000ff16b68df (patch) | |
tree | 00d0dd19ce7a3f4f67d8625868c594777132de27 | |
parent | Fix llRotLookAt and llLookAt for non-physical objects. Per conversation (diff) | |
download | opensim-SC_OLD-e1a2c44ebe8f10cf00a14578e44b000ff16b68df.zip opensim-SC_OLD-e1a2c44ebe8f10cf00a14578e44b000ff16b68df.tar.gz opensim-SC_OLD-e1a2c44ebe8f10cf00a14578e44b000ff16b68df.tar.bz2 opensim-SC_OLD-e1a2c44ebe8f10cf00a14578e44b000ff16b68df.tar.xz |
Cleaned up the LookAt code in SOP and SOG. Added support for incrementally
rotating physical objects. This does not use physics. Currently the rate
of change is determined as 1 / (PI * Strength).
3 files changed, 34 insertions, 49 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 8860764..cad09b8 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1613,12 +1613,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1613 | RootPart.PhysActor.PIDActive = false; | 1613 | RootPart.PhysActor.PIDActive = false; |
1614 | } | 1614 | } |
1615 | 1615 | ||
1616 | public void stopLookAt() | ||
1617 | { | ||
1618 | if (RootPart.PhysActor != null) | ||
1619 | RootPart.PhysActor.APIDActive = false; | ||
1620 | } | ||
1621 | |||
1622 | /// <summary> | 1616 | /// <summary> |
1623 | /// Uses a PID to attempt to clamp the object on the Z axis at the given height over tau seconds. | 1617 | /// Uses a PID to attempt to clamp the object on the Z axis at the given height over tau seconds. |
1624 | /// </summary> | 1618 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index e9c33eb..ad3bcd5 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -217,11 +217,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
217 | 217 | ||
218 | public Quaternion SpinOldOrientation = Quaternion.Identity; | 218 | public Quaternion SpinOldOrientation = Quaternion.Identity; |
219 | 219 | ||
220 | public Quaternion m_APIDTarget = Quaternion.Identity; | 220 | protected int m_APIDIterations = 0; |
221 | 221 | protected Quaternion m_APIDTarget = Quaternion.Identity; | |
222 | public float m_APIDDamp = 0; | 222 | protected float m_APIDDamp = 0; |
223 | 223 | protected float m_APIDStrength = 0; | |
224 | public float m_APIDStrength = 0; | ||
225 | 224 | ||
226 | /// <summary> | 225 | /// <summary> |
227 | /// This part's inventory | 226 | /// This part's inventory |
@@ -563,22 +562,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
563 | } | 562 | } |
564 | } | 563 | } |
565 | 564 | ||
566 | 565 | protected Quaternion APIDTarget | |
567 | public Quaternion APIDTarget | ||
568 | { | 566 | { |
569 | get { return m_APIDTarget; } | 567 | get { return m_APIDTarget; } |
570 | set { m_APIDTarget = value; } | 568 | set { m_APIDTarget = value; } |
571 | } | 569 | } |
572 | 570 | ||
573 | 571 | ||
574 | public float APIDDamp | 572 | protected float APIDDamp |
575 | { | 573 | { |
576 | get { return m_APIDDamp; } | 574 | get { return m_APIDDamp; } |
577 | set { m_APIDDamp = value; } | 575 | set { m_APIDDamp = value; } |
578 | } | 576 | } |
579 | 577 | ||
580 | 578 | ||
581 | public float APIDStrength | 579 | protected float APIDStrength |
582 | { | 580 | { |
583 | get { return m_APIDStrength; } | 581 | get { return m_APIDStrength; } |
584 | set { m_APIDStrength = value; } | 582 | set { m_APIDStrength = value; } |
@@ -2697,11 +2695,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2697 | 2695 | ||
2698 | public void RotLookAt(Quaternion target, float strength, float damping) | 2696 | public void RotLookAt(Quaternion target, float strength, float damping) |
2699 | { | 2697 | { |
2700 | rotLookAt(target, strength, damping); | ||
2701 | } | ||
2702 | |||
2703 | public void rotLookAt(Quaternion target, float strength, float damping) | ||
2704 | { | ||
2705 | if (ParentGroup.IsAttachment) | 2698 | if (ParentGroup.IsAttachment) |
2706 | { | 2699 | { |
2707 | /* | 2700 | /* |
@@ -2716,17 +2709,26 @@ namespace OpenSim.Region.Framework.Scenes | |||
2716 | APIDDamp = damping; | 2709 | APIDDamp = damping; |
2717 | APIDStrength = strength; | 2710 | APIDStrength = strength; |
2718 | APIDTarget = target; | 2711 | APIDTarget = target; |
2712 | |||
2713 | if (APIDStrength <= 0) | ||
2714 | { | ||
2715 | m_log.WarnFormat("[SceneObjectPart] Invalid rotation strength {0}",APIDStrength); | ||
2716 | return; | ||
2717 | } | ||
2718 | |||
2719 | m_APIDIterations = 1 + (int)(Math.PI * APIDStrength); | ||
2719 | } | 2720 | } |
2721 | |||
2722 | // Necessary to get the lookat deltas applied | ||
2723 | ParentGroup.QueueForUpdateCheck(); | ||
2720 | } | 2724 | } |
2721 | 2725 | ||
2722 | public void startLookAt(Quaternion rot, float damp, float strength) | 2726 | public void StartLookAt(Quaternion target, float strength, float damping) |
2723 | { | 2727 | { |
2724 | APIDDamp = damp; | 2728 | RotLookAt(target,strength,damping); |
2725 | APIDStrength = strength; | ||
2726 | APIDTarget = rot; | ||
2727 | } | 2729 | } |
2728 | 2730 | ||
2729 | public void stopLookAt() | 2731 | public void StopLookAt() |
2730 | { | 2732 | { |
2731 | APIDTarget = Quaternion.Identity; | 2733 | APIDTarget = Quaternion.Identity; |
2732 | } | 2734 | } |
@@ -3417,13 +3419,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3417 | } | 3419 | } |
3418 | } | 3420 | } |
3419 | 3421 | ||
3420 | public void StopLookAt() | ||
3421 | { | ||
3422 | ParentGroup.stopLookAt(); | ||
3423 | |||
3424 | ParentGroup.ScheduleGroupForTerseUpdate(); | ||
3425 | } | ||
3426 | |||
3427 | /// <summary> | 3422 | /// <summary> |
3428 | /// Set the text displayed for this part. | 3423 | /// Set the text displayed for this part. |
3429 | /// </summary> | 3424 | /// </summary> |
@@ -4731,24 +4726,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
4731 | { | 4726 | { |
4732 | if (APIDTarget != Quaternion.Identity) | 4727 | if (APIDTarget != Quaternion.Identity) |
4733 | { | 4728 | { |
4734 | if (Single.IsNaN(APIDTarget.W) == true) | 4729 | if (m_APIDIterations <= 1) |
4735 | { | 4730 | { |
4731 | UpdateRotation(APIDTarget); | ||
4736 | APIDTarget = Quaternion.Identity; | 4732 | APIDTarget = Quaternion.Identity; |
4737 | return; | 4733 | return; |
4738 | } | 4734 | } |
4739 | Quaternion rot = RotationOffset; | 4735 | |
4740 | Quaternion dir = (rot - APIDTarget); | 4736 | Quaternion rot = Quaternion.Slerp(RotationOffset,APIDTarget,1.0f/(float)m_APIDIterations); |
4741 | float speed = ((APIDStrength / APIDDamp) * (float)(Math.PI / 180.0f)); | ||
4742 | if (dir.Z > speed) | ||
4743 | { | ||
4744 | rot.Z -= speed; | ||
4745 | } | ||
4746 | if (dir.Z < -speed) | ||
4747 | { | ||
4748 | rot.Z += speed; | ||
4749 | } | ||
4750 | rot.Normalize(); | ||
4751 | UpdateRotation(rot); | 4737 | UpdateRotation(rot); |
4738 | |||
4739 | m_APIDIterations--; | ||
4740 | |||
4741 | // This ensures that we'll check this object on the next iteration | ||
4742 | ParentGroup.QueueForUpdateCheck(); | ||
4752 | } | 4743 | } |
4753 | } | 4744 | } |
4754 | catch (Exception ex) | 4745 | catch (Exception ex) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 30145c7..ab175ba 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2865,13 +2865,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2865 | 2865 | ||
2866 | // Per discussion with Melanie, for non-physical objects llLookAt appears to simply | 2866 | // Per discussion with Melanie, for non-physical objects llLookAt appears to simply |
2867 | // set the rotation of the object, copy that behavior | 2867 | // set the rotation of the object, copy that behavior |
2868 | if (m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) | 2868 | if (strength == 0 || m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) |
2869 | { | 2869 | { |
2870 | llSetRot(rot); | 2870 | llSetRot(rot); |
2871 | } | 2871 | } |
2872 | else | 2872 | else |
2873 | { | 2873 | { |
2874 | m_host.startLookAt(Rot2Quaternion(rot), (float)damping, (float)strength); | 2874 | m_host.StartLookAt(Rot2Quaternion(rot), (float)strength, (float)damping); |
2875 | } | 2875 | } |
2876 | } | 2876 | } |
2877 | 2877 | ||
@@ -3251,13 +3251,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3251 | 3251 | ||
3252 | // Per discussion with Melanie, for non-physical objects llLookAt appears to simply | 3252 | // Per discussion with Melanie, for non-physical objects llLookAt appears to simply |
3253 | // set the rotation of the object, copy that behavior | 3253 | // set the rotation of the object, copy that behavior |
3254 | if (m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) | 3254 | if (strength == 0 || m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) |
3255 | { | 3255 | { |
3256 | llSetLocalRot(target); | 3256 | llSetLocalRot(target); |
3257 | } | 3257 | } |
3258 | else | 3258 | else |
3259 | { | 3259 | { |
3260 | m_host.RotLookAt(Rot2Quaternion(target), (float)damping, (float)strength); | 3260 | m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping); |
3261 | } | 3261 | } |
3262 | } | 3262 | } |
3263 | 3263 | ||