diff options
Diffstat (limited to 'OpenSim/Region/Physics')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 129 |
2 files changed, 75 insertions, 56 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 3adf773..179160f 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -739,7 +739,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
739 | } | 739 | } |
740 | else | 740 | else |
741 | { | 741 | { |
742 | m_log.Error("[PHYISCS]: The scene reused a disposed PhysActor! *waves finger*, Don't be evil."); | 742 | m_log.Error("[PHYSICS]: The scene reused a disposed PhysActor! *waves finger*, Don't be evil."); |
743 | } | 743 | } |
744 | } | 744 | } |
745 | 745 | ||
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index fc71802..df3555f 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -119,7 +119,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
119 | private List<OdePrim> _taintedPrim = new List<OdePrim>(); | 119 | private List<OdePrim> _taintedPrim = new List<OdePrim>(); |
120 | public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); | 120 | public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); |
121 | public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); | 121 | public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); |
122 | private d.ContactGeom[] contacts = new d.ContactGeom[30]; | 122 | private d.ContactGeom[] contacts = new d.ContactGeom[80]; |
123 | private d.Contact contact; | 123 | private d.Contact contact; |
124 | private d.Contact TerrainContact; | 124 | private d.Contact TerrainContact; |
125 | private d.Contact AvatarMovementprimContact; | 125 | private d.Contact AvatarMovementprimContact; |
@@ -291,24 +291,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
291 | //if (d.GeomIsSpace(g2)) d.SpaceCollide(g2, IntPtr.Zero, nearCallback); | 291 | //if (d.GeomIsSpace(g2)) d.SpaceCollide(g2, IntPtr.Zero, nearCallback); |
292 | return; | 292 | return; |
293 | } | 293 | } |
294 | 294 | ||
295 | 295 | ||
296 | // Colliding Geom To Geom | ||
297 | // This portion of the function 'was' blatantly ripped off from BoxStack.cs | ||
298 | if (g1 == (IntPtr)0 || g2 == (IntPtr)0) | 296 | if (g1 == (IntPtr)0 || g2 == (IntPtr)0) |
299 | return; | 297 | return; |
300 | 298 | ||
301 | IntPtr b1 = d.GeomGetBody(g1); | 299 | IntPtr b1 = d.GeomGetBody(g1); |
302 | IntPtr b2 = d.GeomGetBody(g2); | 300 | IntPtr b2 = d.GeomGetBody(g2); |
303 | 301 | ||
304 | if (g1 == g2) | ||
305 | return; // Can't collide with yourself | ||
306 | |||
307 | if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) | ||
308 | return; | ||
309 | |||
310 | |||
311 | |||
312 | d.GeomClassID id = d.GeomGetClass(g1); | 302 | d.GeomClassID id = d.GeomGetClass(g1); |
313 | 303 | ||
314 | String name1 = null; | 304 | String name1 = null; |
@@ -334,7 +324,27 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
334 | try | 324 | try |
335 | { | 325 | { |
336 | //m_log.Warn(g1.ToString() + "|" + g2.ToString()); | 326 | //m_log.Warn(g1.ToString() + "|" + g2.ToString()); |
337 | count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf); | 327 | // Colliding Geom To Geom |
328 | // This portion of the function 'was' blatantly ripped off from BoxStack.cs | ||
329 | |||
330 | |||
331 | |||
332 | |||
333 | if (g1 == g2) | ||
334 | return; // Can't collide with yourself | ||
335 | |||
336 | if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) | ||
337 | return; | ||
338 | |||
339 | lock (contacts) | ||
340 | { | ||
341 | if (g1 == (IntPtr)0) | ||
342 | m_log.Info("g1=0"); | ||
343 | if (g2 == (IntPtr)0) | ||
344 | m_log.Info("g2=0"); | ||
345 | |||
346 | count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf); | ||
347 | } | ||
338 | } | 348 | } |
339 | catch (SEHException) | 349 | catch (SEHException) |
340 | { | 350 | { |
@@ -686,48 +696,56 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
686 | // don't process collision for prim! | 696 | // don't process collision for prim! |
687 | if (timeStep < (m_SkipFramesAtms/3)) | 697 | if (timeStep < (m_SkipFramesAtms/3)) |
688 | { | 698 | { |
689 | foreach (OdePrim chr in _activeprims) | 699 | lock (_activeprims) |
690 | { | 700 | { |
691 | // This if may not need to be there.. it might be skipped anyway. | 701 | |
692 | if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled)) | 702 | foreach (OdePrim chr in _activeprims) |
693 | { | 703 | { |
694 | try | 704 | // This if may not need to be there.. it might be skipped anyway. |
705 | if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled)) | ||
695 | { | 706 | { |
696 | 707 | try | |
697 | d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); | 708 | { |
698 | 709 | lock (chr) | |
710 | { | ||
711 | if (space != (IntPtr)0 && chr.prim_geom != (IntPtr)0) | ||
712 | d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); | ||
713 | } | ||
714 | |||
715 | } | ||
716 | catch (AccessViolationException) | ||
717 | { | ||
718 | m_log.Warn("[PHYSICS]: Unable to space collide"); | ||
719 | } | ||
720 | //calculateSpaceForGeom(chr.Position) | ||
721 | //foreach (OdePrim ch2 in _prims) | ||
722 | /// should be a separate space -- lots of avatars will be N**2 slow | ||
723 | //{ | ||
724 | //if (ch2.IsPhysical && d.BodyIsEnabled(ch2.Body)) | ||
725 | //{ | ||
726 | // Only test prim that are 0.03 meters away in one direction. | ||
727 | // This should be Optimized! | ||
728 | |||
729 | //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)) | ||
730 | //{ | ||
731 | //d.SpaceCollide2(chr.prim_geom, ch2.prim_geom, IntPtr.Zero, nearCallback); | ||
732 | //} | ||
733 | //} | ||
734 | //} | ||
699 | } | 735 | } |
700 | catch (AccessViolationException) | 736 | try |
701 | { | 737 | { |
702 | m_log.Warn("[PHYSICS]: Unable to space collide"); | 738 | lock (chr) |
739 | { | ||
740 | if (LandGeom != (IntPtr)0 && chr.prim_geom != (IntPtr)0) | ||
741 | d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback); | ||
742 | } | ||
703 | } | 743 | } |
704 | //calculateSpaceForGeom(chr.Position) | 744 | catch (AccessViolationException) |
705 | //foreach (OdePrim ch2 in _prims) | ||
706 | /// should be a separate space -- lots of avatars will be N**2 slow | ||
707 | //{ | ||
708 | //if (ch2.IsPhysical && d.BodyIsEnabled(ch2.Body)) | ||
709 | //{ | ||
710 | // Only test prim that are 0.03 meters away in one direction. | ||
711 | // This should be Optimized! | ||
712 | |||
713 | //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)) | ||
714 | //{ | ||
715 | //d.SpaceCollide2(chr.prim_geom, ch2.prim_geom, IntPtr.Zero, nearCallback); | ||
716 | //} | ||
717 | //} | ||
718 | //} | ||
719 | } | ||
720 | try | ||
721 | { | ||
722 | lock (chr) | ||
723 | { | 745 | { |
724 | d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback); | 746 | m_log.Warn("[PHYSICS]: Unable to space collide"); |
725 | } | 747 | } |
726 | } | 748 | } |
727 | catch (AccessViolationException) | ||
728 | { | ||
729 | m_log.Warn("[PHYSICS]: Unable to space collide"); | ||
730 | } | ||
731 | } | 749 | } |
732 | } | 750 | } |
733 | else | 751 | else |
@@ -1015,11 +1033,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1015 | System.Threading.Thread.Sleep(20); | 1033 | System.Threading.Thread.Sleep(20); |
1016 | if (currentspace != space) | 1034 | if (currentspace != space) |
1017 | { | 1035 | { |
1018 | m_log.Info("[SPACE]: C:" + currentspace.ToString() + " g:" + geom.ToString()); | 1036 | //m_log.Info("[SPACE]: C:" + currentspace.ToString() + " g:" + geom.ToString()); |
1019 | if (currentspace == (IntPtr) 0) | 1037 | //if (currentspace == (IntPtr) 0) |
1020 | { | 1038 | //{ |
1021 | int adfadf = 0; | 1039 | //int adfadf = 0; |
1022 | } | 1040 | //} |
1023 | if (d.SpaceQuery(currentspace, geom) && currentspace != (IntPtr) 0) | 1041 | if (d.SpaceQuery(currentspace, geom) && currentspace != (IntPtr) 0) |
1024 | { | 1042 | { |
1025 | if (d.GeomIsSpace(currentspace)) | 1043 | if (d.GeomIsSpace(currentspace)) |
@@ -1328,9 +1346,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1328 | { | 1346 | { |
1329 | RemovePrimThreadLocked(prim); | 1347 | RemovePrimThreadLocked(prim); |
1330 | } | 1348 | } |
1331 | 1349 | else | |
1332 | prim.ProcessTaints(timeStep); | 1350 | { |
1333 | 1351 | prim.ProcessTaints(timeStep); | |
1352 | } | ||
1334 | processedtaints = true; | 1353 | processedtaints = true; |
1335 | prim.m_collisionscore = 0; | 1354 | prim.m_collisionscore = 0; |
1336 | } | 1355 | } |