aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs24
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs37
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs56
3 files changed, 55 insertions, 62 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 4e90d09..9a3b0c9 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -348,6 +348,7 @@ namespace OpenSim.Region.Framework.Scenes
348 private int m_update_backup = 200; 348 private int m_update_backup = 200;
349 private int m_update_terrain = 50; 349 private int m_update_terrain = 50;
350 private int m_update_land = 1; 350 private int m_update_land = 1;
351 private int m_update_coarse_locations = 50;
351 352
352 private int frameMS; 353 private int frameMS;
353 private int physicsMS2; 354 private int physicsMS2;
@@ -1417,6 +1418,18 @@ namespace OpenSim.Region.Framework.Scenes
1417 if (m_frame % m_update_presences == 0) 1418 if (m_frame % m_update_presences == 0)
1418 m_sceneGraph.UpdatePresences(); 1419 m_sceneGraph.UpdatePresences();
1419 1420
1421 if (m_frame % m_update_coarse_locations == 0)
1422 {
1423 List<Vector3> coarseLocations;
1424 List<UUID> avatarUUIDs;
1425 SceneGraph.GetCoarseLocations(out coarseLocations, out avatarUUIDs, 60);
1426 // Send coarse locations to clients
1427 ForEachScenePresence(delegate(ScenePresence presence)
1428 {
1429 presence.SendCoarseLocations(coarseLocations, avatarUUIDs);
1430 });
1431 }
1432
1420 int tmpPhysicsMS2 = Util.EnvironmentTickCount(); 1433 int tmpPhysicsMS2 = Util.EnvironmentTickCount();
1421 if ((m_frame % m_update_physics == 0) && m_physics_enabled) 1434 if ((m_frame % m_update_physics == 0) && m_physics_enabled)
1422 m_sceneGraph.UpdatePreparePhysics(); 1435 m_sceneGraph.UpdatePreparePhysics();
@@ -3301,9 +3314,6 @@ namespace OpenSim.Region.Framework.Scenes
3301 catch (NullReferenceException) { } 3314 catch (NullReferenceException) { }
3302 }); 3315 });
3303 3316
3304 ForEachScenePresence(
3305 delegate(ScenePresence presence) { presence.CoarseLocationChange(); });
3306
3307 IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); 3317 IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
3308 if (agentTransactions != null) 3318 if (agentTransactions != null)
3309 { 3319 {
@@ -3355,14 +3365,6 @@ namespace OpenSim.Region.Framework.Scenes
3355 } 3365 }
3356 } 3366 }
3357 3367
3358 /// <summary>
3359 /// Inform all other ScenePresences on this Scene that someone else has changed position on the minimap.
3360 /// </summary>
3361 public void NotifyMyCoarseLocationChange()
3362 {
3363 ForEachScenePresence(delegate(ScenePresence presence) { presence.CoarseLocationChange(); });
3364 }
3365
3366 #endregion 3368 #endregion
3367 3369
3368 #region Entities 3370 #region Entities
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 5902080..673674d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -206,6 +206,43 @@ namespace OpenSim.Region.Framework.Scenes
206 }); 206 });
207 } 207 }
208 208
209 public void GetCoarseLocations(out List<Vector3> coarseLocations, out List<UUID> avatarUUIDs, uint maxLocations)
210 {
211 coarseLocations = new List<Vector3>();
212 avatarUUIDs = new List<UUID>();
213
214 List<ScenePresence> presences = GetScenePresences();
215 for (int i = 0; i < Math.Min(presences.Count, maxLocations); ++i)
216 {
217 ScenePresence sp = presences[i];
218 // If this presence is a child agent, we don't want its coarse locations
219 if (sp.IsChildAgent)
220 return;
221
222 if (sp.ParentID != 0)
223 {
224 // sitting avatar
225 SceneObjectPart sop = m_parentScene.GetSceneObjectPart(sp.ParentID);
226 if (sop != null)
227 {
228 coarseLocations.Add(sop.AbsolutePosition + sp.AbsolutePosition);
229 avatarUUIDs.Add(sp.UUID);
230 }
231 else
232 {
233 // we can't find the parent.. ! arg!
234 coarseLocations.Add(sp.AbsolutePosition);
235 avatarUUIDs.Add(sp.UUID);
236 }
237 }
238 else
239 {
240 coarseLocations.Add(sp.AbsolutePosition);
241 avatarUUIDs.Add(sp.UUID);
242 }
243 }
244 }
245
209 #endregion 246 #endregion
210 247
211 #region Entity Methods 248 #region Entity Methods
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 45375b0..15b9446 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -65,7 +65,7 @@ namespace OpenSim.Region.Framework.Scenes
65 public ScriptControlled eventControls; 65 public ScriptControlled eventControls;
66 } 66 }
67 67
68 public delegate void SendCourseLocationsMethod(UUID scene, ScenePresence presence); 68 public delegate void SendCourseLocationsMethod(UUID scene, ScenePresence presence, List<Vector3> coarseLocations, List<UUID> avatarUUIDs);
69 69
70 public class ScenePresence : EntityBase, ISceneEntity 70 public class ScenePresence : EntityBase, ISceneEntity
71 { 71 {
@@ -173,8 +173,6 @@ namespace OpenSim.Region.Framework.Scenes
173 173
174 public string JID = String.Empty; 174 public string JID = String.Empty;
175 175
176 // Agent moves with a PID controller causing a force to be exerted.
177 private bool m_newCoarseLocations = true;
178 private float m_health = 100f; 176 private float m_health = 100f;
179 177
180 // Default AV Height 178 // Default AV Height
@@ -2296,12 +2294,6 @@ namespace OpenSim.Region.Framework.Scenes
2296 2294
2297 SendPrimUpdates(); 2295 SendPrimUpdates();
2298 2296
2299 if (m_newCoarseLocations)
2300 {
2301 SendCoarseLocations();
2302 m_newCoarseLocations = false;
2303 }
2304
2305 if (m_isChildAgent == false) 2297 if (m_isChildAgent == false)
2306 { 2298 {
2307// PhysicsActor actor = m_physicsActor; 2299// PhysicsActor actor = m_physicsActor;
@@ -2375,12 +2367,12 @@ namespace OpenSim.Region.Framework.Scenes
2375 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); 2367 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
2376 } 2368 }
2377 2369
2378 public void SendCoarseLocations() 2370 public void SendCoarseLocations(List<Vector3> coarseLocations, List<UUID> avatarUUIDs)
2379 { 2371 {
2380 SendCourseLocationsMethod d = m_sendCourseLocationsMethod; 2372 SendCourseLocationsMethod d = m_sendCourseLocationsMethod;
2381 if (d != null) 2373 if (d != null)
2382 { 2374 {
2383 d.Invoke(m_scene.RegionInfo.originRegionID, this); 2375 d.Invoke(m_scene.RegionInfo.originRegionID, this, coarseLocations, avatarUUIDs);
2384 } 2376 }
2385 } 2377 }
2386 2378
@@ -2390,50 +2382,13 @@ namespace OpenSim.Region.Framework.Scenes
2390 m_sendCourseLocationsMethod = d; 2382 m_sendCourseLocationsMethod = d;
2391 } 2383 }
2392 2384
2393 public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p) 2385 public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p, List<Vector3> coarseLocations, List<UUID> avatarUUIDs)
2394 { 2386 {
2395 m_perfMonMS = Util.EnvironmentTickCount(); 2387 m_perfMonMS = Util.EnvironmentTickCount();
2396 2388 m_controllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations);
2397 List<Vector3> CoarseLocations = new List<Vector3>();
2398 List<UUID> AvatarUUIDs = new List<UUID>();
2399 m_scene.ForEachScenePresence(delegate(ScenePresence sp)
2400 {
2401 if (sp.IsChildAgent)
2402 return;
2403
2404 if (sp.ParentID != 0)
2405 {
2406 // sitting avatar
2407 SceneObjectPart sop = m_scene.GetSceneObjectPart(sp.ParentID);
2408 if (sop != null)
2409 {
2410 CoarseLocations.Add(sop.AbsolutePosition + sp.m_pos);
2411 AvatarUUIDs.Add(sp.UUID);
2412 }
2413 else
2414 {
2415 // we can't find the parent.. ! arg!
2416 CoarseLocations.Add(sp.m_pos);
2417 AvatarUUIDs.Add(sp.UUID);
2418 }
2419 }
2420 else
2421 {
2422 CoarseLocations.Add(sp.m_pos);
2423 AvatarUUIDs.Add(sp.UUID);
2424 }
2425 });
2426
2427 m_controllingClient.SendCoarseLocationUpdate(AvatarUUIDs, CoarseLocations);
2428
2429 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); 2389 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
2430 } 2390 }
2431 2391
2432 public void CoarseLocationChange()
2433 {
2434 m_newCoarseLocations = true;
2435 }
2436
2437 /// <summary> 2392 /// <summary>
2438 /// Tell other client about this avatar (The client previously didn't know or had outdated details about this avatar) 2393 /// Tell other client about this avatar (The client previously didn't know or had outdated details about this avatar)
2439 /// </summary> 2394 /// </summary>
@@ -2668,7 +2623,6 @@ namespace OpenSim.Region.Framework.Scenes
2668 { 2623 {
2669 posLastSignificantMove = AbsolutePosition; 2624 posLastSignificantMove = AbsolutePosition;
2670 m_scene.EventManager.TriggerSignificantClientMovement(m_controllingClient); 2625 m_scene.EventManager.TriggerSignificantClientMovement(m_controllingClient);
2671 m_scene.NotifyMyCoarseLocationChange();
2672 } 2626 }
2673 2627
2674 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m 2628 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m