diff options
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/OdePlugin.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 129 |
1 files changed, 75 insertions, 54 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index f934341..9392192 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -596,7 +596,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
596 | /// <param name="timeStep"></param> | 596 | /// <param name="timeStep"></param> |
597 | private void collision_optimized(float timeStep) | 597 | private void collision_optimized(float timeStep) |
598 | { | 598 | { |
599 | starttiming(); | 599 | |
600 | foreach (OdeCharacter chr in _characters) | 600 | foreach (OdeCharacter chr in _characters) |
601 | { | 601 | { |
602 | // Reset the collision values to false | 602 | // Reset the collision values to false |
@@ -626,7 +626,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
626 | //forcedZ = true; | 626 | //forcedZ = true; |
627 | //} | 627 | //} |
628 | } | 628 | } |
629 | int avms = stoptiming(); | 629 | |
630 | 630 | ||
631 | // If the sim is running slow this frame, | 631 | // If the sim is running slow this frame, |
632 | // don't process collision for prim! | 632 | // don't process collision for prim! |
@@ -719,8 +719,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
719 | { | 719 | { |
720 | OdePrim p = (OdePrim) prim; | 720 | OdePrim p = (OdePrim) prim; |
721 | 721 | ||
722 | p.setPrimForRemoval(); | 722 | //p.setPrimForRemoval(); |
723 | AddPhysicsActorTaint(prim); | 723 | //AddPhysicsActorTaint(prim); |
724 | RemovePrimThreadLocked(p); | ||
724 | } | 725 | } |
725 | } | 726 | } |
726 | } | 727 | } |
@@ -736,10 +737,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
736 | /// <param name="prim"></param> | 737 | /// <param name="prim"></param> |
737 | public void RemovePrimThreadLocked(OdePrim prim) | 738 | public void RemovePrimThreadLocked(OdePrim prim) |
738 | { | 739 | { |
739 | prim.ResetTaints(); | 740 | while (ode.lockquery()) |
740 | lock (OdeLock) | ||
741 | { | 741 | { |
742 | System.Threading.Thread.Sleep(20); | 742 | } |
743 | ode.dlock(world); | ||
744 | //System.Threading.Thread.Sleep(20); | ||
745 | prim.ResetTaints(); | ||
746 | |||
747 | |||
743 | if (prim.IsPhysical) | 748 | if (prim.IsPhysical) |
744 | { | 749 | { |
745 | prim.disableBody(); | 750 | prim.disableBody(); |
@@ -748,27 +753,38 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
748 | if (prim.m_targetSpace != space && prim.IsPhysical == false) | 753 | if (prim.m_targetSpace != space && prim.IsPhysical == false) |
749 | { | 754 | { |
750 | // If the geometry is in the targetspace, remove it from the target space | 755 | // If the geometry is in the targetspace, remove it from the target space |
751 | if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom)) | 756 | //m_log.Warn(prim.m_targetSpace); |
757 | if (prim.prim_geom == (IntPtr)0) | ||
758 | prim.prim_geom = prim.prev_geom; | ||
759 | |||
760 | if (prim.m_targetSpace != (IntPtr)0) | ||
752 | { | 761 | { |
753 | if (!(prim.m_targetSpace.Equals(null))) | 762 | if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom)) |
754 | { | 763 | { |
755 | 764 | ||
756 | if (d.GeomIsSpace(prim.m_targetSpace)) | 765 | if (d.GeomIsSpace(prim.m_targetSpace)) |
757 | { | 766 | { |
758 | waitForSpaceUnlock(prim.m_targetSpace); | 767 | waitForSpaceUnlock(prim.m_targetSpace); |
759 | d.SpaceRemove(prim.m_targetSpace, prim.prim_geom); | 768 | d.SpaceRemove(prim.m_targetSpace, prim.prim_geom); |
769 | prim.m_targetSpace = space; | ||
760 | } | 770 | } |
761 | else | 771 | else |
762 | { | 772 | { |
763 | m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + | 773 | m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + |
764 | ((OdePrim) prim).m_targetSpace.ToString()); | 774 | ((OdePrim)prim).m_targetSpace.ToString()); |
765 | } | 775 | } |
776 | |||
766 | } | 777 | } |
767 | } | 778 | } |
779 | m_log.Warn(prim.prim_geom); | ||
768 | try | 780 | try |
769 | { | 781 | { |
770 | 782 | if (prim.prim_geom != (IntPtr)0) | |
771 | d.GeomDestroy(prim.prim_geom); | 783 | { |
784 | d.GeomDestroy(prim.prim_geom); | ||
785 | prim.prim_geom = (IntPtr) 0; | ||
786 | } | ||
787 | |||
772 | } | 788 | } |
773 | catch (System.AccessViolationException) | 789 | catch (System.AccessViolationException) |
774 | { | 790 | { |
@@ -777,30 +793,31 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
777 | _prims.Remove(prim); | 793 | _prims.Remove(prim); |
778 | 794 | ||
779 | //If there are no more geometries in the sub-space, we don't need it in the main space anymore | 795 | //If there are no more geometries in the sub-space, we don't need it in the main space anymore |
780 | if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0) | 796 | //if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0) |
781 | { | 797 | //{ |
782 | if (!(prim.m_targetSpace.Equals(null))) | 798 | //if (!(prim.m_targetSpace.Equals(null))) |
783 | { | 799 | //{ |
784 | if (d.GeomIsSpace(prim.m_targetSpace)) | 800 | //if (d.GeomIsSpace(prim.m_targetSpace)) |
785 | { | 801 | //{ |
786 | waitForSpaceUnlock(prim.m_targetSpace); | 802 | //waitForSpaceUnlock(prim.m_targetSpace); |
787 | d.SpaceRemove(space, prim.m_targetSpace); | 803 | //d.SpaceRemove(space, prim.m_targetSpace); |
788 | // free up memory used by the space. | 804 | // free up memory used by the space. |
789 | d.SpaceDestroy(prim.m_targetSpace); | 805 | //d.SpaceDestroy(prim.m_targetSpace); |
790 | int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position); | 806 | //int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position); |
791 | resetSpaceArrayItemToZero(xyspace[0], xyspace[1]); | 807 | //resetSpaceArrayItemToZero(xyspace[0], xyspace[1]); |
792 | } | 808 | //} |
793 | else | 809 | //else |
794 | { | 810 | //{ |
795 | m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + | 811 | //m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + |
796 | ((OdePrim) prim).m_targetSpace.ToString()); | 812 | //((OdePrim) prim).m_targetSpace.ToString()); |
797 | } | 813 | //} |
798 | } | 814 | //} |
799 | } | 815 | //} |
800 | } | 816 | } |
801 | 817 | ||
802 | 818 | ||
803 | } | 819 | |
820 | ode.dunlock(world); | ||
804 | } | 821 | } |
805 | /// <summary> | 822 | /// <summary> |
806 | /// Takes a space pointer and zeros out the array we're using to hold the spaces | 823 | /// Takes a space pointer and zeros out the array we're using to hold the spaces |
@@ -905,9 +922,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
905 | else | 922 | else |
906 | { | 923 | { |
907 | // this is a physical object that got disabled. ;.; | 924 | // this is a physical object that got disabled. ;.; |
908 | if (d.SpaceQuery(currentspace, geom)) | 925 | if (currentspace != (IntPtr)0 && geom != (IntPtr)0) |
909 | { | 926 | { |
910 | if (currentspace != (IntPtr) 0) | 927 | if (d.SpaceQuery(currentspace, geom)) |
928 | { | ||
929 | |||
911 | if (d.GeomIsSpace(currentspace)) | 930 | if (d.GeomIsSpace(currentspace)) |
912 | { | 931 | { |
913 | waitForSpaceUnlock(currentspace); | 932 | waitForSpaceUnlock(currentspace); |
@@ -918,23 +937,24 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
918 | m_log.Info("[Physics]: Invalid Scene passed to 'recalculatespace':" + | 937 | m_log.Info("[Physics]: Invalid Scene passed to 'recalculatespace':" + |
919 | currentspace.ToString() + " Geom:" + geom.ToString()); | 938 | currentspace.ToString() + " Geom:" + geom.ToString()); |
920 | } | 939 | } |
921 | } | 940 | } |
922 | else | 941 | else |
923 | { | ||
924 | IntPtr sGeomIsIn = d.GeomGetSpace(geom); | ||
925 | if (!(sGeomIsIn.Equals(null))) | ||
926 | { | 942 | { |
927 | if (sGeomIsIn != (IntPtr) 0) | 943 | IntPtr sGeomIsIn = d.GeomGetSpace(geom); |
944 | if (!(sGeomIsIn.Equals(null))) | ||
928 | { | 945 | { |
929 | if (d.GeomIsSpace(sGeomIsIn)) | 946 | if (sGeomIsIn != (IntPtr)0) |
930 | { | 947 | { |
931 | waitForSpaceUnlock(sGeomIsIn); | 948 | if (d.GeomIsSpace(sGeomIsIn)) |
932 | d.SpaceRemove(sGeomIsIn, geom); | 949 | { |
933 | } | 950 | waitForSpaceUnlock(sGeomIsIn); |
934 | else | 951 | d.SpaceRemove(sGeomIsIn, geom); |
935 | { | 952 | } |
936 | m_log.Info("[Physics]: Invalid Scene passed to 'recalculatespace':" + | 953 | else |
937 | sGeomIsIn.ToString() + " Geom:" + geom.ToString()); | 954 | { |
955 | m_log.Info("[Physics]: Invalid Scene passed to 'recalculatespace':" + | ||
956 | sGeomIsIn.ToString() + " Geom:" + geom.ToString()); | ||
957 | } | ||
938 | } | 958 | } |
939 | } | 959 | } |
940 | } | 960 | } |
@@ -1041,6 +1061,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1041 | 1061 | ||
1042 | _prims.Add(newPrim); | 1062 | _prims.Add(newPrim); |
1043 | } | 1063 | } |
1064 | |||
1044 | 1065 | ||
1045 | return newPrim; | 1066 | return newPrim; |
1046 | } | 1067 | } |
@@ -1268,10 +1289,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1268 | bool processedtaints = false; | 1289 | bool processedtaints = false; |
1269 | foreach (OdePrim prim in _taintedPrim) | 1290 | foreach (OdePrim prim in _taintedPrim) |
1270 | { | 1291 | { |
1271 | if (prim.m_taintremove) | 1292 | //if (prim.m_taintremove) |
1272 | { | 1293 | //{ |
1273 | RemovePrimThreadLocked(prim); | 1294 | //RemovePrimThreadLocked(prim); |
1274 | } | 1295 | //} |
1275 | 1296 | ||
1276 | prim.ProcessTaints(timeStep); | 1297 | prim.ProcessTaints(timeStep); |
1277 | 1298 | ||