aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2014-03-05 00:35:02 +0000
committerJustin Clark-Casey (justincc)2014-03-05 00:38:38 +0000
commitc9415fd76378af35ff76037d46245f2b95e4264f (patch)
tree1ea2d0e4e183dd96a7b9533aaf5c166cf864e47b /OpenSim/Region
parentWhen positioning agent with PRIM_ROTATION in llSetLinkPrimitiveParams(), set ... (diff)
downloadopensim-SC_OLD-c9415fd76378af35ff76037d46245f2b95e4264f.zip
opensim-SC_OLD-c9415fd76378af35ff76037d46245f2b95e4264f.tar.gz
opensim-SC_OLD-c9415fd76378af35ff76037d46245f2b95e4264f.tar.bz2
opensim-SC_OLD-c9415fd76378af35ff76037d46245f2b95e4264f.tar.xz
If an avatar is sitting, send out position updates to clients for any change, not just those outside the usual tolerances.
This is to allow small adjustments of less than 0.05m in functions such as llSetPrimitiveLinkParams() to work This is another fix for http://opensimulator.org/mantis/view.php?id=7044 Extends regression test for this case.
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs16
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiAvatarTests.cs32
3 files changed, 45 insertions, 5 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f7fd767..fa90ef4 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1495,7 +1495,7 @@ namespace OpenSim.Region.Framework.Scenes
1495 // Objects queue their updates onto all scene presences 1495 // Objects queue their updates onto all scene presences
1496 if (Frame % m_update_objects == 0) 1496 if (Frame % m_update_objects == 0)
1497 m_sceneGraph.UpdateObjectGroups(); 1497 m_sceneGraph.UpdateObjectGroups();
1498 1498
1499 // Run through all ScenePresences looking for updates 1499 // Run through all ScenePresences looking for updates
1500 // Presence updates and queued object updates for each presence are sent to clients 1500 // Presence updates and queued object updates for each presence are sent to clients
1501 if (Frame % m_update_presences == 0) 1501 if (Frame % m_update_presences == 0)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index d4af9fc..c8971c4 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3084,9 +3084,19 @@ namespace OpenSim.Region.Framework.Scenes
3084 if (Appearance.AvatarSize != m_lastSize && !IsLoggingIn) 3084 if (Appearance.AvatarSize != m_lastSize && !IsLoggingIn)
3085 SendAvatarDataToAllAgents(); 3085 SendAvatarDataToAllAgents();
3086 3086
3087 if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) || 3087 // Allow any updates for sitting avatars to that llSetPrimitiveLinkParams() can work for very
3088 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) || 3088 // small increments (e.g. sit position adjusters). An alternative may be to eliminate the tolerance
3089 !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE)) 3089 // checks on all updates but the ramifications of this would need careful consideration.
3090 bool updateClients
3091 = IsSatOnObject && (Rotation != m_lastRotation || Velocity != m_lastVelocity || m_pos != m_lastPosition);
3092
3093 if (!updateClients)
3094 updateClients
3095 = !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE)
3096 || !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE)
3097 || !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE);
3098
3099 if (updateClients)
3090 { 3100 {
3091 SendTerseUpdateToAllClients(); 3101 SendTerseUpdateToAllClients();
3092 3102
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiAvatarTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiAvatarTests.cs
index 86381c4..1415925 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiAvatarTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiAvatarTests.cs
@@ -77,14 +77,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
77 m_engine.AddRegion(m_scene); 77 m_engine.AddRegion(m_scene);
78 } 78 }
79 79
80 /// <summary>
81 /// Test llSetLinkPrimtiveParams for agents.
82 /// </summary>
83 /// <remarks>
84 /// Also testing entity updates here as well. Possibly that's putting 2 different concerns into one test and
85 /// this should be separated.
86 /// </remarks>
80 [Test] 87 [Test]
81 public void TestllSetLinkPrimitiveParamsForAgent() 88 public void TestllSetLinkPrimitiveParamsForAgent()
82 { 89 {
83 TestHelpers.InMethod(); 90 TestHelpers.InMethod();
91// TestHelpers.EnableLogging();
84 92
85 UUID userId = TestHelpers.ParseTail(0x1); 93 UUID userId = TestHelpers.ParseTail(0x1);
86 94
87 new SceneHelpers().SetupScene();
88 SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart; 95 SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart;
89 part.RotationOffset = new Quaternion(0.7071068f, 0, 0, 0.7071068f); 96 part.RotationOffset = new Quaternion(0.7071068f, 0, 0, 0.7071068f);
90 97
@@ -99,12 +106,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
99 106
100 sp.HandleAgentRequestSit(sp.ControllingClient, sp.UUID, part.UUID, Vector3.Zero); 107 sp.HandleAgentRequestSit(sp.ControllingClient, sp.UUID, part.UUID, Vector3.Zero);
101 108
109 int entityUpdates = 0;
110 ((TestClient)sp.ControllingClient).OnReceivedEntityUpdate += (entity, flags) => { if (entity is ScenePresence) { entityUpdates++; }};
111
102 // Test position 112 // Test position
103 { 113 {
104 Vector3 newPos = new Vector3(1, 2, 3); 114 Vector3 newPos = new Vector3(1, 2, 3);
105 apiGrp1.llSetLinkPrimitiveParams(2, new LSL_Types.list(ScriptBaseClass.PRIM_POSITION, newPos)); 115 apiGrp1.llSetLinkPrimitiveParams(2, new LSL_Types.list(ScriptBaseClass.PRIM_POSITION, newPos));
106 116
107 Assert.That(sp.OffsetPosition, Is.EqualTo(newPos)); 117 Assert.That(sp.OffsetPosition, Is.EqualTo(newPos));
118
119 m_scene.Update(1);
120 Assert.That(entityUpdates, Is.EqualTo(1));
121 }
122
123 // Test small reposition
124 {
125 Vector3 newPos = new Vector3(1.001f, 2, 3);
126 apiGrp1.llSetLinkPrimitiveParams(2, new LSL_Types.list(ScriptBaseClass.PRIM_POSITION, newPos));
127
128 Assert.That(sp.OffsetPosition, Is.EqualTo(newPos));
129
130 m_scene.Update(1);
131 Assert.That(entityUpdates, Is.EqualTo(2));
108 } 132 }
109 133
110 // Test world rotation 134 // Test world rotation
@@ -114,6 +138,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
114 138
115 Assert.That( 139 Assert.That(
116 sp.Rotation, new QuaternionToleranceConstraint(part.GetWorldRotation() * newRot, 0.000001)); 140 sp.Rotation, new QuaternionToleranceConstraint(part.GetWorldRotation() * newRot, 0.000001));
141
142 m_scene.Update(1);
143 Assert.That(entityUpdates, Is.EqualTo(3));
117 } 144 }
118 145
119 // Test local rotation 146 // Test local rotation
@@ -123,6 +150,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
123 150
124 Assert.That( 151 Assert.That(
125 sp.Rotation, new QuaternionToleranceConstraint(newRot, 0.000001)); 152 sp.Rotation, new QuaternionToleranceConstraint(newRot, 0.000001));
153
154 m_scene.Update(1);
155 Assert.That(entityUpdates, Is.EqualTo(4));
126 } 156 }
127 } 157 }
128 } 158 }