aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs93
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsScene.cs2
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs14
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs21
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs7
5 files changed, 77 insertions, 60 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
2082 if (part == null) 2082 if (part == null)
2083 return; 2083 return;
2084 2084
2085 // TODO: determine position to sit at based on scene geometry; don't trust offset from client
2086 // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it
2087
2088 if (PhysicsActor != null) 2085 if (PhysicsActor != null)
2089 m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f; 2086 m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f;
2090 2087
@@ -2103,25 +2100,8 @@ namespace OpenSim.Region.Framework.Scenes
2103 } 2100 }
2104 else 2101 else
2105 { 2102 {
2106// if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) 2103 if (PhysicsSit(part,offset)) // physics engine
2107// { 2104 return;
2108// m_log.DebugFormat(
2109// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is unset and within 10m",
2110// Name, part.Name, part.LocalId);
2111
2112 if (m_scene.PhysicsScene != null &&
2113 part.PhysActor != null &&
2114 Util.GetDistanceTo(AbsolutePosition, pos) <= 30)
2115 {
2116
2117 Vector3 camdif = CameraPosition - part.AbsolutePosition;
2118 camdif.Normalize();
2119
2120// m_log.InfoFormat("sit {0} {1}", offset.ToString(), camdif.ToString());
2121
2122 if (m_scene.PhysicsScene.SitAvatar(part.PhysActor, AbsolutePosition, CameraPosition, offset, new Vector3(0.35f, 0, 0.65f), PhysicsSitResponse) != 0)
2123 return;
2124 }
2125 2105
2126 if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) 2106 if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
2127 { 2107 {
@@ -2129,12 +2109,6 @@ namespace OpenSim.Region.Framework.Scenes
2129 AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight); 2109 AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight);
2130 canSit = true; 2110 canSit = true;
2131 } 2111 }
2132// else
2133// {
2134// m_log.DebugFormat(
2135// "[SCENE PRESENCE]: Ignoring sit request of {0} on {1} {2} because sit target is unset and outside 10m",
2136// Name, part.Name, part.LocalId);
2137// }
2138 } 2112 }
2139 2113
2140 if (canSit) 2114 if (canSit)
@@ -2196,14 +2170,6 @@ namespace OpenSim.Region.Framework.Scenes
2196 m_requestedSitTargetID = part.LocalId; 2170 m_requestedSitTargetID = part.LocalId;
2197 m_requestedSitTargetUUID = targetID; 2171 m_requestedSitTargetUUID = targetID;
2198 2172
2199// m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
2200
2201 if (m_scene.PhysicsScene.SupportsRayCast())
2202 {
2203 //m_scene.PhysicsScene.RaycastWorld(Vector3.Zero,Vector3.Zero, 0.01f,new RaycastCallback());
2204 //SitRayCastAvatarPosition(part);
2205 //return;
2206 }
2207 } 2173 }
2208 else 2174 else
2209 { 2175 {
@@ -2213,24 +2179,57 @@ namespace OpenSim.Region.Framework.Scenes
2213 SendSitResponse(targetID, offset, Quaternion.Identity); 2179 SendSitResponse(targetID, offset, Quaternion.Identity);
2214 } 2180 }
2215 2181
2216 public void PhysicsSitResponse(int status, uint partID, Vector3 offset, Quaternion Orientation) 2182 // returns false if does not suport so older sit can be tried
2183 public bool PhysicsSit(SceneObjectPart part, Vector3 offset)
2217 { 2184 {
2185 if (part == null || part.ParentGroup.IsAttachment)
2186 {
2187 return true;
2188 }
2218 2189
2219 if (status < 0) 2190 if ( m_scene.PhysicsScene == null)
2191 return false;
2192
2193 if (part.PhysActor == null)
2220 { 2194 {
2221 ControllingClient.SendAlertMessage("Sit position no longer exists"); 2195 // none physcis shape
2222 return; 2196 if (part.PhysicsShapeType == (byte)PhysicsShapeType.None)
2197 ControllingClient.SendAlertMessage(" There is no suitable surface to sit on, try another spot.");
2198 else
2199 { // non physical phantom TODO
2200 ControllingClient.SendAlertMessage(" There is no suitable surface to sit on, try another spot.");
2201 return false;
2202 }
2203 return true;
2223 } 2204 }
2224 2205
2225 if (status == 0) 2206 // not doing autopilot
2207 m_requestedSitTargetID = 0;
2208
2209 if (m_scene.PhysicsScene.SitAvatar(part.PhysActor, AbsolutePosition, CameraPosition, offset, new Vector3(0.35f, 0, 0.65f), PhysicsSitResponse) != 0)
2210 return true;
2211
2212 return false;
2213 }
2214
2215 // status
2216 // < 0 ignore
2217 // 0 bad sit spot
2218 public void PhysicsSitResponse(int status, uint partID, Vector3 offset, Quaternion Orientation)
2219 {
2220 if (status < 0)
2226 return; 2221 return;
2227 2222
2228 SceneObjectPart part = m_scene.GetSceneObjectPart(partID); 2223 if (status == 0)
2229 if (part == null || part.ParentGroup.IsAttachment)
2230 { 2224 {
2225 ControllingClient.SendAlertMessage(" There is no suitable surface to sit on, try another spot.");
2231 return; 2226 return;
2232 } 2227 }
2233 2228
2229 SceneObjectPart part = m_scene.GetSceneObjectPart(partID);
2230 if (part == null)
2231 return;
2232
2234// m_log.InfoFormat("physsit {0} {1}", offset.ToString(),Orientation.ToString()); 2233// m_log.InfoFormat("physsit {0} {1}", offset.ToString(),Orientation.ToString());
2235 2234
2236 part.AddSittingAvatar(UUID); 2235 part.AddSittingAvatar(UUID);
@@ -2242,16 +2241,14 @@ namespace OpenSim.Region.Framework.Scenes
2242 ControllingClient.SendSitResponse( 2241 ControllingClient.SendSitResponse(
2243 part.UUID, offset, Orientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); 2242 part.UUID, offset, Orientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook);
2244 2243
2245 part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); 2244 // not using autopilot
2246
2247 // assuming no autopilot in use
2248 Velocity = Vector3.Zero; 2245 Velocity = Vector3.Zero;
2249 RemoveFromPhysicalScene(); 2246 RemoveFromPhysicalScene();
2250 2247
2251 Rotation = Orientation; 2248 Rotation = Orientation;
2252 m_pos = offset; 2249 m_pos = offset;
2253 2250
2254 m_requestedSitTargetID = 0; // invalidate the viewer sit comand for now 2251 m_requestedSitTargetID = 0;
2255 part.ParentGroup.AddAvatar(UUID); 2252 part.ParentGroup.AddAvatar(UUID);
2256 2253
2257 ParentPart = part; 2254 ParentPart = part;
@@ -2259,6 +2256,8 @@ namespace OpenSim.Region.Framework.Scenes
2259 2256
2260 Animator.TrySetMovementAnimation("SIT"); 2257 Animator.TrySetMovementAnimation("SIT");
2261 SendAvatarDataToAllAgents(); 2258 SendAvatarDataToAllAgents();
2259
2260 part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
2262 } 2261 }
2263 2262
2264 2263
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
index a442cf0..86e0713 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
@@ -353,7 +353,7 @@ namespace OpenSim.Region.Physics.Manager
353 353
354 public virtual void RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, RaycastCallback retMethod){} 354 public virtual void RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, RaycastCallback retMethod){}
355 public virtual void RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count, RayCallback retMethod) { } 355 public virtual void RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count, RayCallback retMethod) { }
356 public virtual List<ContactResult> RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count) 356 public virtual List<ContactResult> RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags flags)
357 { 357 {
358 return new List<ContactResult>(); 358 return new List<ContactResult>();
359 } 359 }
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
index 561ab1c..54a83c2 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
@@ -199,6 +199,20 @@ namespace OpenSim.Region.Physics.OdePlugin
199 m_PendingRequests.Enqueue(req); 199 m_PendingRequests.Enqueue(req);
200 } 200 }
201 201
202 public void QueueRequest(IntPtr geom, Vector3 position, Vector3 direction, float length, int count,RayFilterFlags flags, RayCallback retMethod)
203 {
204 ODERayRequest req = new ODERayRequest();
205 req.geom = geom;
206 req.callbackMethod = retMethod;
207 req.length = length;
208 req.Normal = direction;
209 req.Origin = position;
210 req.Count = count;
211 req.filter = flags;
212
213 m_PendingRequests.Enqueue(req);
214 }
215
202 public void QueueRequest(Vector3 position, Vector3 direction, float length, int count, RaycastCallback retMethod) 216 public void QueueRequest(Vector3 position, Vector3 direction, float length, int count, RaycastCallback retMethod)
203 { 217 {
204 ODERayRequest req = new ODERayRequest(); 218 ODERayRequest req = new ODERayRequest();
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs
index 225bff8..fd3a3ba 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs
@@ -52,6 +52,7 @@ namespace OpenSim.Region.Physics.OdePlugin
52 } 52 }
53 53
54 private static Vector3 SitAjust = new Vector3(0, 0, 0.4f); 54 private static Vector3 SitAjust = new Vector3(0, 0, 0.4f);
55 private const RayFilterFlags RaySitFlags = RayFilterFlags.AllPrims | RayFilterFlags.ClosestHit;
55 56
56 public void Sit(PhysicsActor actor, Vector3 avPos, Vector3 avCameraPosition, Vector3 offset, Vector3 avOffset, SitAvatarCallback PhysicsSitResponse) 57 public void Sit(PhysicsActor actor, Vector3 avPos, Vector3 avCameraPosition, Vector3 offset, Vector3 avOffset, SitAvatarCallback PhysicsSitResponse)
57 { 58 {
@@ -93,10 +94,10 @@ namespace OpenSim.Region.Physics.OdePlugin
93 rayDir.Y *= t; 94 rayDir.Y *= t;
94 rayDir.Z *= t; 95 rayDir.Z *= t;
95 96
96 raylen += 0.5f; 97 raylen += 30f; // focal point may be far
97 List<ContactResult> rayResults; 98 List<ContactResult> rayResults;
98 99
99 rayResults = m_scene.RaycastActor(actor, avCameraPosition, rayDir , raylen, 1); 100 rayResults = m_scene.RaycastActor(actor, avCameraPosition, rayDir, raylen, 1, RaySitFlags);
100 if (rayResults.Count == 0 || rayResults[0].ConsumerID != actor.LocalID) 101 if (rayResults.Count == 0 || rayResults[0].ConsumerID != actor.LocalID)
101 { 102 {
102 d.GeomGetAABB(geom,out aabb); 103 d.GeomGetAABB(geom,out aabb);
@@ -108,6 +109,7 @@ namespace OpenSim.Region.Physics.OdePlugin
108 return; 109 return;
109 } 110 }
110 111
112
111 offset = rayResults[0].Pos - geopos; 113 offset = rayResults[0].Pos - geopos;
112 double ang; 114 double ang;
113 float s; 115 float s;
@@ -156,13 +158,16 @@ namespace OpenSim.Region.Physics.OdePlugin
156 return; 158 return;
157 } 159 }
158 160
159 Vector3 norm = rayResults[0].Normal; 161/*
162 // contact normals aren't reliable on meshs or sculpts it seems
163 Vector3 norm = rayResults[0].Normal;
160 164
161 if (norm.Z < 0) 165 if (norm.Z < 0)
162 { 166 {
163 PhysicsSitResponse(0, actor.LocalID, offset, Quaternion.Identity); 167 PhysicsSitResponse(0, actor.LocalID, offset, Quaternion.Identity);
164 return; 168 return;
165 } 169 }
170*/
166 171
167 ang = Math.Atan2(-rayDir.Y, -rayDir.X); 172 ang = Math.Atan2(-rayDir.Y, -rayDir.X);
168 ang *= 0.5d; 173 ang *= 0.5d;
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index fbf2f0d..d344d4d 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -2675,9 +2675,8 @@ namespace OpenSim.Region.Physics.OdePlugin
2675 m_rayCastManager.QueueRequest(geom,position, direction, length, Count, retMethod); 2675 m_rayCastManager.QueueRequest(geom,position, direction, length, Count, retMethod);
2676 } 2676 }
2677 } 2677 }
2678 2678
2679 // don't like this 2679 public override List<ContactResult> RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags flags)
2680 public override List<ContactResult> RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count)
2681 { 2680 {
2682 if (actor != null) 2681 if (actor != null)
2683 { 2682 {
@@ -2698,7 +2697,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2698 results.CopyTo(ourResults, 0); 2697 results.CopyTo(ourResults, 0);
2699 }; 2698 };
2700 int waitTime = 0; 2699 int waitTime = 0;
2701 m_rayCastManager.QueueRequest(geom,position, direction, length, Count, retMethod); 2700 m_rayCastManager.QueueRequest(geom,position, direction, length, Count, flags, retMethod);
2702 while (ourResults == null && waitTime < 1000) 2701 while (ourResults == null && waitTime < 1000)
2703 { 2702 {
2704 Thread.Sleep(1); 2703 Thread.Sleep(1);