From 62f1a5e36d85b95e8f80bc073ba876873494963a Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Fri, 23 Oct 2009 02:38:59 -0700 Subject: Implemented a "FrontBack" prioritizer, using distance plus the plane equation to give double weight to prims/avatars in front of you --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs') 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 get { return Util.Axes2Rot(m_CameraAtAxis, m_CameraLeftAxis, m_CameraUpAxis); } } + public Vector3 CameraAtAxis + { + get { return m_CameraAtAxis; } + } + + public Vector3 CameraLeftAxis + { + get { return m_CameraLeftAxis; } + } + + public Vector3 CameraUpAxis + { + get { return m_CameraUpAxis; } + } + public Vector3 Lookat { get @@ -3867,6 +3882,8 @@ namespace OpenSim.Region.Framework.Scenes return GetPriorityByDistance(client); case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: return GetPriorityByDistance(client); + case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: + return GetPriorityByFrontBack(client); default: throw new InvalidOperationException("UpdatePrioritizationScheme not defined."); } @@ -3888,11 +3905,34 @@ namespace OpenSim.Region.Framework.Scenes return double.NaN; } + private double GetPriorityByFrontBack(IClientAPI client) + { + ScenePresence presence = Scene.GetScenePresence(client.AgentId); + if (presence != null) + { + return GetPriorityByFrontBack(presence.CameraPosition, presence.CameraAtAxis); + } + return double.NaN; + } + private double GetPriorityByDistance(Vector3 position) { return Vector3.Distance(AbsolutePosition, position); } + private double GetPriorityByFrontBack(Vector3 camPosition, Vector3 camAtAxis) + { + // Distance + double priority = Vector3.Distance(camPosition, AbsolutePosition); + + // Plane equation + float d = -Vector3.Dot(camPosition, camAtAxis); + float p = Vector3.Dot(camAtAxis, AbsolutePosition) + d; + if (p < 0.0f) priority *= 2.0f; + + return priority; + } + private double GetSOGUpdatePriority(SceneObjectGroup sog) { switch (Scene.UpdatePrioritizationScheme) @@ -3903,6 +3943,8 @@ namespace OpenSim.Region.Framework.Scenes return sog.GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: return sog.GetPriorityBySimpleAngularDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); + case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: + return sog.GetPriorityByFrontBack(CameraPosition, CameraAtAxis); default: throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); } @@ -3929,6 +3971,8 @@ namespace OpenSim.Region.Framework.Scenes case Scene.UpdatePrioritizationSchemes.Distance: case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: return GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); + case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: + return GetPriorityByFrontBack(CameraPosition, CameraAtAxis); default: throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); } -- cgit v1.1