diff options
author | John Hurliman | 2009-10-26 18:22:32 -0700 |
---|---|---|
committer | John Hurliman | 2009-10-26 18:22:32 -0700 |
commit | b6651ce79017bc7c6d1df66757e26a74bacfc36f (patch) | |
tree | d6f9835eff9f7d35da3fcdd3cd063cd72cba41c7 /OpenSim/Region/Framework/Scenes/ScenePresence.cs | |
parent | Removing the ClientManager reference from IScene and hiding it entirely insid... (diff) | |
download | opensim-SC-b6651ce79017bc7c6d1df66757e26a74bacfc36f.zip opensim-SC-b6651ce79017bc7c6d1df66757e26a74bacfc36f.tar.gz opensim-SC-b6651ce79017bc7c6d1df66757e26a74bacfc36f.tar.bz2 opensim-SC-b6651ce79017bc7c6d1df66757e26a74bacfc36f.tar.xz |
* 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 packets
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 69 |
1 files changed, 21 insertions, 48 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 67384fb..0ac5be0 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -93,12 +93,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
93 | public Vector3 lastKnownAllowedPosition; | 93 | public Vector3 lastKnownAllowedPosition; |
94 | public bool sentMessageAboutRestrictedParcelFlyingDown; | 94 | public bool sentMessageAboutRestrictedParcelFlyingDown; |
95 | 95 | ||
96 | 96 | private Vector3 m_lastPosition; | |
97 | private Quaternion m_lastRotation; | ||
98 | private Vector3 m_lastVelocity; | ||
97 | 99 | ||
98 | private bool m_updateflag; | 100 | private bool m_updateflag; |
99 | private byte m_movementflag; | 101 | private byte m_movementflag; |
100 | private readonly List<NewForce> m_forcesList = new List<NewForce>(); | 102 | private readonly List<NewForce> m_forcesList = new List<NewForce>(); |
101 | private short m_updateCount; | ||
102 | private uint m_requestedSitTargetID; | 103 | private uint m_requestedSitTargetID; |
103 | private UUID m_requestedSitTargetUUID = UUID.Zero; | 104 | private UUID m_requestedSitTargetUUID = UUID.Zero; |
104 | private SendCourseLocationsMethod m_sendCourseLocationsMethod; | 105 | private SendCourseLocationsMethod m_sendCourseLocationsMethod; |
@@ -145,12 +146,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
145 | public string JID = string.Empty; | 146 | public string JID = string.Empty; |
146 | 147 | ||
147 | // Agent moves with a PID controller causing a force to be exerted. | 148 | // Agent moves with a PID controller causing a force to be exerted. |
148 | private bool m_newForce; | ||
149 | private bool m_newCoarseLocations = true; | 149 | private bool m_newCoarseLocations = true; |
150 | private float m_health = 100f; | 150 | private float m_health = 100f; |
151 | 151 | ||
152 | private Vector3 m_lastVelocity = Vector3.Zero; | ||
153 | |||
154 | // Default AV Height | 152 | // Default AV Height |
155 | private float m_avHeight = 127.0f; | 153 | private float m_avHeight = 127.0f; |
156 | 154 | ||
@@ -158,16 +156,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
158 | protected ulong crossingFromRegion; | 156 | protected ulong crossingFromRegion; |
159 | 157 | ||
160 | private readonly Vector3[] Dir_Vectors = new Vector3[6]; | 158 | private readonly Vector3[] Dir_Vectors = new Vector3[6]; |
161 | |||
162 | /// <value> | ||
163 | /// The avatar position last sent to clients | ||
164 | /// </value> | ||
165 | private Vector3 lastPhysPos = Vector3.Zero; | ||
166 | |||
167 | /// <value> | ||
168 | /// The avatar body rotation last sent to clients | ||
169 | /// </value> | ||
170 | private Quaternion lastPhysRot = Quaternion.Identity; | ||
171 | 159 | ||
172 | // Position of agent's camera in world (region cordinates) | 160 | // Position of agent's camera in world (region cordinates) |
173 | protected Vector3 m_CameraCenter = Vector3.Zero; | 161 | protected Vector3 m_CameraCenter = Vector3.Zero; |
@@ -1123,18 +1111,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
1123 | CameraConstraintActive = true; | 1111 | CameraConstraintActive = true; |
1124 | //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance); | 1112 | //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance); |
1125 | 1113 | ||
1126 | Vector3 normal = Vector3.Normalize(new Vector3(0,0,collisionPoint.Z) - collisionPoint); | 1114 | Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint); |
1127 | ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); | 1115 | ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); |
1128 | } | 1116 | } |
1129 | else | 1117 | else |
1130 | { | 1118 | { |
1131 | if (((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) | 1119 | if ((m_pos - m_lastPosition).Length() > 0.02f || |
1132 | || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02) | 1120 | (m_velocity - m_lastVelocity).Length() > 0.02f || |
1133 | || lastPhysRot != m_bodyRot)) | 1121 | m_bodyRot != m_lastRotation) |
1134 | { | 1122 | { |
1135 | if (CameraConstraintActive) | 1123 | if (CameraConstraintActive) |
1136 | { | 1124 | { |
1137 | ControllingClient.SendCameraConstraint(new Vector4(0, 0.5f, 0.9f, -3000f)); | 1125 | ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f)); |
1138 | CameraConstraintActive = false; | 1126 | CameraConstraintActive = false; |
1139 | } | 1127 | } |
1140 | } | 1128 | } |
@@ -2373,6 +2361,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2373 | 2361 | ||
2374 | public override void Update() | 2362 | public override void Update() |
2375 | { | 2363 | { |
2364 | const float VELOCITY_TOLERANCE = 0.01f; | ||
2365 | const float POSITION_TOLERANCE = 10.0f; | ||
2366 | |||
2376 | SendPrimUpdates(); | 2367 | SendPrimUpdates(); |
2377 | 2368 | ||
2378 | if (m_newCoarseLocations) | 2369 | if (m_newCoarseLocations) |
@@ -2383,28 +2374,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
2383 | 2374 | ||
2384 | if (m_isChildAgent == false) | 2375 | if (m_isChildAgent == false) |
2385 | { | 2376 | { |
2386 | if (m_newForce) // user movement 'forces' (ie commands to move) | 2377 | // Throw away duplicate or insignificant updates |
2378 | if (m_bodyRot != m_lastRotation || | ||
2379 | (m_velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || | ||
2380 | (m_pos - m_lastPosition).Length() > POSITION_TOLERANCE) | ||
2387 | { | 2381 | { |
2388 | SendTerseUpdateToAllClients(); | 2382 | SendTerseUpdateToAllClients(); |
2389 | m_updateCount = 0; | 2383 | |
2390 | } | 2384 | // Update the "last" values |
2391 | else if (m_movementflag != 0) // scripted movement (?) | 2385 | m_lastPosition = m_pos; |
2392 | { | 2386 | m_lastRotation = m_bodyRot; |
2393 | m_updateCount++; | 2387 | m_lastVelocity = m_velocity; |
2394 | if (m_updateCount > 3) | ||
2395 | { | ||
2396 | SendTerseUpdateToAllClients(); | ||
2397 | m_updateCount = 0; | ||
2398 | } | ||
2399 | } | ||
2400 | else if ((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) | ||
2401 | || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02) | ||
2402 | || lastPhysRot != m_bodyRot) | ||
2403 | { | ||
2404 | // Send Terse Update to all clients updates lastPhysPos and m_lastVelocity | ||
2405 | // doing the above assures us that we know what we sent the clients last | ||
2406 | SendTerseUpdateToAllClients(); | ||
2407 | m_updateCount = 0; | ||
2408 | } | 2388 | } |
2409 | 2389 | ||
2410 | // followed suggestion from mic bowman. reversed the two lines below. | 2390 | // followed suggestion from mic bowman. reversed the two lines below. |
@@ -2447,15 +2427,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2447 | public void SendTerseUpdateToAllClients() | 2427 | public void SendTerseUpdateToAllClients() |
2448 | { | 2428 | { |
2449 | m_perfMonMS = Environment.TickCount; | 2429 | m_perfMonMS = Environment.TickCount; |
2450 | 2430 | ||
2451 | m_scene.ForEachClient(SendTerseUpdateToClient); | 2431 | m_scene.ForEachClient(SendTerseUpdateToClient); |
2452 | 2432 | ||
2453 | m_lastVelocity = m_velocity; | ||
2454 | lastPhysPos = AbsolutePosition; | ||
2455 | lastPhysRot = m_bodyRot; | ||
2456 | |||
2457 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); | 2433 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); |
2458 | |||
2459 | } | 2434 | } |
2460 | 2435 | ||
2461 | public void SendCoarseLocations() | 2436 | public void SendCoarseLocations() |
@@ -3316,7 +3291,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3316 | /// </summary> | 3291 | /// </summary> |
3317 | public override void UpdateMovement() | 3292 | public override void UpdateMovement() |
3318 | { | 3293 | { |
3319 | m_newForce = false; | ||
3320 | lock (m_forcesList) | 3294 | lock (m_forcesList) |
3321 | { | 3295 | { |
3322 | if (m_forcesList.Count > 0) | 3296 | if (m_forcesList.Count > 0) |
@@ -3338,7 +3312,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3338 | // Ignoring this causes no movement to be sent to the physics engine... | 3312 | // Ignoring this causes no movement to be sent to the physics engine... |
3339 | // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter! | 3313 | // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter! |
3340 | } | 3314 | } |
3341 | m_newForce = true; | ||
3342 | 3315 | ||
3343 | m_forcesList.Clear(); | 3316 | m_forcesList.Clear(); |
3344 | } | 3317 | } |