diff options
author | teravus | 2013-08-24 18:55:21 -0500 |
---|---|---|
committer | teravus | 2013-09-16 11:32:05 -0500 |
commit | 120b6948ed873a3af7713b411b956b8cb4c7f516 (patch) | |
tree | 309557e12aa44541bf8a340a8dda108da60bc468 /OpenSim | |
parent | * Fix a null ref that causes a stack unwind when crossing borders. Less stac... (diff) | |
download | opensim-SC-120b6948ed873a3af7713b411b956b8cb4c7f516.zip opensim-SC-120b6948ed873a3af7713b411b956b8cb4c7f516.tar.gz opensim-SC-120b6948ed873a3af7713b411b956b8cb4c7f516.tar.bz2 opensim-SC-120b6948ed873a3af7713b411b956b8cb4c7f516.tar.xz |
* This fixes the border crossing offsets by storing the final keyframe location in the hijacked variable KeyFrame.AngularVelocity. When steps in OnTimer <= 0.0, normalize the final position by Constants.RegionSize and move the object there. The hack here is KeyFrame.AngularVelocity probably isn't the right name for this variable because it's the un-mucked with keyframe position. When you determine the feasibility of changing the name without affecting the serialization of existing objects in world... It's simply a name change to KeyFrame.FinalPosition or something proper.
(cherry picked from commit e0399ccaec68889c12e4679b4d62142b49b379df)
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 29652aa..4d153da 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | |||
@@ -498,6 +498,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
498 | k.Position = pos; | 498 | k.Position = pos; |
499 | // k.Velocity = Vector3.Zero; | 499 | // k.Velocity = Vector3.Zero; |
500 | } | 500 | } |
501 | k.AngularVelocity = (Vector3)k.Position; | ||
501 | 502 | ||
502 | k.StartRotation = rot; | 503 | k.StartRotation = rot; |
503 | if (k.Rotation.HasValue) | 504 | if (k.Rotation.HasValue) |
@@ -632,13 +633,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
632 | 633 | ||
633 | // Do the frame processing | 634 | // Do the frame processing |
634 | double steps = (double)m_currentFrame.TimeMS / tickDuration; | 635 | double steps = (double)m_currentFrame.TimeMS / tickDuration; |
635 | 636 | ||
636 | if (steps <= 0.0) | 637 | if (steps <= 0.0) |
637 | { | 638 | { |
638 | m_group.RootPart.Velocity = Vector3.Zero; | 639 | m_group.RootPart.Velocity = Vector3.Zero; |
639 | m_group.RootPart.AngularVelocity = Vector3.Zero; | 640 | m_group.RootPart.AngularVelocity = Vector3.Zero; |
640 | 641 | ||
641 | m_nextPosition = (Vector3)m_currentFrame.Position; | 642 | m_nextPosition = NormalizeVector(m_currentFrame.AngularVelocity); |
642 | m_group.AbsolutePosition = m_nextPosition; | 643 | m_group.AbsolutePosition = m_nextPosition; |
643 | 644 | ||
644 | // we are sending imediate updates, no doing force a extra terseUpdate | 645 | // we are sending imediate updates, no doing force a extra terseUpdate |
@@ -726,7 +727,26 @@ namespace OpenSim.Region.Framework.Scenes | |||
726 | m_group.SendGroupRootTerseUpdate(); | 727 | m_group.SendGroupRootTerseUpdate(); |
727 | } | 728 | } |
728 | } | 729 | } |
730 | private Vector3 NormalizeVector(Vector3? pPosition) | ||
731 | { | ||
732 | if (pPosition == null) | ||
733 | return Vector3.Zero; | ||
734 | |||
735 | Vector3 tmp = (Vector3) pPosition; | ||
729 | 736 | ||
737 | while (tmp.X > Constants.RegionSize) | ||
738 | tmp.X -= Constants.RegionSize; | ||
739 | while (tmp.X < 0) | ||
740 | tmp.X += Constants.RegionSize; | ||
741 | while (tmp.Y > Constants.RegionSize) | ||
742 | tmp.Y -= Constants.RegionSize; | ||
743 | while (tmp.Y < 0) | ||
744 | tmp.Y += Constants.RegionSize; | ||
745 | |||
746 | return tmp; | ||
747 | |||
748 | |||
749 | } | ||
730 | public Byte[] Serialize() | 750 | public Byte[] Serialize() |
731 | { | 751 | { |
732 | StopTimer(); | 752 | StopTimer(); |