diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 90 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs | 11 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 41 |
3 files changed, 118 insertions, 24 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index a41c856..b2c2d8a 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -63,6 +63,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
63 | 63 | ||
64 | private bool m_isphysical; | 64 | private bool m_isphysical; |
65 | 65 | ||
66 | public int ExpectedCollisionContacts { get { return m_expectedCollisionContacts; } } | ||
67 | private int m_expectedCollisionContacts = 0; | ||
68 | |||
66 | /// <summary> | 69 | /// <summary> |
67 | /// Is this prim subject to physics? Even if not, it's still solid for collision purposes. | 70 | /// Is this prim subject to physics? Even if not, it's still solid for collision purposes. |
68 | /// </summary> | 71 | /// </summary> |
@@ -97,6 +100,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
97 | private Vector3 m_taintAngularLock = Vector3.One; | 100 | private Vector3 m_taintAngularLock = Vector3.One; |
98 | private IntPtr Amotor = IntPtr.Zero; | 101 | private IntPtr Amotor = IntPtr.Zero; |
99 | 102 | ||
103 | private object m_assetsLock = new object(); | ||
104 | private bool m_assetFailed = false; | ||
105 | |||
100 | private Vector3 m_PIDTarget; | 106 | private Vector3 m_PIDTarget; |
101 | private float m_PIDTau; | 107 | private float m_PIDTau; |
102 | private float PID_D = 35f; | 108 | private float PID_D = 35f; |
@@ -279,6 +285,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
279 | } | 285 | } |
280 | 286 | ||
281 | m_taintadd = true; | 287 | m_taintadd = true; |
288 | m_assetFailed = false; | ||
282 | _parent_scene.AddPhysicsActorTaint(this); | 289 | _parent_scene.AddPhysicsActorTaint(this); |
283 | } | 290 | } |
284 | 291 | ||
@@ -601,8 +608,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
601 | break; | 608 | break; |
602 | 609 | ||
603 | case HollowShape.Circle: | 610 | case HollowShape.Circle: |
604 | // Hollow shape is a perfect cylinder in respect to the cube's scale | 611 | // Hollow shape is a perfect cyllinder in respect to the cube's scale |
605 | // Cylinder hollow volume calculation | 612 | // Cyllinder hollow volume calculation |
606 | 613 | ||
607 | hollowVolume *= 0.1963495f * 3.07920140172638f; | 614 | hollowVolume *= 0.1963495f * 3.07920140172638f; |
608 | break; | 615 | break; |
@@ -840,7 +847,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
840 | int vertexStride, triStride; | 847 | int vertexStride, triStride; |
841 | mesh.getVertexListAsPtrToFloatArray(out vertices, out vertexStride, out vertexCount); // Note, that vertices are fixed in unmanaged heap | 848 | mesh.getVertexListAsPtrToFloatArray(out vertices, out vertexStride, out vertexCount); // Note, that vertices are fixed in unmanaged heap |
842 | mesh.getIndexListAsPtrToIntArray(out indices, out triStride, out indexCount); // Also fixed, needs release after usage | 849 | mesh.getIndexListAsPtrToIntArray(out indices, out triStride, out indexCount); // Also fixed, needs release after usage |
843 | 850 | m_expectedCollisionContacts = indexCount; | |
844 | mesh.releaseSourceMeshData(); // free up the original mesh data to save memory | 851 | mesh.releaseSourceMeshData(); // free up the original mesh data to save memory |
845 | 852 | ||
846 | // We must lock here since m_MeshToTriMeshMap is static and multiple scene threads may call this method at | 853 | // We must lock here since m_MeshToTriMeshMap is static and multiple scene threads may call this method at |
@@ -1377,6 +1384,7 @@ Console.WriteLine("CreateGeom:"); | |||
1377 | { | 1384 | { |
1378 | //Console.WriteLine(" CreateGeom 1"); | 1385 | //Console.WriteLine(" CreateGeom 1"); |
1379 | SetGeom(d.CreateSphere(m_targetSpace, _size.X / 2)); | 1386 | SetGeom(d.CreateSphere(m_targetSpace, _size.X / 2)); |
1387 | m_expectedCollisionContacts = 3; | ||
1380 | } | 1388 | } |
1381 | catch (AccessViolationException) | 1389 | catch (AccessViolationException) |
1382 | { | 1390 | { |
@@ -1391,6 +1399,7 @@ Console.WriteLine("CreateGeom:"); | |||
1391 | { | 1399 | { |
1392 | //Console.WriteLine(" CreateGeom 2"); | 1400 | //Console.WriteLine(" CreateGeom 2"); |
1393 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | 1401 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); |
1402 | m_expectedCollisionContacts = 4; | ||
1394 | } | 1403 | } |
1395 | catch (AccessViolationException) | 1404 | catch (AccessViolationException) |
1396 | { | 1405 | { |
@@ -1406,6 +1415,7 @@ Console.WriteLine("CreateGeom:"); | |||
1406 | { | 1415 | { |
1407 | //Console.WriteLine(" CreateGeom 3"); | 1416 | //Console.WriteLine(" CreateGeom 3"); |
1408 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | 1417 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); |
1418 | m_expectedCollisionContacts = 4; | ||
1409 | } | 1419 | } |
1410 | catch (AccessViolationException) | 1420 | catch (AccessViolationException) |
1411 | { | 1421 | { |
@@ -1421,6 +1431,7 @@ Console.WriteLine("CreateGeom:"); | |||
1421 | { | 1431 | { |
1422 | //Console.WriteLine(" CreateGeom 4"); | 1432 | //Console.WriteLine(" CreateGeom 4"); |
1423 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | 1433 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); |
1434 | m_expectedCollisionContacts = 4; | ||
1424 | } | 1435 | } |
1425 | catch (AccessViolationException) | 1436 | catch (AccessViolationException) |
1426 | { | 1437 | { |
@@ -1446,11 +1457,13 @@ Console.WriteLine("CreateGeom:"); | |||
1446 | _parent_scene.geom_name_map.Remove(prim_geom); | 1457 | _parent_scene.geom_name_map.Remove(prim_geom); |
1447 | _parent_scene.actor_name_map.Remove(prim_geom); | 1458 | _parent_scene.actor_name_map.Remove(prim_geom); |
1448 | d.GeomDestroy(prim_geom); | 1459 | d.GeomDestroy(prim_geom); |
1460 | m_expectedCollisionContacts = 0; | ||
1449 | prim_geom = IntPtr.Zero; | 1461 | prim_geom = IntPtr.Zero; |
1450 | } | 1462 | } |
1451 | catch (System.AccessViolationException) | 1463 | catch (System.AccessViolationException) |
1452 | { | 1464 | { |
1453 | prim_geom = IntPtr.Zero; | 1465 | prim_geom = IntPtr.Zero; |
1466 | m_expectedCollisionContacts = 0; | ||
1454 | m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name); | 1467 | m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name); |
1455 | 1468 | ||
1456 | return false; | 1469 | return false; |
@@ -1489,6 +1502,8 @@ Console.WriteLine("CreateGeom:"); | |||
1489 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical); | 1502 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical); |
1490 | // createmesh returns null when it's a shape that isn't a cube. | 1503 | // createmesh returns null when it's a shape that isn't a cube. |
1491 | // m_log.Debug(m_localID); | 1504 | // m_log.Debug(m_localID); |
1505 | if (mesh == null) | ||
1506 | CheckMeshAsset(); | ||
1492 | } | 1507 | } |
1493 | 1508 | ||
1494 | #if SPAM | 1509 | #if SPAM |
@@ -1988,7 +2003,12 @@ Console.WriteLine(" JointCreateFixed"); | |||
1988 | // Don't need to re-enable body.. it's done in SetMesh | 2003 | // Don't need to re-enable body.. it's done in SetMesh |
1989 | 2004 | ||
1990 | if (_parent_scene.needsMeshing(_pbs)) | 2005 | if (_parent_scene.needsMeshing(_pbs)) |
2006 | { | ||
1991 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); | 2007 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); |
2008 | if (mesh == null) | ||
2009 | CheckMeshAsset(); | ||
2010 | } | ||
2011 | |||
1992 | } | 2012 | } |
1993 | 2013 | ||
1994 | CreateGeom(m_targetSpace, mesh); | 2014 | CreateGeom(m_targetSpace, mesh); |
@@ -2048,6 +2068,8 @@ Console.WriteLine(" JointCreateFixed"); | |||
2048 | /// </summary> | 2068 | /// </summary> |
2049 | private void changeshape() | 2069 | private void changeshape() |
2050 | { | 2070 | { |
2071 | m_taintshape = false; | ||
2072 | |||
2051 | // Cleanup of old prim geometry and Bodies | 2073 | // Cleanup of old prim geometry and Bodies |
2052 | if (IsPhysical && Body != IntPtr.Zero) | 2074 | if (IsPhysical && Body != IntPtr.Zero) |
2053 | { | 2075 | { |
@@ -2075,6 +2097,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
2075 | 2097 | ||
2076 | IMesh mesh = null; | 2098 | IMesh mesh = null; |
2077 | 2099 | ||
2100 | |||
2078 | if (_parent_scene.needsMeshing(_pbs)) | 2101 | if (_parent_scene.needsMeshing(_pbs)) |
2079 | { | 2102 | { |
2080 | // Don't need to re-enable body.. it's done in CreateMesh | 2103 | // Don't need to re-enable body.. it's done in CreateMesh |
@@ -2085,6 +2108,8 @@ Console.WriteLine(" JointCreateFixed"); | |||
2085 | 2108 | ||
2086 | // createmesh returns null when it doesn't mesh. | 2109 | // createmesh returns null when it doesn't mesh. |
2087 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); | 2110 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); |
2111 | if (mesh == null) | ||
2112 | CheckMeshAsset(); | ||
2088 | } | 2113 | } |
2089 | 2114 | ||
2090 | CreateGeom(m_targetSpace, mesh); | 2115 | CreateGeom(m_targetSpace, mesh); |
@@ -2121,7 +2146,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
2121 | } | 2146 | } |
2122 | 2147 | ||
2123 | resetCollisionAccounting(); | 2148 | resetCollisionAccounting(); |
2124 | m_taintshape = false; | 2149 | // m_taintshape = false; |
2125 | } | 2150 | } |
2126 | 2151 | ||
2127 | /// <summary> | 2152 | /// <summary> |
@@ -2387,6 +2412,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
2387 | set | 2412 | set |
2388 | { | 2413 | { |
2389 | _pbs = value; | 2414 | _pbs = value; |
2415 | m_assetFailed = false; | ||
2390 | m_taintshape = true; | 2416 | m_taintshape = true; |
2391 | } | 2417 | } |
2392 | } | 2418 | } |
@@ -2395,15 +2421,15 @@ Console.WriteLine(" JointCreateFixed"); | |||
2395 | { | 2421 | { |
2396 | get | 2422 | get |
2397 | { | 2423 | { |
2398 | // Averate previous velocity with the new one so | 2424 | // Average previous velocity with the new one so |
2399 | // client object interpolation works a 'little' better | 2425 | // client object interpolation works a 'little' better |
2400 | if (_zeroFlag) | 2426 | if (_zeroFlag) |
2401 | return Vector3.Zero; | 2427 | return Vector3.Zero; |
2402 | 2428 | ||
2403 | Vector3 returnVelocity = Vector3.Zero; | 2429 | Vector3 returnVelocity = Vector3.Zero; |
2404 | returnVelocity.X = (m_lastVelocity.X + _velocity.X)/2; | 2430 | returnVelocity.X = (m_lastVelocity.X + _velocity.X) * 0.5f; // 0.5f is mathematically equiv to '/ 2' |
2405 | returnVelocity.Y = (m_lastVelocity.Y + _velocity.Y)/2; | 2431 | returnVelocity.Y = (m_lastVelocity.Y + _velocity.Y) * 0.5f; |
2406 | returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z)/2; | 2432 | returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z) * 0.5f; |
2407 | return returnVelocity; | 2433 | return returnVelocity; |
2408 | } | 2434 | } |
2409 | set | 2435 | set |
@@ -2600,6 +2626,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
2600 | { | 2626 | { |
2601 | Vector3 pv = Vector3.Zero; | 2627 | Vector3 pv = Vector3.Zero; |
2602 | bool lastZeroFlag = _zeroFlag; | 2628 | bool lastZeroFlag = _zeroFlag; |
2629 | float m_minvelocity = 0; | ||
2603 | if (Body != (IntPtr)0) // FIXME -> or if it is a joint | 2630 | if (Body != (IntPtr)0) // FIXME -> or if it is a joint |
2604 | { | 2631 | { |
2605 | d.Vector3 vec = d.BodyGetPosition(Body); | 2632 | d.Vector3 vec = d.BodyGetPosition(Body); |
@@ -2752,8 +2779,21 @@ Console.WriteLine(" JointCreateFixed"); | |||
2752 | _acceleration = ((_velocity - m_lastVelocity) / 0.1f); | 2779 | _acceleration = ((_velocity - m_lastVelocity) / 0.1f); |
2753 | _acceleration = new Vector3(_velocity.X - m_lastVelocity.X / 0.1f, _velocity.Y - m_lastVelocity.Y / 0.1f, _velocity.Z - m_lastVelocity.Z / 0.1f); | 2780 | _acceleration = new Vector3(_velocity.X - m_lastVelocity.X / 0.1f, _velocity.Y - m_lastVelocity.Y / 0.1f, _velocity.Z - m_lastVelocity.Z / 0.1f); |
2754 | //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); | 2781 | //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); |
2782 | |||
2783 | // Note here that linearvelocity is affecting angular velocity... so I'm guessing this is a vehicle specific thing... | ||
2784 | // it does make sense to do this for tiny little instabilities with physical prim, however 0.5m/frame is fairly large. | ||
2785 | // reducing this to 0.02m/frame seems to help the angular rubberbanding quite a bit, however, to make sure it doesn't affect elevators and vehicles | ||
2786 | // adding these logical exclusion situations to maintain this where I think it was intended to be. | ||
2787 | if (m_throttleUpdates || m_usePID || (m_vehicle != null && m_vehicle.Type != Vehicle.TYPE_NONE) || (Amotor != IntPtr.Zero)) | ||
2788 | { | ||
2789 | m_minvelocity = 0.5f; | ||
2790 | } | ||
2791 | else | ||
2792 | { | ||
2793 | m_minvelocity = 0.02f; | ||
2794 | } | ||
2755 | 2795 | ||
2756 | if (_velocity.ApproxEquals(pv, 0.5f)) | 2796 | if (_velocity.ApproxEquals(pv, m_minvelocity)) |
2757 | { | 2797 | { |
2758 | m_rotationalVelocity = pv; | 2798 | m_rotationalVelocity = pv; |
2759 | } | 2799 | } |
@@ -3211,5 +3251,37 @@ Console.WriteLine(" JointCreateFixed"); | |||
3211 | { | 3251 | { |
3212 | m_material = pMaterial; | 3252 | m_material = pMaterial; |
3213 | } | 3253 | } |
3254 | |||
3255 | |||
3256 | private void CheckMeshAsset() | ||
3257 | { | ||
3258 | if (_pbs.SculptEntry && !m_assetFailed && _pbs.SculptTexture != UUID.Zero) | ||
3259 | { | ||
3260 | m_assetFailed = true; | ||
3261 | Util.FireAndForget(delegate | ||
3262 | { | ||
3263 | RequestAssetDelegate assetProvider = _parent_scene.RequestAssetMethod; | ||
3264 | if (assetProvider != null) | ||
3265 | assetProvider(_pbs.SculptTexture, MeshAssetReveived); | ||
3266 | }); | ||
3267 | } | ||
3268 | } | ||
3269 | |||
3270 | void MeshAssetReveived(AssetBase asset) | ||
3271 | { | ||
3272 | if (asset.Data != null && asset.Data.Length > 0) | ||
3273 | { | ||
3274 | if (!_pbs.SculptEntry) | ||
3275 | return; | ||
3276 | if (_pbs.SculptTexture.ToString() != asset.ID) | ||
3277 | return; | ||
3278 | |||
3279 | _pbs.SculptData = new byte[asset.Data.Length]; | ||
3280 | asset.Data.CopyTo(_pbs.SculptData, 0); | ||
3281 | m_assetFailed = false; | ||
3282 | m_taintshape = true; | ||
3283 | _parent_scene.AddPhysicsActorTaint(this); | ||
3284 | } | ||
3285 | } | ||
3214 | } | 3286 | } |
3215 | } \ No newline at end of file | 3287 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs b/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs index 7e3ec63..8d7d3b3 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs | |||
@@ -137,15 +137,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
137 | ODERayCastRequest[] reqs = m_PendingRequests.ToArray(); | 137 | ODERayCastRequest[] reqs = m_PendingRequests.ToArray(); |
138 | for (int i = 0; i < reqs.Length; i++) | 138 | for (int i = 0; i < reqs.Length; i++) |
139 | { | 139 | { |
140 | try | 140 | if (reqs[i].callbackMethod != null) // quick optimization here, don't raycast |
141 | { | 141 | RayCast(reqs[i]); // if there isn't anyone to send results |
142 | if (reqs[i].callbackMethod != null) // quick optimization here, don't raycast | ||
143 | RayCast(reqs[i]); // if there isn't anyone to send results | ||
144 | } | ||
145 | catch | ||
146 | { | ||
147 | //Fail silently | ||
148 | } | ||
149 | } | 142 | } |
150 | 143 | ||
151 | m_PendingRequests.Clear(); | 144 | m_PendingRequests.Clear(); |
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 929b019..7a50c4c 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs | |||
@@ -336,6 +336,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
336 | 336 | ||
337 | public int geomContactPointsStartthrottle = 3; | 337 | public int geomContactPointsStartthrottle = 3; |
338 | public int geomUpdatesPerThrottledUpdate = 15; | 338 | public int geomUpdatesPerThrottledUpdate = 15; |
339 | private const int avatarExpectedContacts = 3; | ||
339 | 340 | ||
340 | public float bodyPIDD = 35f; | 341 | public float bodyPIDD = 35f; |
341 | public float bodyPIDG = 25; | 342 | public float bodyPIDG = 25; |
@@ -474,6 +475,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
474 | private OdePrim cp1; | 475 | private OdePrim cp1; |
475 | private OdeCharacter cc2; | 476 | private OdeCharacter cc2; |
476 | private OdePrim cp2; | 477 | private OdePrim cp2; |
478 | private int p1ExpectedPoints = 0; | ||
479 | private int p2ExpectedPoints = 0; | ||
477 | //private int cStartStop = 0; | 480 | //private int cStartStop = 0; |
478 | //private string cDictKey = ""; | 481 | //private string cDictKey = ""; |
479 | 482 | ||
@@ -498,6 +501,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
498 | public int physics_logging_interval = 0; | 501 | public int physics_logging_interval = 0; |
499 | public bool physics_logging_append_existing_logfile = false; | 502 | public bool physics_logging_append_existing_logfile = false; |
500 | 503 | ||
504 | |||
501 | public d.Vector3 xyz = new d.Vector3(128.1640f, 128.3079f, 25.7600f); | 505 | public d.Vector3 xyz = new d.Vector3(128.1640f, 128.3079f, 25.7600f); |
502 | public d.Vector3 hpr = new d.Vector3(125.5000f, -17.0000f, 0.0000f); | 506 | public d.Vector3 hpr = new d.Vector3(125.5000f, -17.0000f, 0.0000f); |
503 | 507 | ||
@@ -644,7 +648,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
644 | 648 | ||
645 | contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); | 649 | contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); |
646 | 650 | ||
647 | geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); | 651 | geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 5); |
648 | geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); | 652 | geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); |
649 | geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); | 653 | geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); |
650 | 654 | ||
@@ -1064,7 +1068,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1064 | 1068 | ||
1065 | PhysicsActor p1; | 1069 | PhysicsActor p1; |
1066 | PhysicsActor p2; | 1070 | PhysicsActor p2; |
1067 | 1071 | ||
1072 | p1ExpectedPoints = 0; | ||
1073 | p2ExpectedPoints = 0; | ||
1074 | |||
1068 | if (!actor_name_map.TryGetValue(g1, out p1)) | 1075 | if (!actor_name_map.TryGetValue(g1, out p1)) |
1069 | { | 1076 | { |
1070 | p1 = PANull; | 1077 | p1 = PANull; |
@@ -1121,9 +1128,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1121 | switch (p1.PhysicsActorType) | 1128 | switch (p1.PhysicsActorType) |
1122 | { | 1129 | { |
1123 | case (int)ActorTypes.Agent: | 1130 | case (int)ActorTypes.Agent: |
1131 | p1ExpectedPoints = avatarExpectedContacts; | ||
1124 | p2.CollidingObj = true; | 1132 | p2.CollidingObj = true; |
1125 | break; | 1133 | break; |
1126 | case (int)ActorTypes.Prim: | 1134 | case (int)ActorTypes.Prim: |
1135 | if (p1 != null && p1 is OdePrim) | ||
1136 | p1ExpectedPoints = ((OdePrim) p1).ExpectedCollisionContacts; | ||
1137 | |||
1127 | if (p2.Velocity.LengthSquared() > 0.0f) | 1138 | if (p2.Velocity.LengthSquared() > 0.0f) |
1128 | p2.CollidingObj = true; | 1139 | p2.CollidingObj = true; |
1129 | break; | 1140 | break; |
@@ -1319,6 +1330,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1319 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && | 1330 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && |
1320 | (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | 1331 | (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) |
1321 | { | 1332 | { |
1333 | p2ExpectedPoints = avatarExpectedContacts; | ||
1322 | // Avatar is moving on terrain, use the movement terrain contact | 1334 | // Avatar is moving on terrain, use the movement terrain contact |
1323 | AvatarMovementTerrainContact.geom = curContact; | 1335 | AvatarMovementTerrainContact.geom = curContact; |
1324 | 1336 | ||
@@ -1332,6 +1344,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1332 | { | 1344 | { |
1333 | if (p2.PhysicsActorType == (int)ActorTypes.Agent) | 1345 | if (p2.PhysicsActorType == (int)ActorTypes.Agent) |
1334 | { | 1346 | { |
1347 | p2ExpectedPoints = avatarExpectedContacts; | ||
1335 | // Avatar is standing on terrain, use the non moving terrain contact | 1348 | // Avatar is standing on terrain, use the non moving terrain contact |
1336 | TerrainContact.geom = curContact; | 1349 | TerrainContact.geom = curContact; |
1337 | 1350 | ||
@@ -1356,9 +1369,18 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1356 | } | 1369 | } |
1357 | 1370 | ||
1358 | if (p2 is OdePrim) | 1371 | if (p2 is OdePrim) |
1359 | material = ((OdePrim)p2).m_material; | 1372 | { |
1360 | 1373 | material = ((OdePrim) p2).m_material; | |
1374 | p2ExpectedPoints = ((OdePrim)p2).ExpectedCollisionContacts; | ||
1375 | } | ||
1376 | |||
1377 | // Unnessesary because p1 is defined above | ||
1378 | //if (p1 is OdePrim) | ||
1379 | // { | ||
1380 | // p1ExpectedPoints = ((OdePrim)p1).ExpectedCollisionContacts; | ||
1381 | // } | ||
1361 | //m_log.DebugFormat("Material: {0}", material); | 1382 | //m_log.DebugFormat("Material: {0}", material); |
1383 | |||
1362 | m_materialContacts[material, movintYN].geom = curContact; | 1384 | m_materialContacts[material, movintYN].geom = curContact; |
1363 | 1385 | ||
1364 | if (m_global_contactcount < maxContactsbeforedeath) | 1386 | if (m_global_contactcount < maxContactsbeforedeath) |
@@ -1379,7 +1401,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1379 | int material = (int)Material.Wood; | 1401 | int material = (int)Material.Wood; |
1380 | 1402 | ||
1381 | if (p2 is OdePrim) | 1403 | if (p2 is OdePrim) |
1404 | { | ||
1382 | material = ((OdePrim)p2).m_material; | 1405 | material = ((OdePrim)p2).m_material; |
1406 | p2ExpectedPoints = ((OdePrim)p2).ExpectedCollisionContacts; | ||
1407 | } | ||
1383 | 1408 | ||
1384 | //m_log.DebugFormat("Material: {0}", material); | 1409 | //m_log.DebugFormat("Material: {0}", material); |
1385 | m_materialContacts[material, movintYN].geom = curContact; | 1410 | m_materialContacts[material, movintYN].geom = curContact; |
@@ -1429,6 +1454,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1429 | { | 1454 | { |
1430 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent)) | 1455 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent)) |
1431 | { | 1456 | { |
1457 | p2ExpectedPoints = avatarExpectedContacts; | ||
1432 | if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | 1458 | if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) |
1433 | { | 1459 | { |
1434 | // Avatar is moving on a prim, use the Movement prim contact | 1460 | // Avatar is moving on a prim, use the Movement prim contact |
@@ -1458,7 +1484,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1458 | int material = (int)Material.Wood; | 1484 | int material = (int)Material.Wood; |
1459 | 1485 | ||
1460 | if (p2 is OdePrim) | 1486 | if (p2 is OdePrim) |
1487 | { | ||
1461 | material = ((OdePrim)p2).m_material; | 1488 | material = ((OdePrim)p2).m_material; |
1489 | p2ExpectedPoints = ((OdePrim)p2).ExpectedCollisionContacts; | ||
1490 | } | ||
1462 | 1491 | ||
1463 | //m_log.DebugFormat("Material: {0}", material); | 1492 | //m_log.DebugFormat("Material: {0}", material); |
1464 | m_materialContacts[material, 0].geom = curContact; | 1493 | m_materialContacts[material, 0].geom = curContact; |
@@ -1479,8 +1508,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1479 | } | 1508 | } |
1480 | 1509 | ||
1481 | collision_accounting_events(p1, p2, maxDepthContact); | 1510 | collision_accounting_events(p1, p2, maxDepthContact); |
1482 | 1511 | ||
1483 | if (count > geomContactPointsStartthrottle) | 1512 | if (count > ((p1ExpectedPoints + p2ExpectedPoints) * 0.25) + (geomContactPointsStartthrottle)) |
1484 | { | 1513 | { |
1485 | // If there are more then 3 contact points, it's likely | 1514 | // If there are more then 3 contact points, it's likely |
1486 | // that we've got a pile of objects, so ... | 1515 | // that we've got a pile of objects, so ... |