* Double the priority on avatar bake texture requests to get avatars rezzing in faster than the surrounding scene
* Adds duplicate tracking for SceneObjectParts and ScenePresences to avoid sending out duplicate ImprovedTerseObjectUpdate packets0.6.8-post-fixes
parent
0b1726b524
commit
b6651ce790
|
@ -6756,11 +6756,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
if (OnRequestTexture != null)
|
||||
{
|
||||
TextureRequestArgs args = new TextureRequestArgs();
|
||||
args.RequestedAssetID = imageRequest.RequestImage[i].Image;
|
||||
args.DiscardLevel = imageRequest.RequestImage[i].DiscardLevel;
|
||||
args.PacketNumber = imageRequest.RequestImage[i].Packet;
|
||||
args.Priority = imageRequest.RequestImage[i].DownloadPriority;
|
||||
|
||||
RequestImagePacket.RequestImageBlock block = imageRequest.RequestImage[i];
|
||||
|
||||
args.RequestedAssetID = block.Image;
|
||||
args.DiscardLevel = block.DiscardLevel;
|
||||
args.PacketNumber = block.Packet;
|
||||
args.Priority = block.DownloadPriority;
|
||||
args.requestSequence = imageRequest.Header.Sequence;
|
||||
|
||||
// NOTE: This is not a built in part of the LLUDP protocol, but we double the
|
||||
// priority of avatar textures to get avatars rezzing in faster than the
|
||||
// surrounding scene
|
||||
if ((ImageType)block.Type == ImageType.Baked)
|
||||
args.Priority *= 2.0f;
|
||||
|
||||
//handlerTextureRequest = OnRequestTexture;
|
||||
|
||||
//if (handlerTextureRequest != null)
|
||||
|
|
|
@ -248,6 +248,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
protected UUID m_uuid;
|
||||
protected Vector3 m_velocity;
|
||||
|
||||
protected Vector3 m_lastPosition;
|
||||
protected Quaternion m_lastRotation;
|
||||
protected Vector3 m_lastVelocity;
|
||||
protected Vector3 m_lastAcceleration;
|
||||
protected Vector3 m_lastAngularVelocity;
|
||||
|
||||
// TODO: Those have to be changed into persistent properties at some later point,
|
||||
// or sit-camera on vehicles will break on sim-crossing.
|
||||
private Vector3 m_cameraEyeOffset;
|
||||
|
@ -2387,18 +2393,36 @@ if (m_shape != null) {
|
|||
/// </summary>
|
||||
public void SendScheduledUpdates()
|
||||
{
|
||||
if (m_updateFlag == 1) //some change has been made so update the clients
|
||||
{
|
||||
AddTerseUpdateToAllAvatars();
|
||||
ClearUpdateSchedule();
|
||||
const float VELOCITY_TOLERANCE = 0.01f;
|
||||
const float POSITION_TOLERANCE = 10.0f;
|
||||
|
||||
// This causes the Scene to 'poll' physical objects every couple of frames
|
||||
// bad, so it's been replaced by an event driven method.
|
||||
//if ((ObjectFlags & (uint)PrimFlags.Physics) != 0)
|
||||
//{
|
||||
// Only send the constant terse updates on physical objects!
|
||||
//ScheduleTerseUpdate();
|
||||
//}
|
||||
if (m_updateFlag == 1)
|
||||
{
|
||||
// Throw away duplicate or insignificant updates
|
||||
if (RotationOffset != m_lastRotation ||
|
||||
Acceleration != m_lastAcceleration ||
|
||||
(Velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE ||
|
||||
(RotationalVelocity - m_lastAngularVelocity).Length() > VELOCITY_TOLERANCE ||
|
||||
(OffsetPosition - m_lastPosition).Length() > POSITION_TOLERANCE)
|
||||
{
|
||||
AddTerseUpdateToAllAvatars();
|
||||
ClearUpdateSchedule();
|
||||
|
||||
// This causes the Scene to 'poll' physical objects every couple of frames
|
||||
// bad, so it's been replaced by an event driven method.
|
||||
//if ((ObjectFlags & (uint)PrimFlags.Physics) != 0)
|
||||
//{
|
||||
// Only send the constant terse updates on physical objects!
|
||||
//ScheduleTerseUpdate();
|
||||
//}
|
||||
|
||||
// Update the "last" values
|
||||
m_lastPosition = OffsetPosition;
|
||||
m_lastRotation = RotationOffset;
|
||||
m_lastVelocity = Velocity;
|
||||
m_lastAcceleration = Acceleration;
|
||||
m_lastAngularVelocity = RotationalVelocity;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -93,12 +93,13 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public Vector3 lastKnownAllowedPosition;
|
||||
public bool sentMessageAboutRestrictedParcelFlyingDown;
|
||||
|
||||
|
||||
private Vector3 m_lastPosition;
|
||||
private Quaternion m_lastRotation;
|
||||
private Vector3 m_lastVelocity;
|
||||
|
||||
private bool m_updateflag;
|
||||
private byte m_movementflag;
|
||||
private readonly List<NewForce> m_forcesList = new List<NewForce>();
|
||||
private short m_updateCount;
|
||||
private uint m_requestedSitTargetID;
|
||||
private UUID m_requestedSitTargetUUID = UUID.Zero;
|
||||
private SendCourseLocationsMethod m_sendCourseLocationsMethod;
|
||||
|
@ -145,12 +146,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public string JID = string.Empty;
|
||||
|
||||
// Agent moves with a PID controller causing a force to be exerted.
|
||||
private bool m_newForce;
|
||||
private bool m_newCoarseLocations = true;
|
||||
private float m_health = 100f;
|
||||
|
||||
private Vector3 m_lastVelocity = Vector3.Zero;
|
||||
|
||||
// Default AV Height
|
||||
private float m_avHeight = 127.0f;
|
||||
|
||||
|
@ -158,16 +156,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
protected ulong crossingFromRegion;
|
||||
|
||||
private readonly Vector3[] Dir_Vectors = new Vector3[6];
|
||||
|
||||
/// <value>
|
||||
/// The avatar position last sent to clients
|
||||
/// </value>
|
||||
private Vector3 lastPhysPos = Vector3.Zero;
|
||||
|
||||
/// <value>
|
||||
/// The avatar body rotation last sent to clients
|
||||
/// </value>
|
||||
private Quaternion lastPhysRot = Quaternion.Identity;
|
||||
|
||||
// Position of agent's camera in world (region cordinates)
|
||||
protected Vector3 m_CameraCenter = Vector3.Zero;
|
||||
|
@ -1123,18 +1111,18 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
CameraConstraintActive = true;
|
||||
//m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance);
|
||||
|
||||
Vector3 normal = Vector3.Normalize(new Vector3(0,0,collisionPoint.Z) - collisionPoint);
|
||||
Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint);
|
||||
ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint)));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02)
|
||||
|| (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02)
|
||||
|| lastPhysRot != m_bodyRot))
|
||||
if ((m_pos - m_lastPosition).Length() > 0.02f ||
|
||||
(m_velocity - m_lastVelocity).Length() > 0.02f ||
|
||||
m_bodyRot != m_lastRotation)
|
||||
{
|
||||
if (CameraConstraintActive)
|
||||
{
|
||||
ControllingClient.SendCameraConstraint(new Vector4(0, 0.5f, 0.9f, -3000f));
|
||||
ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f));
|
||||
CameraConstraintActive = false;
|
||||
}
|
||||
}
|
||||
|
@ -2373,6 +2361,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public override void Update()
|
||||
{
|
||||
const float VELOCITY_TOLERANCE = 0.01f;
|
||||
const float POSITION_TOLERANCE = 10.0f;
|
||||
|
||||
SendPrimUpdates();
|
||||
|
||||
if (m_newCoarseLocations)
|
||||
|
@ -2383,28 +2374,17 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
if (m_isChildAgent == false)
|
||||
{
|
||||
if (m_newForce) // user movement 'forces' (ie commands to move)
|
||||
// Throw away duplicate or insignificant updates
|
||||
if (m_bodyRot != m_lastRotation ||
|
||||
(m_velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE ||
|
||||
(m_pos - m_lastPosition).Length() > POSITION_TOLERANCE)
|
||||
{
|
||||
SendTerseUpdateToAllClients();
|
||||
m_updateCount = 0;
|
||||
}
|
||||
else if (m_movementflag != 0) // scripted movement (?)
|
||||
{
|
||||
m_updateCount++;
|
||||
if (m_updateCount > 3)
|
||||
{
|
||||
SendTerseUpdateToAllClients();
|
||||
m_updateCount = 0;
|
||||
}
|
||||
}
|
||||
else if ((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02)
|
||||
|| (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02)
|
||||
|| lastPhysRot != m_bodyRot)
|
||||
{
|
||||
// Send Terse Update to all clients updates lastPhysPos and m_lastVelocity
|
||||
// doing the above assures us that we know what we sent the clients last
|
||||
SendTerseUpdateToAllClients();
|
||||
m_updateCount = 0;
|
||||
|
||||
// Update the "last" values
|
||||
m_lastPosition = m_pos;
|
||||
m_lastRotation = m_bodyRot;
|
||||
m_lastVelocity = m_velocity;
|
||||
}
|
||||
|
||||
// followed suggestion from mic bowman. reversed the two lines below.
|
||||
|
@ -2447,15 +2427,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public void SendTerseUpdateToAllClients()
|
||||
{
|
||||
m_perfMonMS = Environment.TickCount;
|
||||
|
||||
|
||||
m_scene.ForEachClient(SendTerseUpdateToClient);
|
||||
|
||||
m_lastVelocity = m_velocity;
|
||||
lastPhysPos = AbsolutePosition;
|
||||
lastPhysRot = m_bodyRot;
|
||||
|
||||
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
|
||||
|
||||
}
|
||||
|
||||
public void SendCoarseLocations()
|
||||
|
@ -3316,7 +3291,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
public override void UpdateMovement()
|
||||
{
|
||||
m_newForce = false;
|
||||
lock (m_forcesList)
|
||||
{
|
||||
if (m_forcesList.Count > 0)
|
||||
|
@ -3338,7 +3312,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// Ignoring this causes no movement to be sent to the physics engine...
|
||||
// which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter!
|
||||
}
|
||||
m_newForce = true;
|
||||
|
||||
m_forcesList.Clear();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue