aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs246
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs9
3 files changed, 239 insertions, 18 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index 50624a1..e98f0e7 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -128,7 +128,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
128 if (!m_scenePresence.IsChildAgent) 128 if (!m_scenePresence.IsChildAgent)
129 { 129 {
130 if (m_animations.TrySetDefaultAnimation( 130 if (m_animations.TrySetDefaultAnimation(
131 anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, UUID.Zero)) 131 anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID))
132 { 132 {
133//Console.WriteLine("TSMA {0} success.", anim); 133//Console.WriteLine("TSMA {0} success.", anim);
134 // 16384 is CHANGED_ANIMATION 134 // 16384 is CHANGED_ANIMATION
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index fbc4ed5..c553ca0 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -128,6 +128,7 @@ namespace OpenSim.Region.Framework.Scenes
128 private Vector3? m_forceToApply; 128 private Vector3? m_forceToApply;
129 private uint m_requestedSitTargetID; 129 private uint m_requestedSitTargetID;
130 private UUID m_requestedSitTargetUUID; 130 private UUID m_requestedSitTargetUUID;
131 private Vector3 m_requestedSitOffset;
131 private SendCourseLocationsMethod m_sendCourseLocationsMethod; 132 private SendCourseLocationsMethod m_sendCourseLocationsMethod;
132 133
133 private bool m_startAnimationSet; 134 private bool m_startAnimationSet;
@@ -1296,10 +1297,13 @@ namespace OpenSim.Region.Framework.Scenes
1296 { 1297 {
1297 return; 1298 return;
1298 } 1299 }
1300
1301 bool update_movementflag = false;
1302
1299 if (m_allowMovement) 1303 if (m_allowMovement)
1300 { 1304 {
1301 int i = 0; 1305 int i = 0;
1302 bool update_movementflag = false; 1306
1303 bool update_rotation = false; 1307 bool update_rotation = false;
1304 bool DCFlagKeyPressed = false; 1308 bool DCFlagKeyPressed = false;
1305 Vector3 agent_control_v3 = Vector3.Zero; 1309 Vector3 agent_control_v3 = Vector3.Zero;
@@ -1451,27 +1455,33 @@ namespace OpenSim.Region.Framework.Scenes
1451 if (LocalVectorToTarget2D.Y > 0)//MoveLeft 1455 if (LocalVectorToTarget2D.Y > 0)//MoveLeft
1452 { 1456 {
1453 m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT; 1457 m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
1458 //AgentControlFlags
1459 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
1454 update_movementflag = true; 1460 update_movementflag = true;
1455 } 1461 }
1456 else if (LocalVectorToTarget2D.Y < 0) //MoveRight 1462 else if (LocalVectorToTarget2D.Y < 0) //MoveRight
1457 { 1463 {
1458 m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT; 1464 m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
1465 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
1459 update_movementflag = true; 1466 update_movementflag = true;
1460 } 1467 }
1461 if (LocalVectorToTarget2D.X < 0) //MoveBack 1468 if (LocalVectorToTarget2D.X < 0) //MoveBack
1462 { 1469 {
1463 m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; 1470 m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
1471 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
1464 update_movementflag = true; 1472 update_movementflag = true;
1465 } 1473 }
1466 else if (LocalVectorToTarget2D.X > 0) //Move Forward 1474 else if (LocalVectorToTarget2D.X > 0) //Move Forward
1467 { 1475 {
1468 m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; 1476 m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
1477 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
1469 update_movementflag = true; 1478 update_movementflag = true;
1470 } 1479 }
1471 } 1480 }
1472 catch (Exception) 1481 catch (Exception e)
1473 { 1482 {
1474 //Avoid system crash, can be slower but... 1483 //Avoid system crash, can be slower but...
1484 m_log.DebugFormat("Crash! {0}", e.ToString());
1475 } 1485 }
1476 } 1486 }
1477 } 1487 }
@@ -1509,11 +1519,13 @@ namespace OpenSim.Region.Framework.Scenes
1509 1519
1510 AddNewMovement(agent_control_v3, q, Nudging); 1520 AddNewMovement(agent_control_v3, q, Nudging);
1511 1521
1512 if (update_movementflag) 1522
1513 Animator.UpdateMovementAnimations();
1514 } 1523 }
1515 } 1524 }
1516 1525
1526 if (update_movementflag)
1527 Animator.UpdateMovementAnimations();
1528
1517 m_scene.EventManager.TriggerOnClientMovement(this); 1529 m_scene.EventManager.TriggerOnClientMovement(this);
1518 1530
1519 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); 1531 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
@@ -1712,11 +1724,12 @@ namespace OpenSim.Region.Framework.Scenes
1712 return targetPart; 1724 return targetPart;
1713 } 1725 }
1714 1726
1715 private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset) 1727 private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset, Quaternion pSitOrientation)
1716 { 1728 {
1717 bool autopilot = true; 1729 bool autopilot = true;
1718 Vector3 autopilotTarget = new Vector3(); 1730 Vector3 autopilotTarget = new Vector3();
1719 Quaternion sitOrientation = Quaternion.Identity; 1731 Quaternion sitOrientation = Quaternion.Identity;
1732 Vector3 pos = new Vector3();
1720 Vector3 cameraEyeOffset = Vector3.Zero; 1733 Vector3 cameraEyeOffset = Vector3.Zero;
1721 Vector3 cameraAtOffset = Vector3.Zero; 1734 Vector3 cameraAtOffset = Vector3.Zero;
1722 bool forceMouselook = false; 1735 bool forceMouselook = false;
@@ -1843,12 +1856,17 @@ namespace OpenSim.Region.Framework.Scenes
1843 m_nextSitAnimation = part.SitAnimation; 1856 m_nextSitAnimation = part.SitAnimation;
1844 } 1857 }
1845 m_requestedSitTargetID = part.LocalId; 1858 m_requestedSitTargetID = part.LocalId;
1846 //m_requestedSitOffset = offset; 1859 m_requestedSitOffset = offset;
1847 //offset.X += part.Scale.X;// *offset.X; 1860 m_requestedSitTargetUUID = targetID;
1848 //offset.Y += part.Scale.Y;// * offset.Y; 1861
1849 //offset.Z += part.Scale.Z;// * offset.Z;
1850 //m_requestedSitOffset = offset;
1851 m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset); 1862 m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
1863
1864 if (m_scene.PhysicsScene.SupportsRayCast())
1865 {
1866 //m_scene.PhysicsScene.RaycastWorld(Vector3.Zero,Vector3.Zero, 0.01f,new RaycastCallback());
1867 //SitRayCastAvatarPosition(part);
1868 //return;
1869 }
1852 } 1870 }
1853 else 1871 else
1854 { 1872 {
@@ -1856,14 +1874,201 @@ namespace OpenSim.Region.Framework.Scenes
1856 m_log.Warn("Sit requested on unknown object: " + targetID.ToString()); 1874 m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
1857 } 1875 }
1858 1876
1859 if (m_scene.PhysicsScene.SupportsRayCast()) 1877
1878
1879 SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
1880 }
1881 /*
1882 public void SitRayCastAvatarPosition(SceneObjectPart part)
1883 {
1884 Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
1885 Vector3 StartRayCastPosition = AbsolutePosition;
1886 Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
1887 float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
1888 m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionResponse);
1889 }
1890
1891 public void SitRayCastAvatarPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
1892 {
1893 SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
1894 if (part != null)
1895 {
1896 if (hitYN)
1897 {
1898 if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
1899 {
1900 SitRaycastFindEdge(collisionPoint, normal);
1901 m_log.DebugFormat("[SIT]: Raycast Avatar Position succeeded at point: {0}, normal:{1}", collisionPoint, normal );
1902 }
1903 else
1904 {
1905 SitRayCastAvatarPositionCameraZ(part);
1906 }
1907 }
1908 else
1909 {
1910 SitRayCastAvatarPositionCameraZ(part);
1911 }
1912 }
1913 else
1914 {
1915 ControllingClient.SendAlertMessage("Sit position no longer exists");
1916 m_requestedSitTargetUUID = UUID.Zero;
1917 m_requestedSitTargetID = 0;
1918 m_requestedSitOffset = Vector3.Zero;
1919 }
1920
1921 }
1922
1923 public void SitRayCastAvatarPositionCameraZ(SceneObjectPart part)
1924 {
1925 // Next, try to raycast from the camera Z position
1926 Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
1927 Vector3 StartRayCastPosition = AbsolutePosition; StartRayCastPosition.Z = CameraPosition.Z;
1928 Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
1929 float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
1930 m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionCameraZResponse);
1931 }
1932
1933 public void SitRayCastAvatarPositionCameraZResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
1934 {
1935 SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
1936 if (part != null)
1937 {
1938 if (hitYN)
1939 {
1940 if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
1941 {
1942 SitRaycastFindEdge(collisionPoint, normal);
1943 m_log.DebugFormat("[SIT]: Raycast Avatar Position + CameraZ succeeded at point: {0}, normal:{1}", collisionPoint, normal);
1944 }
1945 else
1946 {
1947 SitRayCastCameraPosition(part);
1948 }
1949 }
1950 else
1951 {
1952 SitRayCastCameraPosition(part);
1953 }
1954 }
1955 else
1860 { 1956 {
1861 //m_scene.PhysicsScene.RaycastWorld(Vector3.Zero,Vector3.Zero, 0.01f,new RaycastCallback()); 1957 ControllingClient.SendAlertMessage("Sit position no longer exists");
1958 m_requestedSitTargetUUID = UUID.Zero;
1959 m_requestedSitTargetID = 0;
1960 m_requestedSitOffset = Vector3.Zero;
1862 } 1961 }
1863 1962
1864 SendSitResponse(remoteClient, targetID, offset);
1865 } 1963 }
1866 1964
1965 public void SitRayCastCameraPosition(SceneObjectPart part)
1966 {
1967 // Next, try to raycast from the camera position
1968 Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
1969 Vector3 StartRayCastPosition = CameraPosition;
1970 Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
1971 float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
1972 m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastCameraPositionResponse);
1973 }
1974
1975 public void SitRayCastCameraPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
1976 {
1977 SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
1978 if (part != null)
1979 {
1980 if (hitYN)
1981 {
1982 if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
1983 {
1984 SitRaycastFindEdge(collisionPoint, normal);
1985 m_log.DebugFormat("[SIT]: Raycast Camera Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
1986 }
1987 else
1988 {
1989 SitRayHorizontal(part);
1990 }
1991 }
1992 else
1993 {
1994 SitRayHorizontal(part);
1995 }
1996 }
1997 else
1998 {
1999 ControllingClient.SendAlertMessage("Sit position no longer exists");
2000 m_requestedSitTargetUUID = UUID.Zero;
2001 m_requestedSitTargetID = 0;
2002 m_requestedSitOffset = Vector3.Zero;
2003 }
2004
2005 }
2006
2007 public void SitRayHorizontal(SceneObjectPart part)
2008 {
2009 // Next, try to raycast from the avatar position to fwd
2010 Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
2011 Vector3 StartRayCastPosition = CameraPosition;
2012 Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
2013 float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
2014 m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastHorizontalResponse);
2015 }
2016
2017 public void SitRayCastHorizontalResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
2018 {
2019 SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
2020 if (part != null)
2021 {
2022 if (hitYN)
2023 {
2024 if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
2025 {
2026 SitRaycastFindEdge(collisionPoint, normal);
2027 m_log.DebugFormat("[SIT]: Raycast Horizontal Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
2028 // Next, try to raycast from the camera position
2029 Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
2030 Vector3 StartRayCastPosition = CameraPosition;
2031 Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
2032 float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
2033 //m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastResponseAvatarPosition);
2034 }
2035 else
2036 {
2037 ControllingClient.SendAlertMessage("Sit position not accessable.");
2038 m_requestedSitTargetUUID = UUID.Zero;
2039 m_requestedSitTargetID = 0;
2040 m_requestedSitOffset = Vector3.Zero;
2041 }
2042 }
2043 else
2044 {
2045 ControllingClient.SendAlertMessage("Sit position not accessable.");
2046 m_requestedSitTargetUUID = UUID.Zero;
2047 m_requestedSitTargetID = 0;
2048 m_requestedSitOffset = Vector3.Zero;
2049 }
2050 }
2051 else
2052 {
2053 ControllingClient.SendAlertMessage("Sit position no longer exists");
2054 m_requestedSitTargetUUID = UUID.Zero;
2055 m_requestedSitTargetID = 0;
2056 m_requestedSitOffset = Vector3.Zero;
2057 }
2058
2059 }
2060
2061 private void SitRaycastFindEdge(Vector3 collisionPoint, Vector3 collisionNormal)
2062 {
2063 int i = 0;
2064 //throw new NotImplementedException();
2065 //m_requestedSitTargetUUID = UUID.Zero;
2066 //m_requestedSitTargetID = 0;
2067 //m_requestedSitOffset = Vector3.Zero;
2068
2069 SendSitResponse(ControllingClient, m_requestedSitTargetUUID, collisionPoint - m_requestedSitOffset, Quaternion.Identity);
2070 }
2071 */
1867 public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset, string sitAnimation) 2072 public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset, string sitAnimation)
1868 { 2073 {
1869 if (m_parentID != 0) 2074 if (m_parentID != 0)
@@ -1884,14 +2089,23 @@ namespace OpenSim.Region.Framework.Scenes
1884 if (part != null) 2089 if (part != null)
1885 { 2090 {
1886 m_requestedSitTargetID = part.LocalId; 2091 m_requestedSitTargetID = part.LocalId;
1887 //m_requestedSitOffset = offset; 2092 m_requestedSitOffset = offset;
2093 m_requestedSitTargetUUID = targetID;
2094
2095 m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
2096
2097 if (m_scene.PhysicsScene.SupportsRayCast())
2098 {
2099 //SitRayCastAvatarPosition(part);
2100 //return;
2101 }
1888 } 2102 }
1889 else 2103 else
1890 { 2104 {
1891 m_log.Warn("Sit requested on unknown object: " + targetID); 2105 m_log.Warn("Sit requested on unknown object: " + targetID);
1892 } 2106 }
1893 2107
1894 SendSitResponse(remoteClient, targetID, offset); 2108 SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
1895 } 2109 }
1896 2110
1897 public void HandleAgentSit(IClientAPI remoteClient, UUID agentID) 2111 public void HandleAgentSit(IClientAPI remoteClient, UUID agentID)
diff --git a/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs b/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs
index 732e835..7314107 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs
@@ -106,13 +106,20 @@ namespace OpenSim.Region.Physics.OdePlugin
106 { 106 {
107 if (m_PendingRequests.Count > 0) 107 if (m_PendingRequests.Count > 0)
108 { 108 {
109 ODERayCastRequest[] reqs = m_PendingRequests.ToArray();
110 for (int i = 0; i < reqs.Length; i++)
111 {
112 if (reqs[i].callbackMethod != null) // quick optimization here, don't raycast
113 RayCast(reqs[i]); // if there isn't anyone to send results
114 }
115 /*
109 foreach (ODERayCastRequest req in m_PendingRequests) 116 foreach (ODERayCastRequest req in m_PendingRequests)
110 { 117 {
111 if (req.callbackMethod != null) // quick optimization here, don't raycast 118 if (req.callbackMethod != null) // quick optimization here, don't raycast
112 RayCast(req); // if there isn't anyone to send results to 119 RayCast(req); // if there isn't anyone to send results to
113 120
114 } 121 }
115 122 */
116 m_PendingRequests.Clear(); 123 m_PendingRequests.Clear();
117 } 124 }
118 } 125 }