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.0.8.0.3
parent
31de7b845f
commit
c9415fd763
|
@ -3084,9 +3084,19 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (Appearance.AvatarSize != m_lastSize && !IsLoggingIn)
|
||||
SendAvatarDataToAllAgents();
|
||||
|
||||
if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
|
||||
!Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
|
||||
!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
|
||||
// Allow any updates for sitting avatars to that llSetPrimitiveLinkParams() can work for very
|
||||
// small increments (e.g. sit position adjusters). An alternative may be to eliminate the tolerance
|
||||
// checks on all updates but the ramifications of this would need careful consideration.
|
||||
bool updateClients
|
||||
= IsSatOnObject && (Rotation != m_lastRotation || Velocity != m_lastVelocity || m_pos != m_lastPosition);
|
||||
|
||||
if (!updateClients)
|
||||
updateClients
|
||||
= !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE)
|
||||
|| !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE)
|
||||
|| !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE);
|
||||
|
||||
if (updateClients)
|
||||
{
|
||||
SendTerseUpdateToAllClients();
|
||||
|
||||
|
|
|
@ -77,14 +77,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
|||
m_engine.AddRegion(m_scene);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test llSetLinkPrimtiveParams for agents.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Also testing entity updates here as well. Possibly that's putting 2 different concerns into one test and
|
||||
/// this should be separated.
|
||||
/// </remarks>
|
||||
[Test]
|
||||
public void TestllSetLinkPrimitiveParamsForAgent()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// TestHelpers.EnableLogging();
|
||||
|
||||
UUID userId = TestHelpers.ParseTail(0x1);
|
||||
|
||||
new SceneHelpers().SetupScene();
|
||||
SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene).RootPart;
|
||||
part.RotationOffset = new Quaternion(0.7071068f, 0, 0, 0.7071068f);
|
||||
|
||||
|
@ -99,12 +106,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
|||
|
||||
sp.HandleAgentRequestSit(sp.ControllingClient, sp.UUID, part.UUID, Vector3.Zero);
|
||||
|
||||
int entityUpdates = 0;
|
||||
((TestClient)sp.ControllingClient).OnReceivedEntityUpdate += (entity, flags) => { if (entity is ScenePresence) { entityUpdates++; }};
|
||||
|
||||
// Test position
|
||||
{
|
||||
Vector3 newPos = new Vector3(1, 2, 3);
|
||||
apiGrp1.llSetLinkPrimitiveParams(2, new LSL_Types.list(ScriptBaseClass.PRIM_POSITION, newPos));
|
||||
|
||||
Assert.That(sp.OffsetPosition, Is.EqualTo(newPos));
|
||||
|
||||
m_scene.Update(1);
|
||||
Assert.That(entityUpdates, Is.EqualTo(1));
|
||||
}
|
||||
|
||||
// Test small reposition
|
||||
{
|
||||
Vector3 newPos = new Vector3(1.001f, 2, 3);
|
||||
apiGrp1.llSetLinkPrimitiveParams(2, new LSL_Types.list(ScriptBaseClass.PRIM_POSITION, newPos));
|
||||
|
||||
Assert.That(sp.OffsetPosition, Is.EqualTo(newPos));
|
||||
|
||||
m_scene.Update(1);
|
||||
Assert.That(entityUpdates, Is.EqualTo(2));
|
||||
}
|
||||
|
||||
// Test world rotation
|
||||
|
@ -114,6 +138,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
|||
|
||||
Assert.That(
|
||||
sp.Rotation, new QuaternionToleranceConstraint(part.GetWorldRotation() * newRot, 0.000001));
|
||||
|
||||
m_scene.Update(1);
|
||||
Assert.That(entityUpdates, Is.EqualTo(3));
|
||||
}
|
||||
|
||||
// Test local rotation
|
||||
|
@ -123,6 +150,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
|||
|
||||
Assert.That(
|
||||
sp.Rotation, new QuaternionToleranceConstraint(newRot, 0.000001));
|
||||
|
||||
m_scene.Update(1);
|
||||
Assert.That(entityUpdates, Is.EqualTo(4));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@ namespace OpenSim.Tests.Common.Mock
|
|||
public event Action<RegionInfo, Vector3, Vector3> OnReceivedMoveAgentIntoRegion;
|
||||
public event Action<ulong, IPEndPoint> OnTestClientInformClientOfNeighbour;
|
||||
public event TestClientOnSendRegionTeleportDelegate OnTestClientSendRegionTeleport;
|
||||
public event Action<ISceneEntity, PrimUpdateFlags> OnReceivedEntityUpdate;
|
||||
public event Action<GridInstantMessage> OnReceivedInstantMessage;
|
||||
public event Action<UUID> OnReceivedSendRebakeAvatarTextures;
|
||||
|
||||
|
@ -685,6 +686,8 @@ namespace OpenSim.Tests.Common.Mock
|
|||
|
||||
public void SendEntityUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags)
|
||||
{
|
||||
if (OnReceivedEntityUpdate != null)
|
||||
OnReceivedEntityUpdate(entity, updateFlags);
|
||||
}
|
||||
|
||||
public void ReprioritizeUpdates()
|
||||
|
|
Loading…
Reference in New Issue