aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs204
1 files changed, 88 insertions, 116 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 7d67da3..0a8cf75 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -156,7 +156,15 @@ namespace OpenSim.Region.Physics.OdePlugin
156 /// </summary> 156 /// </summary>
157 public IntPtr m_targetSpace = IntPtr.Zero; 157 public IntPtr m_targetSpace = IntPtr.Zero;
158 158
159 /// <summary>
160 /// The prim geometry, used for collision detection.
161 /// </summary>
162 /// <remarks>
163 /// This is never null except for a brief period when the geometry needs to be replaced (due to resizing or
164 /// mesh change) or when the physical prim is being removed from the scene.
165 /// </remarks>
159 public IntPtr prim_geom { get; private set; } 166 public IntPtr prim_geom { get; private set; }
167
160 public IntPtr _triMeshData { get; private set; } 168 public IntPtr _triMeshData { get; private set; }
161 169
162 private IntPtr _linkJointGroup = IntPtr.Zero; 170 private IntPtr _linkJointGroup = IntPtr.Zero;
@@ -325,14 +333,11 @@ namespace OpenSim.Region.Physics.OdePlugin
325 { 333 {
326 prim_geom = geom; 334 prim_geom = geom;
327//Console.WriteLine("SetGeom to " + prim_geom + " for " + Name); 335//Console.WriteLine("SetGeom to " + prim_geom + " for " + Name);
328 if (prim_geom != IntPtr.Zero)
329 {
330 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
331 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
332 336
333 _parent_scene.geom_name_map[prim_geom] = Name; 337 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
334 _parent_scene.actor_name_map[prim_geom] = this; 338 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
335 } 339
340 _parent_scene.geom_name_map[prim_geom] = Name;
336 341
337 if (childPrim) 342 if (childPrim)
338 { 343 {
@@ -765,11 +770,8 @@ namespace OpenSim.Region.Physics.OdePlugin
765 m_collisionCategories &= ~CollisionCategories.Body; 770 m_collisionCategories &= ~CollisionCategories.Body;
766 m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); 771 m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land);
767 772
768 if (prim_geom != IntPtr.Zero) 773 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
769 { 774 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
770 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
771 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
772 }
773 775
774 d.BodyDestroy(Body); 776 d.BodyDestroy(Body);
775 lock (childrenPrim) 777 lock (childrenPrim)
@@ -793,11 +795,8 @@ namespace OpenSim.Region.Physics.OdePlugin
793 m_collisionCategories &= ~CollisionCategories.Body; 795 m_collisionCategories &= ~CollisionCategories.Body;
794 m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); 796 m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land);
795 797
796 if (prim_geom != IntPtr.Zero) 798 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
797 { 799 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
798 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
799 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
800 }
801 800
802 Body = IntPtr.Zero; 801 Body = IntPtr.Zero;
803 } 802 }
@@ -864,10 +863,7 @@ namespace OpenSim.Region.Physics.OdePlugin
864// _parent_scene.waitForSpaceUnlock(m_targetSpace); 863// _parent_scene.waitForSpaceUnlock(m_targetSpace);
865 try 864 try
866 { 865 {
867 if (prim_geom == IntPtr.Zero) 866 SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null));
868 {
869 SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null));
870 }
871 } 867 }
872 catch (AccessViolationException) 868 catch (AccessViolationException)
873 { 869 {
@@ -890,73 +886,67 @@ namespace OpenSim.Region.Physics.OdePlugin
890#if SPAM 886#if SPAM
891Console.WriteLine("ZProcessTaints for " + Name); 887Console.WriteLine("ZProcessTaints for " + Name);
892#endif 888#endif
889
890 // This must be processed as the very first taint so that later operations have a prim_geom to work with
891 // if this is a new prim.
893 if (m_taintadd) 892 if (m_taintadd)
894 {
895 changeadd(); 893 changeadd();
896 }
897
898 if (prim_geom != IntPtr.Zero)
899 {
900 if (!_position.ApproxEquals(m_taintposition, 0f))
901 changemove();
902 894
903 if (m_taintrot != _orientation) 895 if (!_position.ApproxEquals(m_taintposition, 0f))
904 { 896 changemove();
905 if (childPrim && IsPhysical) // For physical child prim... 897
906 { 898 if (m_taintrot != _orientation)
907 rotate(); 899 {
908 // KF: ODE will also rotate the parent prim! 900 if (childPrim && IsPhysical) // For physical child prim...
909 // so rotate the root back to where it was 901 {
910 OdePrim parent = (OdePrim)_parent; 902 rotate();
911 parent.rotate(); 903 // KF: ODE will also rotate the parent prim!
912 } 904 // so rotate the root back to where it was
913 else 905 OdePrim parent = (OdePrim)_parent;
914 { 906 parent.rotate();
915 //Just rotate the prim
916 rotate();
917 }
918 } 907 }
919 908 else
920 if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent)) 909 {
921 changePhysicsStatus(); 910 //Just rotate the prim
911 rotate();
912 }
913 }
914
915 if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent))
916 changePhysicsStatus();
922 917
923 if (!_size.ApproxEquals(m_taintsize, 0f)) 918 if (!_size.ApproxEquals(m_taintsize, 0f))
924 changesize(); 919 changesize();
925 920
926 if (m_taintshape) 921 if (m_taintshape)
927 changeshape(); 922 changeshape();
928 923
929 if (m_taintforce) 924 if (m_taintforce)
930 changeAddForce(); 925 changeAddForce();
931 926
932 if (m_taintaddangularforce) 927 if (m_taintaddangularforce)
933 changeAddAngularForce(); 928 changeAddAngularForce();
934 929
935 if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f)) 930 if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f))
936 changeSetTorque(); 931 changeSetTorque();
937 932
938 if (m_taintdisable) 933 if (m_taintdisable)
939 changedisable(); 934 changedisable();
940 935
941 if (m_taintselected != m_isSelected) 936 if (m_taintselected != m_isSelected)
942 changeSelectedStatus(); 937 changeSelectedStatus();
943 938
944 if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f)) 939 if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f))
945 changevelocity(); 940 changevelocity();
946 941
947 if (m_taintparent != _parent) 942 if (m_taintparent != _parent)
948 changelink(); 943 changelink();
949 944
950 if (m_taintCollidesWater != m_collidesWater) 945 if (m_taintCollidesWater != m_collidesWater)
951 changefloatonwater(); 946 changefloatonwater();
952 947
953 if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f)) 948 if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f))
954 changeAngularLock(); 949 changeAngularLock();
955 }
956 else
957 {
958 m_log.ErrorFormat("[PHYSICS]: The scene reused a disposed PhysActor for {0}! *waves finger*, Don't be evil. A couple of things can cause this. An improper prim breakdown(be sure to set prim_geom to zero after d.GeomDestroy! An improper buildup (creating the geom failed). Or, the Scene Reused a physics actor after disposing it.)", Name);
959 }
960 } 950 }
961 951
962 /// <summary> 952 /// <summary>
@@ -1093,18 +1083,10 @@ Console.WriteLine("ZProcessTaints for " + Name);
1093 prm.m_collisionCategories |= CollisionCategories.Body; 1083 prm.m_collisionCategories |= CollisionCategories.Body;
1094 prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); 1084 prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
1095 1085
1096 if (prm.prim_geom == IntPtr.Zero)
1097 {
1098 m_log.WarnFormat(
1099 "[PHYSICS]: Unable to link one of the linkset elements {0} for parent {1}. No geom yet",
1100 prm.Name, prim.Name);
1101 continue;
1102 }
1103//Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name); 1086//Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name);
1104 d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); 1087 d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories);
1105 d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); 1088 d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags);
1106 1089
1107
1108 d.Quaternion quat = new d.Quaternion(); 1090 d.Quaternion quat = new d.Quaternion();
1109 quat.W = prm._orientation.W; 1091 quat.W = prm._orientation.W;
1110 quat.X = prm._orientation.X; 1092 quat.X = prm._orientation.X;
@@ -1303,11 +1285,8 @@ Console.WriteLine("ZProcessTaints for " + Name);
1303 disableBodySoft(); 1285 disableBodySoft();
1304 } 1286 }
1305 1287
1306 if (prim_geom != IntPtr.Zero) 1288 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
1307 { 1289 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
1308 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
1309 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
1310 }
1311 1290
1312 if (IsPhysical) 1291 if (IsPhysical)
1313 { 1292 {
@@ -1328,11 +1307,8 @@ Console.WriteLine("ZProcessTaints for " + Name);
1328 if (m_collidesWater) 1307 if (m_collidesWater)
1329 m_collisionFlags |= CollisionCategories.Water; 1308 m_collisionFlags |= CollisionCategories.Water;
1330 1309
1331 if (prim_geom != IntPtr.Zero) 1310 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
1332 { 1311 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
1333 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
1334 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
1335 }
1336 1312
1337 if (IsPhysical) 1313 if (IsPhysical)
1338 { 1314 {
@@ -1472,6 +1448,9 @@ Console.WriteLine("CreateGeom:");
1472 } 1448 }
1473 else 1449 else
1474 { 1450 {
1451 m_log.WarnFormat(
1452 "[ODE PRIM]: Called RemoveGeom() on {0} {1} where geometry was already null.", Name, LocalID);
1453
1475 return false; 1454 return false;
1476 } 1455 }
1477 } 1456 }
@@ -1505,16 +1484,13 @@ Console.WriteLine("changeadd 1");
1505#endif 1484#endif
1506 CreateGeom(m_targetSpace, mesh); 1485 CreateGeom(m_targetSpace, mesh);
1507 1486
1508 if (prim_geom != IntPtr.Zero) 1487 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
1509 { 1488 d.Quaternion myrot = new d.Quaternion();
1510 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); 1489 myrot.X = _orientation.X;
1511 d.Quaternion myrot = new d.Quaternion(); 1490 myrot.Y = _orientation.Y;
1512 myrot.X = _orientation.X; 1491 myrot.Z = _orientation.Z;
1513 myrot.Y = _orientation.Y; 1492 myrot.W = _orientation.W;
1514 myrot.Z = _orientation.Z; 1493 d.GeomSetQuaternion(prim_geom, ref myrot);
1515 myrot.W = _orientation.W;
1516 d.GeomSetQuaternion(prim_geom, ref myrot);
1517 }
1518 1494
1519 if (IsPhysical && Body == IntPtr.Zero) 1495 if (IsPhysical && Body == IntPtr.Zero)
1520 enableBody(); 1496 enableBody();
@@ -1588,13 +1564,11 @@ Console.WriteLine(" JointCreateFixed");
1588 m_targetSpace = tempspace; 1564 m_targetSpace = tempspace;
1589 1565
1590// _parent_scene.waitForSpaceUnlock(m_targetSpace); 1566// _parent_scene.waitForSpaceUnlock(m_targetSpace);
1591 if (prim_geom != IntPtr.Zero) 1567
1592 { 1568 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
1593 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
1594 1569
1595// _parent_scene.waitForSpaceUnlock(m_targetSpace); 1570// _parent_scene.waitForSpaceUnlock(m_targetSpace);
1596 d.SpaceAdd(m_targetSpace, prim_geom); 1571 d.SpaceAdd(m_targetSpace, prim_geom);
1597 }
1598 1572
1599 changeSelectedStatus(); 1573 changeSelectedStatus();
1600 1574
@@ -2045,18 +2019,16 @@ Console.WriteLine(" JointCreateFixed");
2045 { 2019 {
2046 m_collidesWater = m_taintCollidesWater; 2020 m_collidesWater = m_taintCollidesWater;
2047 2021
2048 if (prim_geom != IntPtr.Zero) 2022 if (m_collidesWater)
2049 { 2023 {
2050 if (m_collidesWater) 2024 m_collisionFlags |= CollisionCategories.Water;
2051 { 2025 }
2052 m_collisionFlags |= CollisionCategories.Water; 2026 else
2053 } 2027 {
2054 else 2028 m_collisionFlags &= ~CollisionCategories.Water;
2055 {
2056 m_collisionFlags &= ~CollisionCategories.Water;
2057 }
2058 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
2059 } 2029 }
2030
2031 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
2060 } 2032 }
2061 2033
2062 /// <summary> 2034 /// <summary>