From 9089bc7e37879867756740cfbd0456ad51244ca0 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Mon, 17 Dec 2012 22:11:29 +0000
Subject:  some clean up/fix

---
 OpenSim/Region/Framework/Scenes/ScenePresence.cs   | 93 +++++++++++-----------
 .../Region/Physics/UbitOdePlugin/ODESitAvatar.cs   |  2 +-
 2 files changed, 47 insertions(+), 48 deletions(-)

diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 7ff163b..646e0e2 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2082,9 +2082,6 @@ namespace OpenSim.Region.Framework.Scenes
             if (part == null)
                 return;
 
-            // TODO: determine position to sit at based on scene geometry; don't trust offset from client
-            // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it
-
             if (PhysicsActor != null)
                 m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f;
 
@@ -2103,25 +2100,8 @@ namespace OpenSim.Region.Framework.Scenes
             }
             else
             {
-//                if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
-//                {
-//                    m_log.DebugFormat(
-//                        "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is unset and within 10m",
-//                        Name, part.Name, part.LocalId);
-
-                if (m_scene.PhysicsScene != null &&
-                    part.PhysActor != null &&
-                    Util.GetDistanceTo(AbsolutePosition, pos) <= 30)
-                {
-
-                    Vector3 camdif = CameraPosition - part.AbsolutePosition;
-                    camdif.Normalize();
-
-//                    m_log.InfoFormat("sit {0} {1}", offset.ToString(), camdif.ToString());
-
-                    if (m_scene.PhysicsScene.SitAvatar(part.PhysActor, AbsolutePosition, CameraPosition, offset, new Vector3(0.35f, 0, 0.65f), PhysicsSitResponse) != 0)
-                        return;
-                }
+                if (PhysicsSit(part,offset)) // physics engine 
+                    return;
 
                 if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
                 {
@@ -2129,12 +2109,6 @@ namespace OpenSim.Region.Framework.Scenes
                     AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight);
                     canSit = true;
                 }
-//                else
-//                {
-//                    m_log.DebugFormat(
-//                        "[SCENE PRESENCE]: Ignoring sit request of {0} on {1} {2} because sit target is unset and outside 10m",
-//                        Name, part.Name, part.LocalId);
-//                }
             }
 
             if (canSit)
@@ -2196,14 +2170,6 @@ namespace OpenSim.Region.Framework.Scenes
                 m_requestedSitTargetID = part.LocalId;
                 m_requestedSitTargetUUID = targetID;
 
-//                m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
-
-                if (m_scene.PhysicsScene.SupportsRayCast())
-                {
-                    //m_scene.PhysicsScene.RaycastWorld(Vector3.Zero,Vector3.Zero, 0.01f,new RaycastCallback());
-                    //SitRayCastAvatarPosition(part);
-                    //return;
-                }
             }
             else
             {
@@ -2213,24 +2179,57 @@ namespace OpenSim.Region.Framework.Scenes
             SendSitResponse(targetID, offset, Quaternion.Identity);
         }
 
-        public void PhysicsSitResponse(int status, uint partID, Vector3 offset, Quaternion Orientation)
+        // returns  false if does not suport so older sit can be tried
+        public bool PhysicsSit(SceneObjectPart part, Vector3 offset)
         {
+            if (part == null || part.ParentGroup.IsAttachment)
+            {
+                return true;
+            }
 
-            if (status < 0)
+            if ( m_scene.PhysicsScene == null)
+                return false;
+
+            if (part.PhysActor == null)
             {
-                ControllingClient.SendAlertMessage("Sit position no longer exists");
-                return;
+                // none physcis shape
+                if (part.PhysicsShapeType == (byte)PhysicsShapeType.None)
+                    ControllingClient.SendAlertMessage(" There is no suitable surface to sit on, try another spot.");
+                else
+                { // non physical phantom  TODO
+                    ControllingClient.SendAlertMessage(" There is no suitable surface to sit on, try another spot.");
+                    return false;
+                }
+                return true;
             }
 
-            if (status == 0)
+            // not doing autopilot
+            m_requestedSitTargetID = 0; 
+
+            if (m_scene.PhysicsScene.SitAvatar(part.PhysActor, AbsolutePosition, CameraPosition, offset, new Vector3(0.35f, 0, 0.65f), PhysicsSitResponse) != 0)
+                return true;
+
+            return false;
+        }
+
+        // status
+        //          < 0 ignore
+        //          0   bad sit spot
+        public void PhysicsSitResponse(int status, uint partID, Vector3 offset, Quaternion Orientation)
+        {
+            if (status < 0)
                 return;
 
-            SceneObjectPart part = m_scene.GetSceneObjectPart(partID);
-            if (part == null || part.ParentGroup.IsAttachment)
+            if (status == 0)
             {
+                ControllingClient.SendAlertMessage(" There is no suitable surface to sit on, try another spot.");
                 return;
             }
 
+            SceneObjectPart part = m_scene.GetSceneObjectPart(partID);
+            if (part == null)
+                return;
+
 //            m_log.InfoFormat("physsit {0} {1}", offset.ToString(),Orientation.ToString());
 
             part.AddSittingAvatar(UUID);
@@ -2242,16 +2241,14 @@ namespace OpenSim.Region.Framework.Scenes
             ControllingClient.SendSitResponse(
                 part.UUID, offset, Orientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook);
 
-            part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
-
-            // assuming no autopilot in use
+            // not using autopilot
             Velocity = Vector3.Zero;
             RemoveFromPhysicalScene();
 
             Rotation = Orientation;
             m_pos = offset;
 
-            m_requestedSitTargetID = 0; // invalidate the viewer sit comand for now
+            m_requestedSitTargetID = 0;
             part.ParentGroup.AddAvatar(UUID);
 
             ParentPart = part;
@@ -2259,6 +2256,8 @@ namespace OpenSim.Region.Framework.Scenes
 
             Animator.TrySetMovementAnimation("SIT");
             SendAvatarDataToAllAgents();
+
+            part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
         }
 
 
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs
index 225bff8..c1a0ca9 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs
@@ -93,7 +93,7 @@ namespace OpenSim.Region.Physics.OdePlugin
             rayDir.Y *= t;
             rayDir.Z *= t;
 
-            raylen += 0.5f;
+            raylen += 30f; // focal point may be far
             List<ContactResult> rayResults;
 
             rayResults = m_scene.RaycastActor(actor, avCameraPosition, rayDir , raylen, 1);
-- 
cgit v1.1