aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs73
1 files changed, 40 insertions, 33 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 9c323a4..879d30f 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -61,6 +61,22 @@ namespace OpenSim.Region.Physics.OdePlugin
61 { 61 {
62 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 62 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
63 63
64 private bool m_isphysical;
65
66 /// <summary>
67 /// Is this prim subject to physics? Even if not, it's still solid for collision purposes.
68 /// </summary>
69 public override bool IsPhysical
70 {
71 get { return m_isphysical; }
72 set
73 {
74 m_isphysical = value;
75 if (!m_isphysical) // Zero the remembered last velocity
76 m_lastVelocity = Vector3.Zero;
77 }
78 }
79
64 private Vector3 _position; 80 private Vector3 _position;
65 private Vector3 _velocity; 81 private Vector3 _velocity;
66 private Vector3 _torque; 82 private Vector3 _torque;
@@ -153,7 +169,6 @@ namespace OpenSim.Region.Physics.OdePlugin
153 private List<OdePrim> childrenPrim = new List<OdePrim>(); 169 private List<OdePrim> childrenPrim = new List<OdePrim>();
154 170
155 private bool iscolliding; 171 private bool iscolliding;
156 private bool m_isphysical;
157 private bool m_isSelected; 172 private bool m_isSelected;
158 173
159 internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively 174 internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively
@@ -240,13 +255,15 @@ namespace OpenSim.Region.Physics.OdePlugin
240 m_targetSpace = (IntPtr)0; 255 m_targetSpace = (IntPtr)0;
241 256
242 if (pos.Z < 0) 257 if (pos.Z < 0)
243 m_isphysical = false; 258 {
259 IsPhysical = false;
260 }
244 else 261 else
245 { 262 {
246 m_isphysical = pisPhysical; 263 IsPhysical = pisPhysical;
247 // If we're physical, we need to be in the master space for now. 264 // If we're physical, we need to be in the master space for now.
248 // linksets *should* be in a space together.. but are not currently 265 // linksets *should* be in a space together.. but are not currently
249 if (m_isphysical) 266 if (IsPhysical)
250 m_targetSpace = _parent_scene.space; 267 m_targetSpace = _parent_scene.space;
251 } 268 }
252 269
@@ -289,7 +306,7 @@ namespace OpenSim.Region.Physics.OdePlugin
289 // through it while it's selected 306 // through it while it's selected
290 m_collisionscore = 0; 307 m_collisionscore = 0;
291 308
292 if ((m_isphysical && !_zeroFlag) || !value) 309 if ((IsPhysical && !_zeroFlag) || !value)
293 { 310 {
294 m_taintselected = value; 311 m_taintselected = value;
295 _parent_scene.AddPhysicsActorTaint(this); 312 _parent_scene.AddPhysicsActorTaint(this);
@@ -332,7 +349,7 @@ namespace OpenSim.Region.Physics.OdePlugin
332 { 349 {
333 if (!childPrim) 350 if (!childPrim)
334 { 351 {
335 if (m_isphysical && Body != IntPtr.Zero) 352 if (IsPhysical && Body != IntPtr.Zero)
336 { 353 {
337 d.BodyEnable(Body); 354 d.BodyEnable(Body);
338 if (m_vehicle.Type != Vehicle.TYPE_NONE) 355 if (m_vehicle.Type != Vehicle.TYPE_NONE)
@@ -347,7 +364,7 @@ namespace OpenSim.Region.Physics.OdePlugin
347 { 364 {
348 m_disabled = true; 365 m_disabled = true;
349 366
350 if (m_isphysical && Body != IntPtr.Zero) 367 if (IsPhysical && Body != IntPtr.Zero)
351 { 368 {
352 d.BodyDisable(Body); 369 d.BodyDisable(Body);
353 } 370 }
@@ -887,7 +904,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
887 } 904 }
888 } 905 }
889 906
890 if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent)) 907 if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent))
891 changePhysicsStatus(timestep); 908 changePhysicsStatus(timestep);
892 909
893 if (!_size.ApproxEquals(m_taintsize, 0f)) 910 if (!_size.ApproxEquals(m_taintsize, 0f))
@@ -1006,7 +1023,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
1006 } 1023 }
1007 1024
1008 _parent = m_taintparent; 1025 _parent = m_taintparent;
1009 m_taintPhysics = m_isphysical; 1026 m_taintPhysics = IsPhysical;
1010 } 1027 }
1011 1028
1012 /// <summary> 1029 /// <summary>
@@ -1159,7 +1176,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
1159 1176
1160 private void ChildSetGeom(OdePrim odePrim) 1177 private void ChildSetGeom(OdePrim odePrim)
1161 { 1178 {
1162 //if (m_isphysical && Body != IntPtr.Zero) 1179 //if (IsPhysical && Body != IntPtr.Zero)
1163 lock (childrenPrim) 1180 lock (childrenPrim)
1164 { 1181 {
1165 foreach (OdePrim prm in childrenPrim) 1182 foreach (OdePrim prm in childrenPrim)
@@ -1260,7 +1277,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
1260 // first 50 again. then the last 50 are disabled. then the first 50, which were just woken 1277 // first 50 again. then the last 50 are disabled. then the first 50, which were just woken
1261 // up, start simulating again, which in turn wakes up the last 50. 1278 // up, start simulating again, which in turn wakes up the last 50.
1262 1279
1263 if (m_isphysical) 1280 if (IsPhysical)
1264 { 1281 {
1265 disableBodySoft(); 1282 disableBodySoft();
1266 } 1283 }
@@ -1271,7 +1288,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
1271 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); 1288 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
1272 } 1289 }
1273 1290
1274 if (m_isphysical) 1291 if (IsPhysical)
1275 { 1292 {
1276 disableBodySoft(); 1293 disableBodySoft();
1277 } 1294 }
@@ -1280,7 +1297,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
1280 { 1297 {
1281 m_collisionCategories = CollisionCategories.Geom; 1298 m_collisionCategories = CollisionCategories.Geom;
1282 1299
1283 if (m_isphysical) 1300 if (IsPhysical)
1284 m_collisionCategories |= CollisionCategories.Body; 1301 m_collisionCategories |= CollisionCategories.Body;
1285 1302
1286 m_collisionFlags = m_default_collisionFlags; 1303 m_collisionFlags = m_default_collisionFlags;
@@ -1295,7 +1312,8 @@ Console.WriteLine("ZProcessTaints for " + Name);
1295 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); 1312 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
1296 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); 1313 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
1297 } 1314 }
1298 if (m_isphysical) 1315
1316 if (IsPhysical)
1299 { 1317 {
1300 if (Body != IntPtr.Zero) 1318 if (Body != IntPtr.Zero)
1301 { 1319 {
@@ -1314,7 +1332,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
1314 { 1332 {
1315 m_taintposition = _position; 1333 m_taintposition = _position;
1316 m_taintrot = _orientation; 1334 m_taintrot = _orientation;
1317 m_taintPhysics = m_isphysical; 1335 m_taintPhysics = IsPhysical;
1318 m_taintselected = m_isSelected; 1336 m_taintselected = m_isSelected;
1319 m_taintsize = _size; 1337 m_taintsize = _size;
1320 m_taintshape = false; 1338 m_taintshape = false;
@@ -1442,7 +1460,7 @@ Console.WriteLine("changeadd 1");
1442 d.GeomSetQuaternion(prim_geom, ref myrot); 1460 d.GeomSetQuaternion(prim_geom, ref myrot);
1443 } 1461 }
1444 1462
1445 if (m_isphysical && Body == IntPtr.Zero) 1463 if (IsPhysical && Body == IntPtr.Zero)
1446 { 1464 {
1447 enableBody(); 1465 enableBody();
1448 } 1466 }
@@ -1458,7 +1476,7 @@ Console.WriteLine("changeadd 1");
1458 1476
1459 public void changemove(float timestep) 1477 public void changemove(float timestep)
1460 { 1478 {
1461 if (m_isphysical) 1479 if (IsPhysical)
1462 { 1480 {
1463 if (!m_disabled && !m_taintremove && !childPrim) 1481 if (!m_disabled && !m_taintremove && !childPrim)
1464 { 1482 {
@@ -1791,7 +1809,7 @@ Console.WriteLine(" JointCreateFixed");
1791 { 1809 {
1792 // KF: If this is a root prim do BodySet 1810 // KF: If this is a root prim do BodySet
1793 d.BodySetQuaternion(Body, ref myrot); 1811 d.BodySetQuaternion(Body, ref myrot);
1794 if (m_isphysical) 1812 if (IsPhysical)
1795 { 1813 {
1796 if (!m_angularlock.ApproxEquals(Vector3.One, 0f)) 1814 if (!m_angularlock.ApproxEquals(Vector3.One, 0f))
1797 createAMotor(m_angularlock); 1815 createAMotor(m_angularlock);
@@ -1828,7 +1846,7 @@ Console.WriteLine(" JointCreateFixed");
1828 1846
1829 public void changePhysicsStatus(float timestep) 1847 public void changePhysicsStatus(float timestep)
1830 { 1848 {
1831 if (m_isphysical == true) 1849 if (IsPhysical)
1832 { 1850 {
1833 if (Body == IntPtr.Zero) 1851 if (Body == IntPtr.Zero)
1834 { 1852 {
@@ -1848,8 +1866,6 @@ Console.WriteLine(" JointCreateFixed");
1848 { 1866 {
1849 if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim) 1867 if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim)
1850 { 1868 {
1851
1852
1853 if (prim_geom != IntPtr.Zero) 1869 if (prim_geom != IntPtr.Zero)
1854 { 1870 {
1855 try 1871 try
@@ -1867,6 +1883,7 @@ Console.WriteLine(" JointCreateFixed");
1867//Console.WriteLine("changePhysicsStatus for " + Name); 1883//Console.WriteLine("changePhysicsStatus for " + Name);
1868 changeadd(2f); 1884 changeadd(2f);
1869 } 1885 }
1886
1870 if (childPrim) 1887 if (childPrim)
1871 { 1888 {
1872 if (_parent != null) 1889 if (_parent != null)
@@ -1885,7 +1902,7 @@ Console.WriteLine(" JointCreateFixed");
1885 changeSelectedStatus(timestep); 1902 changeSelectedStatus(timestep);
1886 1903
1887 resetCollisionAccounting(); 1904 resetCollisionAccounting();
1888 m_taintPhysics = m_isphysical; 1905 m_taintPhysics = IsPhysical;
1889 } 1906 }
1890 1907
1891 public void changesize(float timestamp) 1908 public void changesize(float timestamp)
@@ -2218,16 +2235,6 @@ Console.WriteLine("changeshape not need meshing");
2218 m_taintVelocity = Vector3.Zero; 2235 m_taintVelocity = Vector3.Zero;
2219 } 2236 }
2220 2237
2221 public override bool IsPhysical
2222 {
2223 get { return m_isphysical; }
2224 set {
2225 m_isphysical = value;
2226 if (!m_isphysical) // Zero the remembered last velocity
2227 m_lastVelocity = Vector3.Zero;
2228 }
2229 }
2230
2231 public void setPrimForRemoval() 2238 public void setPrimForRemoval()
2232 { 2239 {
2233 m_taintremove = true; 2240 m_taintremove = true;
@@ -2406,7 +2413,7 @@ Console.WriteLine("changeshape not need meshing");
2406 { 2413 {
2407 get 2414 get
2408 { 2415 {
2409 if (!m_isphysical || Body == IntPtr.Zero) 2416 if (!IsPhysical || Body == IntPtr.Zero)
2410 return Vector3.Zero; 2417 return Vector3.Zero;
2411 2418
2412 return _torque; 2419 return _torque;