aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs156
1 files changed, 80 insertions, 76 deletions
diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
index ae63cfa..505d455 100644
--- a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
@@ -143,6 +143,7 @@ namespace OpenSim.Region.Physics.OdePlugin
143 // unique UUID of this character object 143 // unique UUID of this character object
144 public UUID m_uuid; 144 public UUID m_uuid;
145 public bool bad = false; 145 public bool bad = false;
146 private Object m_syncRoot = new Object();
146 147
147 public OdeCharacter(String avName, OdeScene parent_scene, Vector3 pos, CollisionLocker dode, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor) 148 public OdeCharacter(String avName, OdeScene parent_scene, Vector3 pos, CollisionLocker dode, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor)
148 { 149 {
@@ -1323,103 +1324,106 @@ Console.WriteLine("**** Create {2} Dicts: actor={0} name={1} height={3} ra
1323 1324
1324 public void ProcessTaints(float timestep) 1325 public void ProcessTaints(float timestep)
1325 { 1326 {
1326 1327 lock (m_syncRoot)
1327 if (m_tainted_isPhysical != m_isPhysical)
1328 { 1328 {
1329 if (m_tainted_isPhysical)
1330 {
1331 // Create avatar capsule and related ODE data
1332 if (!(Shell == IntPtr.Zero && Body == IntPtr.Zero && Amotor == IntPtr.Zero))
1333 {
1334 m_log.Warn("[PHYSICS]: re-creating the following avatar ODE data, even though it already exists - "
1335 + (Shell!=IntPtr.Zero ? "Shell ":"")
1336 + (Body!=IntPtr.Zero ? "Body ":"")
1337 + (Amotor!=IntPtr.Zero ? "Amotor ":""));
1338 }
1339 AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor);
1340 _parent_scene.AddCharacter(this);
1341 }
1342 else
1343 {
1344 _parent_scene.RemoveCharacter(this);
1345 // destroy avatar capsule and related ODE data
1346 if (Amotor != IntPtr.Zero)
1347 {
1348 // Kill the Amotor
1349 d.JointDestroy(Amotor);
1350 Amotor = IntPtr.Zero;
1351 }
1352 //kill the Geometry
1353 _parent_scene.waitForSpaceUnlock(_parent_scene.space);
1354 1329
1355 if (Body != IntPtr.Zero) 1330 if (m_tainted_isPhysical != m_isPhysical)
1331 {
1332 if (m_tainted_isPhysical)
1356 { 1333 {
1357 //kill the body 1334 // Create avatar capsule and related ODE data
1358 d.BodyDestroy(Body); 1335 if (!(Shell == IntPtr.Zero && Body == IntPtr.Zero && Amotor == IntPtr.Zero))
1359 Body = IntPtr.Zero; 1336 {
1337 m_log.Warn("[PHYSICS]: re-creating the following avatar ODE data, even though it already exists - "
1338 + (Shell!=IntPtr.Zero ? "Shell ":"")
1339 + (Body!=IntPtr.Zero ? "Body ":"")
1340 + (Amotor!=IntPtr.Zero ? "Amotor ":""));
1341 }
1342 AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor);
1343 _parent_scene.AddCharacter(this);
1360 } 1344 }
1361 1345 else
1362 if(Shell != IntPtr.Zero)
1363 { 1346 {
1364 try 1347 _parent_scene.RemoveCharacter(this);
1348 // destroy avatar capsule and related ODE data
1349 if (Amotor != IntPtr.Zero)
1365 { 1350 {
1366 d.GeomDestroy(Shell); 1351 // Kill the Amotor
1352 d.JointDestroy(Amotor);
1353 Amotor = IntPtr.Zero;
1367 } 1354 }
1368 catch (System.AccessViolationException) 1355 //kill the Geometry
1356 _parent_scene.waitForSpaceUnlock(_parent_scene.space);
1357
1358 if (Body != IntPtr.Zero)
1369 { 1359 {
1370 m_log.Error("[PHYSICS]: PrimGeom dead"); 1360 //kill the body
1361 d.BodyDestroy(Body);
1362 Body = IntPtr.Zero;
1371 } 1363 }
1372 // Remove any old entries
1373//string tShell;
1374//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
1375//Console.WriteLine("**** Remove {0}", tShell);
1376 1364
1377 if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell); 1365 if(Shell != IntPtr.Zero)
1378 if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell); 1366 {
1379 Shell = IntPtr.Zero; 1367 try
1368 {
1369 d.GeomDestroy(Shell);
1370 }
1371 catch (System.AccessViolationException)
1372 {
1373 m_log.Error("[PHYSICS]: PrimGeom dead");
1374 }
1375 // Remove any old entries
1376 //string tShell;
1377 //_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
1378 //Console.WriteLine("**** Remove {0}", tShell);
1379
1380 if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
1381 if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
1382 Shell = IntPtr.Zero;
1383 }
1380 } 1384 }
1381 }
1382 1385
1383 m_isPhysical = m_tainted_isPhysical; 1386 m_isPhysical = m_tainted_isPhysical;
1384 } 1387 }
1385 1388
1386 if (m_tainted_CAPSULE_LENGTH != CAPSULE_LENGTH) 1389 if (m_tainted_CAPSULE_LENGTH != CAPSULE_LENGTH)
1387 {
1388 if (Shell != IntPtr.Zero && Body != IntPtr.Zero && Amotor != IntPtr.Zero)
1389 { 1390 {
1391 if (Shell != IntPtr.Zero && Body != IntPtr.Zero && Amotor != IntPtr.Zero)
1392 {
1390 1393
1391 m_pidControllerActive = true; 1394 m_pidControllerActive = true;
1392 // no lock needed on _parent_scene.OdeLock because we are called from within the thread lock in OdePlugin's simulate() 1395 // no lock needed on _parent_scene.OdeLock because we are called from within the thread lock in OdePlugin's simulate()
1393 d.JointDestroy(Amotor); 1396 d.JointDestroy(Amotor);
1394 float prevCapsule = CAPSULE_LENGTH; 1397 float prevCapsule = CAPSULE_LENGTH;
1395 CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH; 1398 CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH;
1396 //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); 1399 //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
1397 d.BodyDestroy(Body); 1400 d.BodyDestroy(Body);
1398 AvatarGeomAndBodyCreation(_position.X, _position.Y, 1401 AvatarGeomAndBodyCreation(_position.X, _position.Y,
1399 _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor); 1402 _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
1400 Velocity = Vector3.Zero; 1403 Velocity = Vector3.Zero;
1401 } 1404 }
1402 else 1405 else
1403 { 1406 {
1404 m_log.Warn("[PHYSICS]: trying to change capsule size, but the following ODE data is missing - " 1407 m_log.Warn("[PHYSICS]: trying to change capsule size, but the following ODE data is missing - "
1405 + (Shell==IntPtr.Zero ? "Shell ":"") 1408 + (Shell==IntPtr.Zero ? "Shell ":"")
1406 + (Body==IntPtr.Zero ? "Body ":"") 1409 + (Body==IntPtr.Zero ? "Body ":"")
1407 + (Amotor==IntPtr.Zero ? "Amotor ":"")); 1410 + (Amotor==IntPtr.Zero ? "Amotor ":""));
1411 }
1408 } 1412 }
1409 }
1410 1413
1411 if (!m_taintPosition.ApproxEquals(_position, 0.05f)) 1414 if (!m_taintPosition.ApproxEquals(_position, 0.05f))
1412 {
1413 if (Body != IntPtr.Zero)
1414 { 1415 {
1415 d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z); 1416 if (Body != IntPtr.Zero)
1417 {
1418 d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z);
1416 1419
1417 _position.X = m_taintPosition.X; 1420 _position.X = m_taintPosition.X;
1418 _position.Y = m_taintPosition.Y; 1421 _position.Y = m_taintPosition.Y;
1419 _position.Z = m_taintPosition.Z; 1422 _position.Z = m_taintPosition.Z;
1423 }
1420 } 1424 }
1421 }
1422 1425
1426 }
1423 } 1427 }
1424 1428
1425 internal void AddCollisionFrameTime(int p) 1429 internal void AddCollisionFrameTime(int p)