diff options
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 9 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 160 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 178 |
3 files changed, 240 insertions, 107 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index a6acdeb..6b8d0e2 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -508,7 +508,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
508 | 508 | ||
509 | public override PhysicsVector Velocity | 509 | public override PhysicsVector Velocity |
510 | { | 510 | { |
511 | get { return _velocity; } | 511 | get { |
512 | if (_zeroFlag) | ||
513 | return PhysicsVector.Zero; | ||
514 | m_lastUpdateSent = false; | ||
515 | return _velocity; | ||
516 | } | ||
512 | set | 517 | set |
513 | { | 518 | { |
514 | m_pidControllerActive = true; | 519 | m_pidControllerActive = true; |
@@ -612,7 +617,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
612 | _zeroPosition = d.BodyGetPosition(Body); | 617 | _zeroPosition = d.BodyGetPosition(Body); |
613 | } | 618 | } |
614 | //PidStatus = true; | 619 | //PidStatus = true; |
615 | 620 | ||
616 | PhysicsVector vec = new PhysicsVector(); | 621 | PhysicsVector vec = new PhysicsVector(); |
617 | d.Vector3 vel = d.BodyGetLinearVel(Body); | 622 | d.Vector3 vel = d.BodyGetLinearVel(Body); |
618 | float movementdivisor = 1f; | 623 | float movementdivisor = 1f; |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 59c1f87..fae5316 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -682,6 +682,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
682 | 682 | ||
683 | public void changePhysicsStatus(float timestap) | 683 | public void changePhysicsStatus(float timestap) |
684 | { | 684 | { |
685 | while (ode.lockquery()) | ||
686 | { | ||
687 | } | ||
688 | ode.dlock(_parent_scene.world); | ||
689 | |||
685 | if (m_isphysical == true) | 690 | if (m_isphysical == true) |
686 | { | 691 | { |
687 | if (Body == (IntPtr) 0) | 692 | if (Body == (IntPtr) 0) |
@@ -696,6 +701,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
696 | disableBody(); | 701 | disableBody(); |
697 | } | 702 | } |
698 | } | 703 | } |
704 | |||
705 | ode.dunlock(_parent_scene.world); | ||
706 | |||
699 | resetCollisionAccounting(); | 707 | resetCollisionAccounting(); |
700 | m_taintPhysics = m_isphysical; | 708 | m_taintPhysics = m_isphysical; |
701 | } | 709 | } |
@@ -730,7 +738,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
730 | d.SpaceRemove(m_targetSpace, prim_geom); | 738 | d.SpaceRemove(m_targetSpace, prim_geom); |
731 | } | 739 | } |
732 | d.GeomDestroy(prim_geom); | 740 | d.GeomDestroy(prim_geom); |
733 | 741 | prim_geom = (IntPtr)0; | |
734 | // we don't need to do space calculation because the client sends a position update also. | 742 | // we don't need to do space calculation because the client sends a position update also. |
735 | 743 | ||
736 | // Construction of new prim | 744 | // Construction of new prim |
@@ -742,6 +750,23 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
742 | if (mesh != null) | 750 | if (mesh != null) |
743 | { | 751 | { |
744 | setMesh(_parent_scene, mesh); | 752 | setMesh(_parent_scene, mesh); |
753 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | ||
754 | d.Quaternion myrot = new d.Quaternion(); | ||
755 | myrot.W = _orientation.w; | ||
756 | myrot.X = _orientation.x; | ||
757 | myrot.Y = _orientation.y; | ||
758 | myrot.Z = _orientation.z; | ||
759 | d.GeomSetQuaternion(prim_geom, ref myrot); | ||
760 | |||
761 | |||
762 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); | ||
763 | if (IsPhysical && Body == (IntPtr)0) | ||
764 | { | ||
765 | // Re creates body on size. | ||
766 | // EnableBody also does setMass() | ||
767 | enableBody(); | ||
768 | d.BodyEnable(Body); | ||
769 | } | ||
745 | } | 770 | } |
746 | else | 771 | else |
747 | { | 772 | { |
@@ -870,37 +895,120 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
870 | disableBody(); | 895 | disableBody(); |
871 | } | 896 | } |
872 | d.GeomDestroy(prim_geom); | 897 | d.GeomDestroy(prim_geom); |
873 | if (_mesh != null) | 898 | prim_geom = (IntPtr) 0; |
874 | { | 899 | // we don't need to do space calculation because the client sends a position update also. |
875 | d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); | ||
876 | } | ||
877 | 900 | ||
878 | // Construction of new prim | 901 | // Construction of new prim |
879 | if (_parent_scene.needsMeshing(_pbs)) | 902 | if (_parent_scene.needsMeshing(_pbs)) |
880 | { | 903 | { |
904 | // Don't need to re-enable body.. it's done in SetMesh | ||
881 | IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size); | 905 | IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size); |
906 | // createmesh returns null when it's a shape that isn't a cube. | ||
882 | if (mesh != null) | 907 | if (mesh != null) |
883 | { | 908 | { |
884 | setMesh(_parent_scene, mesh); | 909 | setMesh(_parent_scene, mesh); |
910 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | ||
911 | d.Quaternion myrot = new d.Quaternion(); | ||
912 | myrot.W = _orientation.w; | ||
913 | myrot.X = _orientation.x; | ||
914 | myrot.Y = _orientation.y; | ||
915 | myrot.Z = _orientation.z; | ||
916 | d.GeomSetQuaternion(prim_geom, ref myrot); | ||
917 | |||
918 | |||
919 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); | ||
920 | if (IsPhysical && Body == (IntPtr)0) | ||
921 | { | ||
922 | // Re creates body on size. | ||
923 | // EnableBody also does setMass() | ||
924 | enableBody(); | ||
925 | d.BodyEnable(Body); | ||
926 | } | ||
885 | } | 927 | } |
886 | else | 928 | else |
887 | { | 929 | { |
888 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | 930 | if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1) |
889 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | 931 | { |
932 | if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) | ||
933 | { | ||
934 | if (((_size.X / 2f) > 0f) && ((_size.X / 2f) < 1000)) | ||
935 | { | ||
936 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | ||
937 | SetGeom(d.CreateSphere(m_targetSpace, _size.X / 2)); | ||
938 | } | ||
939 | else | ||
940 | { | ||
941 | m_log.Info("[PHYSICS]: Failed to load a sphere bad size"); | ||
942 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | ||
943 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | ||
944 | } | ||
945 | |||
946 | } | ||
947 | else | ||
948 | { | ||
949 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | ||
950 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | ||
951 | } | ||
952 | } | ||
953 | //else if (_pbs.ProfileShape == ProfileShape.Circle && _pbs.PathCurve == (byte)Extrusion.Straight) | ||
954 | //{ | ||
955 | //Cyllinder | ||
956 | //if (_size.X == _size.Y) | ||
957 | //{ | ||
958 | // prim_geom = d.CreateCylinder(m_targetSpace, _size.X / 2, _size.Z); | ||
959 | //} | ||
960 | //else | ||
961 | //{ | ||
962 | //prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); | ||
963 | //} | ||
964 | //} | ||
965 | else | ||
966 | { | ||
967 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | ||
968 | SetGeom(prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | ||
969 | } | ||
970 | //prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); | ||
971 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | ||
972 | d.Quaternion myrot = new d.Quaternion(); | ||
973 | myrot.W = _orientation.w; | ||
974 | myrot.X = _orientation.x; | ||
975 | myrot.Y = _orientation.y; | ||
976 | myrot.Z = _orientation.z; | ||
977 | d.GeomSetQuaternion(prim_geom, ref myrot); | ||
890 | } | 978 | } |
891 | } | 979 | } |
892 | else | 980 | else |
893 | { | 981 | { |
894 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | 982 | if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1) |
895 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | 983 | { |
896 | } | 984 | if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) |
897 | if (IsPhysical && Body == (IntPtr) 0) | 985 | { |
898 | { | 986 | _parent_scene.waitForSpaceUnlock(m_targetSpace); |
899 | //re-create new body | 987 | SetGeom(d.CreateSphere(m_targetSpace, _size.X / 2)); |
900 | enableBody(); | 988 | } |
901 | } | 989 | else |
902 | else | 990 | { |
903 | { | 991 | _parent_scene.waitForSpaceUnlock(m_targetSpace); |
992 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | ||
993 | } | ||
994 | } | ||
995 | //else if (_pbs.ProfileShape == ProfileShape.Circle && _pbs.PathCurve == (byte)Extrusion.Straight) | ||
996 | //{ | ||
997 | //Cyllinder | ||
998 | //if (_size.X == _size.Y) | ||
999 | //{ | ||
1000 | //prim_geom = d.CreateCylinder(m_targetSpace, _size.X / 2, _size.Z); | ||
1001 | //} | ||
1002 | //else | ||
1003 | //{ | ||
1004 | //prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); | ||
1005 | //} | ||
1006 | //} | ||
1007 | else | ||
1008 | { | ||
1009 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | ||
1010 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | ||
1011 | } | ||
904 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | 1012 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); |
905 | d.Quaternion myrot = new d.Quaternion(); | 1013 | d.Quaternion myrot = new d.Quaternion(); |
906 | myrot.W = _orientation.w; | 1014 | myrot.W = _orientation.w; |
@@ -908,6 +1016,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
908 | myrot.Y = _orientation.y; | 1016 | myrot.Y = _orientation.y; |
909 | myrot.Z = _orientation.z; | 1017 | myrot.Z = _orientation.z; |
910 | d.GeomSetQuaternion(prim_geom, ref myrot); | 1018 | d.GeomSetQuaternion(prim_geom, ref myrot); |
1019 | |||
1020 | |||
1021 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); | ||
1022 | if (IsPhysical && Body == (IntPtr)0) | ||
1023 | { | ||
1024 | // Re creates body on size. | ||
1025 | // EnableBody also does setMass() | ||
1026 | enableBody(); | ||
1027 | d.BodyEnable(Body); | ||
1028 | } | ||
911 | } | 1029 | } |
912 | _parent_scene.geom_name_map[prim_geom] = oldname; | 1030 | _parent_scene.geom_name_map[prim_geom] = oldname; |
913 | 1031 | ||
@@ -924,7 +1042,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
924 | } | 1042 | } |
925 | ode.dlock(_parent_scene.world); | 1043 | ode.dlock(_parent_scene.world); |
926 | 1044 | ||
927 | System.Threading.Thread.Sleep(2); | 1045 | |
928 | lock (m_forcelist) | 1046 | lock (m_forcelist) |
929 | { | 1047 | { |
930 | //m_log.Info("[PHYSICS]: dequeing forcelist"); | 1048 | //m_log.Info("[PHYSICS]: dequeing forcelist"); |
@@ -1048,7 +1166,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1048 | 1166 | ||
1049 | public override PrimitiveBaseShape Shape | 1167 | public override PrimitiveBaseShape Shape |
1050 | { | 1168 | { |
1051 | set { _pbs = value; } | 1169 | set { |
1170 | |||
1171 | _pbs = value; | ||
1172 | m_taintshape = true; | ||
1173 | } | ||
1052 | } | 1174 | } |
1053 | 1175 | ||
1054 | public override PhysicsVector Velocity | 1176 | public override PhysicsVector Velocity |
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 3d70a3d..d7d9ab1 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -330,6 +330,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
330 | catch (SEHException) | 330 | catch (SEHException) |
331 | { | 331 | { |
332 | m_log.Error("[PHYSICS]: The Operating system shut down ODE because of corrupt memory. This could be a result of really irregular terrain. If this repeats continuously, restart using Basic Physics and terrain fill your terrain. Restarting the sim."); | 332 | m_log.Error("[PHYSICS]: The Operating system shut down ODE because of corrupt memory. This could be a result of really irregular terrain. If this repeats continuously, restart using Basic Physics and terrain fill your terrain. Restarting the sim."); |
333 | ode.drelease(world); | ||
333 | base.TriggerPhysicsBasedRestart(); | 334 | base.TriggerPhysicsBasedRestart(); |
334 | } | 335 | } |
335 | catch (System.AccessViolationException) | 336 | catch (System.AccessViolationException) |
@@ -737,87 +738,92 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
737 | /// <param name="prim"></param> | 738 | /// <param name="prim"></param> |
738 | public void RemovePrimThreadLocked(OdePrim prim) | 739 | public void RemovePrimThreadLocked(OdePrim prim) |
739 | { | 740 | { |
740 | while (ode.lockquery()) | 741 | lock (ode) |
741 | { | 742 | { |
742 | } | 743 | if (prim.prim_geom != (IntPtr)0) |
743 | ode.dlock(world); | ||
744 | //System.Threading.Thread.Sleep(20); | ||
745 | prim.ResetTaints(); | ||
746 | |||
747 | |||
748 | if (prim.IsPhysical) | ||
749 | { | ||
750 | prim.disableBody(); | ||
751 | } | ||
752 | // we don't want to remove the main space | ||
753 | if (prim.m_targetSpace != space && prim.IsPhysical == false) | ||
754 | { | 744 | { |
755 | // If the geometry is in the targetspace, remove it from the target space | 745 | while (ode.lockquery()) |
756 | //m_log.Warn(prim.m_targetSpace); | 746 | { |
757 | if (prim.prim_geom == (IntPtr)0) | 747 | } |
758 | prim.prim_geom = prim.prev_geom; | 748 | ode.dlock(world); |
749 | //System.Threading.Thread.Sleep(20); | ||
750 | prim.ResetTaints(); | ||
751 | |||
759 | 752 | ||
760 | if (prim.m_targetSpace != (IntPtr)0) | 753 | if (prim.IsPhysical) |
761 | { | 754 | { |
762 | if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom)) | 755 | prim.disableBody(); |
756 | } | ||
757 | // we don't want to remove the main space | ||
758 | if (prim.m_targetSpace != space && prim.IsPhysical == false) | ||
759 | { | ||
760 | // If the geometry is in the targetspace, remove it from the target space | ||
761 | //m_log.Warn(prim.m_targetSpace); | ||
762 | |||
763 | |||
764 | if (prim.m_targetSpace != (IntPtr)0) | ||
763 | { | 765 | { |
764 | 766 | if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom)) | |
765 | if (d.GeomIsSpace(prim.m_targetSpace)) | ||
766 | { | 767 | { |
767 | waitForSpaceUnlock(prim.m_targetSpace); | 768 | |
768 | d.SpaceRemove(prim.m_targetSpace, prim.prim_geom); | 769 | if (d.GeomIsSpace(prim.m_targetSpace)) |
769 | prim.m_targetSpace = space; | 770 | { |
771 | waitForSpaceUnlock(prim.m_targetSpace); | ||
772 | d.SpaceRemove(prim.m_targetSpace, prim.prim_geom); | ||
773 | prim.m_targetSpace = space; | ||
774 | } | ||
775 | else | ||
776 | { | ||
777 | m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + | ||
778 | ((OdePrim)prim).m_targetSpace.ToString()); | ||
779 | } | ||
780 | |||
770 | } | 781 | } |
771 | else | 782 | } |
783 | //m_log.Warn(prim.prim_geom); | ||
784 | try | ||
785 | { | ||
786 | if (prim.prim_geom != (IntPtr)0) | ||
772 | { | 787 | { |
773 | m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + | 788 | d.GeomDestroy(prim.prim_geom); |
774 | ((OdePrim)prim).m_targetSpace.ToString()); | 789 | prim.prim_geom = (IntPtr)0; |
775 | } | 790 | } |
776 | 791 | ||
777 | } | 792 | } |
778 | } | 793 | catch (System.AccessViolationException) |
779 | //m_log.Warn(prim.prim_geom); | ||
780 | try | ||
781 | { | ||
782 | if (prim.prim_geom != (IntPtr)0) | ||
783 | { | 794 | { |
784 | d.GeomDestroy(prim.prim_geom); | 795 | m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed."); |
785 | prim.prim_geom = (IntPtr) 0; | ||
786 | } | 796 | } |
787 | 797 | _prims.Remove(prim); | |
788 | } | ||
789 | catch (System.AccessViolationException) | ||
790 | { | ||
791 | m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed."); | ||
792 | } | ||
793 | _prims.Remove(prim); | ||
794 | 798 | ||
795 | //If there are no more geometries in the sub-space, we don't need it in the main space anymore | 799 | //If there are no more geometries in the sub-space, we don't need it in the main space anymore |
796 | //if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0) | 800 | //if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0) |
797 | //{ | 801 | //{ |
798 | //if (!(prim.m_targetSpace.Equals(null))) | 802 | //if (!(prim.m_targetSpace.Equals(null))) |
799 | //{ | 803 | //{ |
800 | //if (d.GeomIsSpace(prim.m_targetSpace)) | 804 | //if (d.GeomIsSpace(prim.m_targetSpace)) |
801 | //{ | 805 | //{ |
802 | //waitForSpaceUnlock(prim.m_targetSpace); | 806 | //waitForSpaceUnlock(prim.m_targetSpace); |
803 | //d.SpaceRemove(space, prim.m_targetSpace); | 807 | //d.SpaceRemove(space, prim.m_targetSpace); |
804 | // free up memory used by the space. | 808 | // free up memory used by the space. |
805 | //d.SpaceDestroy(prim.m_targetSpace); | 809 | //d.SpaceDestroy(prim.m_targetSpace); |
806 | //int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position); | 810 | //int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position); |
807 | //resetSpaceArrayItemToZero(xyspace[0], xyspace[1]); | 811 | //resetSpaceArrayItemToZero(xyspace[0], xyspace[1]); |
808 | //} | ||
809 | //else | ||
810 | //{ | ||
811 | //m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + | ||
812 | //((OdePrim) prim).m_targetSpace.ToString()); | ||
813 | //} | ||
814 | //} | 812 | //} |
815 | //} | 813 | //else |
816 | } | 814 | //{ |
815 | //m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + | ||
816 | //((OdePrim) prim).m_targetSpace.ToString()); | ||
817 | //} | ||
818 | //} | ||
819 | //} | ||
820 | } | ||
821 | |||
822 | |||
817 | 823 | ||
818 | 824 | ode.dunlock(world); | |
819 | 825 | } | |
820 | ode.dunlock(world); | 826 | } |
821 | } | 827 | } |
822 | /// <summary> | 828 | /// <summary> |
823 | /// Takes a space pointer and zeros out the array we're using to hold the spaces | 829 | /// Takes a space pointer and zeros out the array we're using to hold the spaces |
@@ -1238,6 +1244,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1238 | catch (StackOverflowException) | 1244 | catch (StackOverflowException) |
1239 | { | 1245 | { |
1240 | m_log.Error("[PHYSICS]: The operating system wasn't able to allocate enough memory for the simulation. Restarting the sim."); | 1246 | m_log.Error("[PHYSICS]: The operating system wasn't able to allocate enough memory for the simulation. Restarting the sim."); |
1247 | ode.drelease(world); | ||
1241 | base.TriggerPhysicsBasedRestart(); | 1248 | base.TriggerPhysicsBasedRestart(); |
1242 | } | 1249 | } |
1243 | 1250 | ||
@@ -1249,33 +1256,32 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1249 | 1256 | ||
1250 | while (step_time > 0.0f) | 1257 | while (step_time > 0.0f) |
1251 | { | 1258 | { |
1252 | foreach (OdeCharacter actor in _characters) | 1259 | lock (ode) |
1253 | { | 1260 | { |
1254 | actor.Move(timeStep); | 1261 | if (!ode.lockquery()) |
1255 | actor.collidelock = true; | 1262 | { |
1256 | } | 1263 | ode.dlock(world); |
1257 | if (!ode.lockquery()) | 1264 | foreach (OdeCharacter actor in _characters) |
1258 | { | 1265 | { |
1259 | ode.dlock(world); | 1266 | actor.Move(timeStep); |
1267 | |||
1268 | } | ||
1269 | |||
1260 | 1270 | ||
1261 | collision_optimized(timeStep); | 1271 | collision_optimized(timeStep); |
1262 | 1272 | ||
1263 | d.WorldQuickStep(world, ODE_STEPSIZE); | 1273 | d.WorldQuickStep(world, ODE_STEPSIZE); |
1264 | |||
1265 | d.JointGroupEmpty(contactgroup); | ||
1266 | ode.dunlock(world); | ||
1267 | 1274 | ||
1268 | step_time -= ODE_STEPSIZE; | 1275 | d.JointGroupEmpty(contactgroup); |
1269 | i++; | 1276 | ode.dunlock(world); |
1270 | } | ||
1271 | else | ||
1272 | { | ||
1273 | fps = 0; | ||
1274 | } | ||
1275 | 1277 | ||
1276 | foreach (OdeCharacter actor in _characters) | 1278 | step_time -= ODE_STEPSIZE; |
1277 | { | 1279 | i++; |
1278 | actor.collidelock = false; | 1280 | } |
1281 | else | ||
1282 | { | ||
1283 | fps = 0; | ||
1284 | } | ||
1279 | } | 1285 | } |
1280 | } | 1286 | } |
1281 | 1287 | ||