From f8cdccc16729212e374cc001ab4f0be8e5960259 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Mon, 10 Jul 2017 21:12:34 +0100
Subject: a few more changes on entities updates
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 43 +++++++---------------
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 36 +++++++++++-------
2 files changed, 36 insertions(+), 43 deletions(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 576a013..2e16663 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -3237,7 +3237,7 @@ namespace OpenSim.Region.Framework.Scenes
///
/// Schedule a terse update for this prim. Terse updates only send position,
- /// rotation, velocity and rotational velocity information.
+ /// rotation, velocity and rotational velocity information. WRONG!!!!
///
public void ScheduleTerseUpdate()
{
@@ -3296,21 +3296,6 @@ namespace OpenSim.Region.Framework.Scenes
sp.SendAttachmentUpdate(this, UpdateRequired.FULL);
}
}
-
-/* this does nothing
-SendFullUpdateToClient(remoteClient, Position) ignores position parameter
- if (IsRoot)
- {
- if (ParentGroup.IsAttachment)
- {
- SendFullUpdateToClient(remoteClient, AttachedPos);
- }
- else
- {
- SendFullUpdateToClient(remoteClient, AbsolutePosition);
- }
- }
-*/
else
{
SendFullUpdateToClient(remoteClient);
@@ -3396,24 +3381,26 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
ParentGroup.Scene.StatsReporter.AddObjectUpdates(1);
}
+
+ private const float ROTATION_TOLERANCE = 0.01f;
+ private const float VELOCITY_TOLERANCE = 0.1f; // terse update vel has low resolution
+ private const float POSITION_TOLERANCE = 0.05f; // I don't like this, but I suppose it's necessary
+ private const double TIME_MS_TOLERANCE = 200f; //llSetPos has a 200ms delay. This should NOT be 3 seconds.
///
/// Tell all the prims which have had updates scheduled
///
public void SendScheduledUpdates()
- {
- const float ROTATION_TOLERANCE = 0.01f;
- const float VELOCITY_TOLERANCE = 0.1f; // terse update vel has low resolution
- const float POSITION_TOLERANCE = 0.05f; // I don't like this, but I suppose it's necessary
- const double TIME_MS_TOLERANCE = 200f; //llSetPos has a 200ms delay. This should NOT be 3 seconds.
-
+ {
switch (UpdateFlag)
{
- // this is wrong we need to get back to this
- case UpdateRequired.TERSE:
- {
+ case UpdateRequired.NONE:
ClearUpdateSchedule();
+ break;
+
+ case UpdateRequired.TERSE:
+ ClearUpdateSchedule();
bool needupdate = true;
double now = Util.GetTimeStampMS();
Vector3 curvel = Velocity;
@@ -3423,8 +3410,6 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
while(true) // just to avoid ugly goto
{
double elapsed = now - m_lastUpdateSentTime;
-
- // minimal rate also for the other things on terse updates
if (elapsed > TIME_MS_TOLERANCE)
break;
@@ -3514,13 +3499,11 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
});
}
break;
- }
+
case UpdateRequired.FULL:
- {
ClearUpdateSchedule();
SendFullUpdateToAllClientsInternal();
break;
- }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c1b62af..ba3aaae 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -279,8 +279,11 @@ namespace OpenSim.Region.Framework.Scenes
private bool MouseDown = false;
public Vector3 lastKnownAllowedPosition;
public bool sentMessageAboutRestrictedParcelFlyingDown;
+
public Vector4 CollisionPlane = Vector4.UnitW;
+ public Vector4 m_lastCollisionPlane = Vector4.UnitW;
+ private byte m_lastState;
private Vector3 m_lastPosition;
private Quaternion m_lastRotation;
private Vector3 m_lastVelocity;
@@ -2818,16 +2821,13 @@ namespace OpenSim.Region.Framework.Scenes
CameraAtAxis = agentData.CameraAtAxis;
CameraLeftAxis = agentData.CameraLeftAxis;
CameraUpAxis = agentData.CameraUpAxis;
- Quaternion camRot = Util.Axes2Rot(CameraAtAxis, CameraLeftAxis, CameraUpAxis);
- CameraRotation = camRot;
-
- // The Agent's Draw distance setting
- // When we get to the point of re-computing neighbors everytime this
- // changes, then start using the agent's drawdistance rather than the
- // region's draw distance.
-
DrawDistance = agentData.Far;
+ CameraAtAxis.Normalize();
+ CameraLeftAxis.Normalize();
+ CameraUpAxis.Normalize();
+ Quaternion camRot = Util.Axes2Rot(CameraAtAxis, CameraLeftAxis, CameraUpAxis);
+ CameraRotation = camRot;
// Check if Client has camera in 'follow cam' or 'build' mode.
// Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
@@ -3794,15 +3794,17 @@ namespace OpenSim.Region.Framework.Scenes
// this does need to be more complex later
Vector3 vel = Velocity;
Vector3 dpos = m_pos - m_lastPosition;
- if( Math.Abs(vel.X - m_lastVelocity.X) > VELOCITY_TOLERANCE ||
+ if( State != m_lastState ||
+ Math.Abs(vel.X - m_lastVelocity.X) > VELOCITY_TOLERANCE ||
Math.Abs(vel.Y - m_lastVelocity.Y) > VELOCITY_TOLERANCE ||
Math.Abs(vel.Z - m_lastVelocity.Z) > VELOCITY_TOLERANCE ||
Math.Abs(m_bodyRot.X - m_lastRotation.X) > ROTATION_TOLERANCE ||
Math.Abs(m_bodyRot.Y - m_lastRotation.Y) > ROTATION_TOLERANCE ||
Math.Abs(m_bodyRot.Z - m_lastRotation.Z) > ROTATION_TOLERANCE ||
-
+
(vel == Vector3.Zero && m_lastVelocity != Vector3.Zero) ||
+
Math.Abs(dpos.X) > POSITION_LARGETOLERANCE ||
Math.Abs(dpos.Y) > POSITION_LARGETOLERANCE ||
Math.Abs(dpos.Z) > POSITION_LARGETOLERANCE ||
@@ -3811,7 +3813,12 @@ namespace OpenSim.Region.Framework.Scenes
Math.Abs(dpos.Y) > POSITION_SMALLTOLERANCE ||
Math.Abs(dpos.Z) > POSITION_SMALLTOLERANCE)
&& vel.LengthSquared() < LOWVELOCITYSQ
- ))
+ ) ||
+
+ Math.Abs(CollisionPlane.X - m_lastCollisionPlane.X) > POSITION_SMALLTOLERANCE ||
+ Math.Abs(CollisionPlane.Y - m_lastCollisionPlane.Y) > POSITION_SMALLTOLERANCE ||
+ Math.Abs(CollisionPlane.W - m_lastCollisionPlane.W) > POSITION_SMALLTOLERANCE
+ )
{
SendTerseUpdateToAllClients();
}
@@ -3910,11 +3917,14 @@ namespace OpenSim.Region.Framework.Scenes
///
public void SendTerseUpdateToAllClients()
{
- m_scene.ForEachScenePresence(SendTerseUpdateToAgent);
- // Update the "last" values
+ m_lastState = State;
m_lastPosition = m_pos;
m_lastRotation = m_bodyRot;
m_lastVelocity = Velocity;
+ m_lastCollisionPlane = CollisionPlane;
+
+ m_scene.ForEachScenePresence(SendTerseUpdateToAgent);
+ // Update the "last" values
TriggerScenePresenceUpdated();
}
--
cgit v1.1