aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorUbitUmarov2012-04-24 23:13:57 +0100
committerUbitUmarov2012-04-24 23:13:57 +0100
commit3da613adf5c803edfcca41f260017b96b1d80fb5 (patch)
tree4fb2c7213c562fd764a3cc51477e806ea8538198
parentSOG bug fix in UI object changes (diff)
downloadopensim-SC-3da613adf5c803edfcca41f260017b96b1d80fb5.zip
opensim-SC-3da613adf5c803edfcca41f260017b96b1d80fb5.tar.gz
opensim-SC-3da613adf5c803edfcca41f260017b96b1d80fb5.tar.bz2
opensim-SC-3da613adf5c803edfcca41f260017b96b1d80fb5.tar.xz
fix chODE loosing some part positions when doing isPhysical false
-rw-r--r--OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs45
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs8
2 files changed, 42 insertions, 11 deletions
diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
index 77ea2af..5b743e8 100644
--- a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
@@ -461,6 +461,13 @@ namespace OpenSim.Region.Physics.OdePlugin
461 } 461 }
462 } 462 }
463 463
464 public override bool IsVolumeDtc
465 {
466 set { return; }
467 get { return m_isVolumeDetect; }
468
469 }
470
464 public override bool Phantom 471 public override bool Phantom
465 { 472 {
466 get { return m_isphantom; } 473 get { return m_isphantom; }
@@ -598,6 +605,7 @@ namespace OpenSim.Region.Physics.OdePlugin
598 } 605 }
599 } 606 }
600 607
608
601 public override Vector3 CenterOfMass 609 public override Vector3 CenterOfMass
602 { 610 {
603 get { return Vector3.Zero; } 611 get { return Vector3.Zero; }
@@ -1372,6 +1380,25 @@ namespace OpenSim.Region.Physics.OdePlugin
1372 } 1380 }
1373 } 1381 }
1374 1382
1383
1384 private void UpdateDataFromGeom()
1385 {
1386 if (prim_geom != IntPtr.Zero)
1387 {
1388 d.Quaternion qtmp;
1389 d.GeomCopyQuaternion(prim_geom, out qtmp);
1390 _orientation.W = qtmp.W;
1391 _orientation.X = qtmp.X;
1392 _orientation.Y = qtmp.Y;
1393 _orientation.Z = qtmp.Z;
1394
1395 d.Vector3 lpos = d.GeomGetPosition(prim_geom);
1396 _position.X = lpos.X;
1397 _position.Y = lpos.Y;
1398 _position.Z = lpos.Z;
1399 }
1400 }
1401
1375 public void disableBody() 1402 public void disableBody()
1376 { 1403 {
1377 //this kills the body so things like 'mesh' can re-create it. 1404 //this kills the body so things like 'mesh' can re-create it.
@@ -1400,25 +1427,31 @@ namespace OpenSim.Region.Physics.OdePlugin
1400 } 1427 }
1401 } 1428 }
1402 1429
1403 d.BodyDestroy(Body); 1430 UpdateDataFromGeom();
1431
1404 lock (childrenPrim) 1432 lock (childrenPrim)
1405 { 1433 {
1406 if (childrenPrim.Count > 0) 1434 if (childrenPrim.Count > 0)
1407 { 1435 {
1408 foreach (OdePrim prm in childrenPrim) 1436 foreach (OdePrim prm in childrenPrim)
1409 { 1437 {
1410 if (prm.m_NoColide && prm.prim_geom != IntPtr.Zero) 1438 if (prm.prim_geom != IntPtr.Zero)
1411 { 1439 {
1412 d.GeomSetCategoryBits(prm.prim_geom, 0); 1440 if (prm.m_NoColide)
1413 d.GeomSetCollideBits(prm.prim_geom, 0); 1441 {
1414 d.GeomDisable(prm.prim_geom); 1442 d.GeomSetCategoryBits(prm.prim_geom, 0);
1443 d.GeomSetCollideBits(prm.prim_geom, 0);
1444 d.GeomDisable(prm.prim_geom);
1445
1446 }
1447 prm.UpdateDataFromGeom();
1415 } 1448 }
1416
1417 _parent_scene.remActivePrim(prm); 1449 _parent_scene.remActivePrim(prm);
1418 prm.Body = IntPtr.Zero; 1450 prm.Body = IntPtr.Zero;
1419 } 1451 }
1420 } 1452 }
1421 } 1453 }
1454 d.BodyDestroy(Body);
1422 Body = IntPtr.Zero; 1455 Body = IntPtr.Zero;
1423 } 1456 }
1424 } 1457 }
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
index dc6c18d..2d587ab 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
@@ -2467,15 +2467,14 @@ namespace OpenSim.Region.Physics.OdePlugin
2467 { 2467 {
2468 if (prim_geom != IntPtr.Zero) 2468 if (prim_geom != IntPtr.Zero)
2469 { 2469 {
2470 d.Quaternion qtmp = new d.Quaternion { }; 2470 d.Quaternion qtmp;
2471 d.GeomCopyQuaternion(prim_geom, out qtmp); 2471 d.GeomCopyQuaternion(prim_geom, out qtmp);
2472 _orientation.W = qtmp.W; 2472 _orientation.W = qtmp.W;
2473 _orientation.X = qtmp.X; 2473 _orientation.X = qtmp.X;
2474 _orientation.Y = qtmp.Y; 2474 _orientation.Y = qtmp.Y;
2475 _orientation.Z = qtmp.Z; 2475 _orientation.Z = qtmp.Z;
2476 2476
2477 d.Vector3 lpos; 2477 d.Vector3 lpos = d.GeomGetPosition(prim_geom);
2478 d.GeomCopyPosition(prim_geom, out lpos);
2479 _position.X = lpos.X; 2478 _position.X = lpos.X;
2480 _position.Y = lpos.Y; 2479 _position.Y = lpos.Y;
2481 _position.Z = lpos.Z; 2480 _position.Z = lpos.Z;
@@ -3565,8 +3564,7 @@ namespace OpenSim.Region.Physics.OdePlugin
3565 { 3564 {
3566 bool lastZeroFlag = _zeroFlag; 3565 bool lastZeroFlag = _zeroFlag;
3567 3566
3568 d.Vector3 lpos; 3567 d.Vector3 lpos = d.GeomGetPosition(prim_geom);
3569 d.GeomCopyPosition(prim_geom, out lpos); // root position that is seem by rest of simulator
3570 3568
3571 d.Quaternion ori; 3569 d.Quaternion ori;
3572 d.GeomCopyQuaternion(prim_geom, out ori); 3570 d.GeomCopyQuaternion(prim_geom, out ori);