diff options
author | John Hurliman | 2009-10-23 02:38:59 -0700 |
---|---|---|
committer | John Hurliman | 2009-10-23 02:38:59 -0700 |
commit | 62f1a5e36d85b95e8f80bc073ba876873494963a (patch) | |
tree | 0afbdc903800f2afd127e45faf6879b49da412af | |
parent | Uncommented the resend log line so the previous commit can be seen in action (diff) | |
download | opensim-SC-62f1a5e36d85b95e8f80bc073ba876873494963a.zip opensim-SC-62f1a5e36d85b95e8f80bc073ba876873494963a.tar.gz opensim-SC-62f1a5e36d85b95e8f80bc073ba876873494963a.tar.bz2 opensim-SC-62f1a5e36d85b95e8f80bc073ba876873494963a.tar.xz |
Implemented a "FrontBack" prioritizer, using distance plus the plane equation to give double weight to prims/avatars in front of you
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 33 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 44 | ||||
-rw-r--r-- | bin/OpenSim.ini.example | 4 |
4 files changed, 80 insertions, 5 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d5e3445..ee848bb 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -61,6 +61,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
61 | Time = 0, | 61 | Time = 0, |
62 | Distance = 1, | 62 | Distance = 1, |
63 | SimpleAngularDistance = 2, | 63 | SimpleAngularDistance = 2, |
64 | FrontBack = 3, | ||
64 | } | 65 | } |
65 | 66 | ||
66 | public delegate void SynchronizeSceneHandler(Scene scene); | 67 | public delegate void SynchronizeSceneHandler(Scene scene); |
@@ -540,6 +541,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
540 | case "simpleangulardistance": | 541 | case "simpleangulardistance": |
541 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.SimpleAngularDistance; | 542 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.SimpleAngularDistance; |
542 | break; | 543 | break; |
544 | case "frontback": | ||
545 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.FrontBack; | ||
546 | break; | ||
543 | default: | 547 | default: |
544 | m_log.Warn("[SCENE]: UpdatePrioritizationScheme was not recognized, setting to default settomg of Time"); | 548 | m_log.Warn("[SCENE]: UpdatePrioritizationScheme was not recognized, setting to default settomg of Time"); |
545 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time; | 549 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time; |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 4f19761..dd8da20 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -493,8 +493,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
493 | 493 | ||
494 | public Vector3 GroupScale() | 494 | public Vector3 GroupScale() |
495 | { | 495 | { |
496 | Vector3 minScale = new Vector3(Constants.RegionSize,Constants.RegionSize,Constants.RegionSize); | 496 | Vector3 minScale = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionSize); |
497 | Vector3 maxScale = new Vector3(0f,0f,0f); | 497 | Vector3 maxScale = Vector3.Zero; |
498 | Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f); | 498 | Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f); |
499 | 499 | ||
500 | lock (m_parts) | 500 | lock (m_parts) |
@@ -577,7 +577,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
577 | { | 577 | { |
578 | foreach (SceneObjectPart part in m_parts.Values) | 578 | foreach (SceneObjectPart part in m_parts.Values) |
579 | { | 579 | { |
580 | |||
581 | Vector3 worldPos = part.GetWorldPosition(); | 580 | Vector3 worldPos = part.GetWorldPosition(); |
582 | Vector3 offset = worldPos - AbsolutePosition; | 581 | Vector3 offset = worldPos - AbsolutePosition; |
583 | Quaternion worldRot; | 582 | Quaternion worldRot; |
@@ -3366,6 +3365,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3366 | return GetPriorityByDistance(client); | 3365 | return GetPriorityByDistance(client); |
3367 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: | 3366 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: |
3368 | return GetPriorityBySimpleAngularDistance(client); | 3367 | return GetPriorityBySimpleAngularDistance(client); |
3368 | case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: | ||
3369 | return GetPriorityByFrontBack(client); | ||
3369 | default: | 3370 | default: |
3370 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); | 3371 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); |
3371 | } | 3372 | } |
@@ -3398,6 +3399,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
3398 | return double.NaN; | 3399 | return double.NaN; |
3399 | } | 3400 | } |
3400 | 3401 | ||
3402 | private double GetPriorityByFrontBack(IClientAPI client) | ||
3403 | { | ||
3404 | ScenePresence presence = Scene.GetScenePresence(client.AgentId); | ||
3405 | if (presence != null) | ||
3406 | { | ||
3407 | return GetPriorityByFrontBack(presence.CameraPosition, presence.CameraAtAxis); | ||
3408 | } | ||
3409 | return double.NaN; | ||
3410 | } | ||
3411 | |||
3401 | public double GetPriorityByDistance(Vector3 position) | 3412 | public double GetPriorityByDistance(Vector3 position) |
3402 | { | 3413 | { |
3403 | return Vector3.Distance(AbsolutePosition, position); | 3414 | return Vector3.Distance(AbsolutePosition, position); |
@@ -3427,5 +3438,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
3427 | else | 3438 | else |
3428 | return double.MinValue; | 3439 | return double.MinValue; |
3429 | } | 3440 | } |
3441 | |||
3442 | public double GetPriorityByFrontBack(Vector3 camPosition, Vector3 camAtAxis) | ||
3443 | { | ||
3444 | // Distance | ||
3445 | double priority = Vector3.Distance(camPosition, AbsolutePosition); | ||
3446 | |||
3447 | // Scale | ||
3448 | //priority -= GroupScale().Length(); | ||
3449 | |||
3450 | // Plane equation | ||
3451 | float d = -Vector3.Dot(camPosition, camAtAxis); | ||
3452 | float p = Vector3.Dot(camAtAxis, AbsolutePosition) + d; | ||
3453 | if (p < 0.0f) priority *= 2.0f; | ||
3454 | |||
3455 | return priority; | ||
3456 | } | ||
3430 | } | 3457 | } |
3431 | } | 3458 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 77706ac..a610e42 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -297,6 +297,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
297 | get { return Util.Axes2Rot(m_CameraAtAxis, m_CameraLeftAxis, m_CameraUpAxis); } | 297 | get { return Util.Axes2Rot(m_CameraAtAxis, m_CameraLeftAxis, m_CameraUpAxis); } |
298 | } | 298 | } |
299 | 299 | ||
300 | public Vector3 CameraAtAxis | ||
301 | { | ||
302 | get { return m_CameraAtAxis; } | ||
303 | } | ||
304 | |||
305 | public Vector3 CameraLeftAxis | ||
306 | { | ||
307 | get { return m_CameraLeftAxis; } | ||
308 | } | ||
309 | |||
310 | public Vector3 CameraUpAxis | ||
311 | { | ||
312 | get { return m_CameraUpAxis; } | ||
313 | } | ||
314 | |||
300 | public Vector3 Lookat | 315 | public Vector3 Lookat |
301 | { | 316 | { |
302 | get | 317 | get |
@@ -3867,6 +3882,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3867 | return GetPriorityByDistance(client); | 3882 | return GetPriorityByDistance(client); |
3868 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: | 3883 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: |
3869 | return GetPriorityByDistance(client); | 3884 | return GetPriorityByDistance(client); |
3885 | case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: | ||
3886 | return GetPriorityByFrontBack(client); | ||
3870 | default: | 3887 | default: |
3871 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined."); | 3888 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined."); |
3872 | } | 3889 | } |
@@ -3888,11 +3905,34 @@ namespace OpenSim.Region.Framework.Scenes | |||
3888 | return double.NaN; | 3905 | return double.NaN; |
3889 | } | 3906 | } |
3890 | 3907 | ||
3908 | private double GetPriorityByFrontBack(IClientAPI client) | ||
3909 | { | ||
3910 | ScenePresence presence = Scene.GetScenePresence(client.AgentId); | ||
3911 | if (presence != null) | ||
3912 | { | ||
3913 | return GetPriorityByFrontBack(presence.CameraPosition, presence.CameraAtAxis); | ||
3914 | } | ||
3915 | return double.NaN; | ||
3916 | } | ||
3917 | |||
3891 | private double GetPriorityByDistance(Vector3 position) | 3918 | private double GetPriorityByDistance(Vector3 position) |
3892 | { | 3919 | { |
3893 | return Vector3.Distance(AbsolutePosition, position); | 3920 | return Vector3.Distance(AbsolutePosition, position); |
3894 | } | 3921 | } |
3895 | 3922 | ||
3923 | private double GetPriorityByFrontBack(Vector3 camPosition, Vector3 camAtAxis) | ||
3924 | { | ||
3925 | // Distance | ||
3926 | double priority = Vector3.Distance(camPosition, AbsolutePosition); | ||
3927 | |||
3928 | // Plane equation | ||
3929 | float d = -Vector3.Dot(camPosition, camAtAxis); | ||
3930 | float p = Vector3.Dot(camAtAxis, AbsolutePosition) + d; | ||
3931 | if (p < 0.0f) priority *= 2.0f; | ||
3932 | |||
3933 | return priority; | ||
3934 | } | ||
3935 | |||
3896 | private double GetSOGUpdatePriority(SceneObjectGroup sog) | 3936 | private double GetSOGUpdatePriority(SceneObjectGroup sog) |
3897 | { | 3937 | { |
3898 | switch (Scene.UpdatePrioritizationScheme) | 3938 | switch (Scene.UpdatePrioritizationScheme) |
@@ -3903,6 +3943,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3903 | return sog.GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); | 3943 | return sog.GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); |
3904 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: | 3944 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: |
3905 | return sog.GetPriorityBySimpleAngularDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); | 3945 | return sog.GetPriorityBySimpleAngularDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); |
3946 | case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: | ||
3947 | return sog.GetPriorityByFrontBack(CameraPosition, CameraAtAxis); | ||
3906 | default: | 3948 | default: |
3907 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); | 3949 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); |
3908 | } | 3950 | } |
@@ -3929,6 +3971,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3929 | case Scene.UpdatePrioritizationSchemes.Distance: | 3971 | case Scene.UpdatePrioritizationSchemes.Distance: |
3930 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: | 3972 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: |
3931 | return GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); | 3973 | return GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); |
3974 | case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: | ||
3975 | return GetPriorityByFrontBack(CameraPosition, CameraAtAxis); | ||
3932 | default: | 3976 | default: |
3933 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); | 3977 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); |
3934 | } | 3978 | } |
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 6ff70fc..3dc746e 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example | |||
@@ -1397,8 +1397,8 @@ | |||
1397 | 1397 | ||
1398 | [InterestManagement] | 1398 | [InterestManagement] |
1399 | ; This section controls how state updates are prioritized for each client | 1399 | ; This section controls how state updates are prioritized for each client |
1400 | ; Valid values are Time, Distance, and SimpleAngularDistance | 1400 | ; Valid values are Time, Distance, SimpleAngularDistance, and FrontBack |
1401 | UpdatePrioritizationScheme = Distance; | 1401 | UpdatePrioritizationScheme = FrontBack; |
1402 | ReprioritizationEnabled = true; | 1402 | ReprioritizationEnabled = true; |
1403 | ReprioritizationInterval = 2000.0; | 1403 | ReprioritizationInterval = 2000.0; |
1404 | RootReprioritizationDistance = 10.0; | 1404 | RootReprioritizationDistance = 10.0; |