aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/ODEPrim.cs')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs160
1 files changed, 141 insertions, 19 deletions
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