diff options
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/OdePlugin.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 94 |
1 files changed, 23 insertions, 71 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index c346960..02b5628 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -377,7 +377,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
377 | int count = 0; | 377 | int count = 0; |
378 | try | 378 | try |
379 | { | 379 | { |
380 | //m_log.Warn(g1.ToString() + "|" + g2.ToString()); | 380 | |
381 | // Colliding Geom To Geom | 381 | // Colliding Geom To Geom |
382 | // This portion of the function 'was' blatantly ripped off from BoxStack.cs | 382 | // This portion of the function 'was' blatantly ripped off from BoxStack.cs |
383 | 383 | ||
@@ -392,10 +392,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
392 | 392 | ||
393 | lock (contacts) | 393 | lock (contacts) |
394 | { | 394 | { |
395 | //if (g1 == (IntPtr)0) | 395 | |
396 | //m_log.Info("g1=0"); | ||
397 | //if (g2 == (IntPtr)0) | ||
398 | //m_log.Info("g2=0"); | ||
399 | 396 | ||
400 | count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf); | 397 | count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf); |
401 | } | 398 | } |
@@ -435,8 +432,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
435 | // We only need to test p2 for 'jump crouch purposes' | 432 | // We only need to test p2 for 'jump crouch purposes' |
436 | p2.IsColliding = true; | 433 | p2.IsColliding = true; |
437 | 434 | ||
438 | if ((framecount % m_returncollisions) == 0) | 435 | //if ((framecount % m_returncollisions) == 0) |
439 | collision_accounting_events(p1, p2); | 436 | //collision_accounting_events(p1, p2); |
440 | 437 | ||
441 | 438 | ||
442 | switch (p1.PhysicsActorType) | 439 | switch (p1.PhysicsActorType) |
@@ -903,16 +900,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
903 | } | 900 | } |
904 | 901 | ||
905 | 902 | ||
906 | // If the sim is running slow this frame, | 903 | |
907 | // don't process collision for prim! | ||
908 | //if (timeStep < (m_SkipFramesAtms/3)) | ||
909 | //{ | ||
910 | lock (_activeprims) | 904 | lock (_activeprims) |
911 | { | 905 | { |
912 | 906 | ||
913 | foreach (OdePrim chr in _activeprims) | 907 | foreach (OdePrim chr in _activeprims) |
914 | { | 908 | { |
915 | // This if may not need to be there.. it might be skipped anyway. | 909 | |
916 | if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled)) | 910 | if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled)) |
917 | { | 911 | { |
918 | try | 912 | try |
@@ -921,6 +915,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
921 | { | 915 | { |
922 | if (space != (IntPtr)0 && chr.prim_geom != (IntPtr)0 && chr.m_taintremove == false) | 916 | if (space != (IntPtr)0 && chr.prim_geom != (IntPtr)0 && chr.m_taintremove == false) |
923 | d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); | 917 | d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); |
918 | else | ||
919 | m_log.Debug("[PHYSICS]: unable to collide test active prim against space. The space was zero, the geom was zero or it was in the process of being removed"); | ||
924 | } | 920 | } |
925 | 921 | ||
926 | } | 922 | } |
@@ -928,57 +924,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
928 | { | 924 | { |
929 | m_log.Warn("[PHYSICS]: Unable to space collide"); | 925 | m_log.Warn("[PHYSICS]: Unable to space collide"); |
930 | } | 926 | } |
931 | //calculateSpaceForGeom(chr.Position) | 927 | |
932 | //foreach (OdePrim ch2 in _prims) | ||
933 | /// should be a separate space -- lots of avatars will be N**2 slow | ||
934 | //{ | ||
935 | //if (ch2.IsPhysical && d.BodyIsEnabled(ch2.Body)) | ||
936 | //{ | ||
937 | // Only test prim that are 0.03 meters away in one direction. | ||
938 | // This should be Optimized! | ||
939 | |||
940 | //if ((Math.Abs(ch2.Position.X - chr.Position.X) < 0.03) || (Math.Abs(ch2.Position.Y - chr.Position.Y) < 0.03) || (Math.Abs(ch2.Position.X - chr.Position.X) < 0.03)) | ||
941 | //{ | ||
942 | //d.SpaceCollide2(chr.prim_geom, ch2.prim_geom, IntPtr.Zero, nearCallback); | ||
943 | //} | ||
944 | //} | ||
945 | //} | ||
946 | } | 928 | } |
947 | //try | 929 | |
948 | //{ | ||
949 | //lock (chr) | ||
950 | //{ | ||
951 | //if (LandGeom != (IntPtr)0 && chr.prim_geom != (IntPtr)0) | ||
952 | //d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback); | ||
953 | //} | ||
954 | //} | ||
955 | //catch (AccessViolationException) | ||
956 | // { | ||
957 | //m_log.Warn("[PHYSICS]: Unable to space collide"); | ||
958 | //} | ||
959 | } | 930 | } |
960 | } | 931 | } |
961 | #region disabled code | 932 | |
962 | //} | ||
963 | //else | ||
964 | //{ | ||
965 | // Everything is going slow, so we're skipping object to object collisions | ||
966 | // At least collide test against the ground. | ||
967 | //foreach (OdePrim chr in _activeprims) | ||
968 | //{ | ||
969 | // This if may not need to be there.. it might be skipped anyway. | ||
970 | //if (d.BodyIsEnabled(chr.Body)) | ||
971 | //{ | ||
972 | // Collide test the prims with the terrain.. since if you don't do this, | ||
973 | // next frame, all of the physical prim in the scene will awaken and explode upwards | ||
974 | //tmpSpace = calculateSpaceForGeom(chr.Position); | ||
975 | //if (tmpSpace != (IntPtr) 0 && d.GeomIsSpace(tmpSpace)) | ||
976 | //d.SpaceCollide2(calculateSpaceForGeom(chr.Position), chr.prim_geom, IntPtr.Zero, nearCallback); | ||
977 | //d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback); | ||
978 | //} | ||
979 | //} | ||
980 | //} | ||
981 | #endregion | ||
982 | } | 933 | } |
983 | 934 | ||
984 | #endregion | 935 | #endregion |
@@ -1006,6 +957,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1006 | { | 957 | { |
1007 | lock (OdeLock) | 958 | lock (OdeLock) |
1008 | { | 959 | { |
960 | m_log.Debug("[PHYSICS]:ODELOCK"); | ||
1009 | ((OdeCharacter) actor).Destroy(); | 961 | ((OdeCharacter) actor).Destroy(); |
1010 | _characters.Remove((OdeCharacter) actor); | 962 | _characters.Remove((OdeCharacter) actor); |
1011 | } | 963 | } |
@@ -1524,16 +1476,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1524 | { | 1476 | { |
1525 | // Process 10 frames if the sim is running normal.. | 1477 | // Process 10 frames if the sim is running normal.. |
1526 | // process 5 frames if the sim is running slow | 1478 | // process 5 frames if the sim is running slow |
1527 | try | 1479 | //try |
1528 | { | 1480 | //{ |
1529 | d.WorldSetQuickStepNumIterations(world, m_physicsiterations); | 1481 | //d.WorldSetQuickStepNumIterations(world, m_physicsiterations); |
1530 | } | 1482 | //} |
1531 | catch (StackOverflowException) | 1483 | //catch (StackOverflowException) |
1532 | { | 1484 | //{ |
1533 | m_log.Error("[PHYSICS]: The operating system wasn't able to allocate enough memory for the simulation. Restarting the sim."); | 1485 | // m_log.Error("[PHYSICS]: The operating system wasn't able to allocate enough memory for the simulation. Restarting the sim."); |
1534 | ode.drelease(world); | 1486 | // ode.drelease(world); |
1535 | base.TriggerPhysicsBasedRestart(); | 1487 | //base.TriggerPhysicsBasedRestart(); |
1536 | } | 1488 | //} |
1537 | 1489 | ||
1538 | int i = 0; | 1490 | int i = 0; |
1539 | 1491 | ||
@@ -1602,7 +1554,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1602 | d.WorldQuickStep(world, ODE_STEPSIZE); | 1554 | d.WorldQuickStep(world, ODE_STEPSIZE); |
1603 | 1555 | ||
1604 | d.JointGroupEmpty(contactgroup); | 1556 | d.JointGroupEmpty(contactgroup); |
1605 | ode.dunlock(world); | 1557 | //ode.dunlock(world); |
1606 | } | 1558 | } |
1607 | catch (Exception e) | 1559 | catch (Exception e) |
1608 | { | 1560 | { |