aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorUbitUmarov2012-04-29 08:24:41 +0100
committerUbitUmarov2012-04-29 08:24:41 +0100
commitbe176b1e4948059e041d06be2caea1eb10b5ee68 (patch)
tree7bc5ce209d67fa67bb95f813f9ff96f53a0bd30c
parent llGetGeometricCenter... (diff)
downloadopensim-SC-be176b1e4948059e041d06be2caea1eb10b5ee68.zip
opensim-SC-be176b1e4948059e041d06be2caea1eb10b5ee68.tar.gz
opensim-SC-be176b1e4948059e041d06be2caea1eb10b5ee68.tar.bz2
opensim-SC-be176b1e4948059e041d06be2caea1eb10b5ee68.tar.xz
ubitode fix inertia for same cases. Added a nasty lock on llGetCenterOfMass and simulate
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs178
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs10
2 files changed, 91 insertions, 97 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
index c9a453d..2bcce31 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
@@ -449,54 +449,57 @@ namespace OpenSim.Region.Physics.OdePlugin
449 { 449 {
450 get 450 get
451 { 451 {
452 d.Vector3 dtmp; 452 lock (_parent_scene.OdeLock)
453 if (!childPrim && Body != IntPtr.Zero)
454 {
455 dtmp = d.BodyGetPosition(Body);
456 return new Vector3(dtmp.X, dtmp.Y, dtmp.Z);
457 }
458 else if (prim_geom != IntPtr.Zero)
459 { 453 {
460 d.Quaternion dq; 454 d.Vector3 dtmp;
461 d.GeomCopyQuaternion(prim_geom, out dq); 455 if (!childPrim && Body != IntPtr.Zero)
462 Quaternion q;
463 q.X = dq.X;
464 q.Y = dq.Y;
465 q.Z = dq.Z;
466 q.W = dq.W;
467
468 Vector3 Ptot = primOOBoffset * q;
469 dtmp = d.GeomGetPosition(prim_geom);
470 Ptot.X += dtmp.X;
471 Ptot.Y += dtmp.Y;
472 Ptot.Z += dtmp.Z;
473
474// if(childPrim) we only know about physical linksets
475 return Ptot;
476/*
477 float tmass = _mass;
478 Ptot *= tmass;
479
480 float m;
481
482 foreach (OdePrim prm in childrenPrim)
483 { 456 {
484 m = prm._mass; 457 dtmp = d.BodyGetPosition(Body);
485 Ptot += prm.CenterOfMass * m; 458 return new Vector3(dtmp.X, dtmp.Y, dtmp.Z);
486 tmass += m; 459 }
460 else if (prim_geom != IntPtr.Zero)
461 {
462 d.Quaternion dq;
463 d.GeomCopyQuaternion(prim_geom, out dq);
464 Quaternion q;
465 q.X = dq.X;
466 q.Y = dq.Y;
467 q.Z = dq.Z;
468 q.W = dq.W;
469
470 Vector3 Ptot = primOOBoffset * q;
471 dtmp = d.GeomGetPosition(prim_geom);
472 Ptot.X += dtmp.X;
473 Ptot.Y += dtmp.Y;
474 Ptot.Z += dtmp.Z;
475
476 // if(childPrim) we only know about physical linksets
477 return Ptot;
478 /*
479 float tmass = _mass;
480 Ptot *= tmass;
481
482 float m;
483
484 foreach (OdePrim prm in childrenPrim)
485 {
486 m = prm._mass;
487 Ptot += prm.CenterOfMass * m;
488 tmass += m;
489 }
490
491 if (tmass == 0)
492 tmass = 0;
493 else
494 tmass = 1.0f / tmass;
495
496 Ptot *= tmass;
497 return Ptot;
498 */
487 } 499 }
488
489 if (tmass == 0)
490 tmass = 0;
491 else 500 else
492 tmass = 1.0f / tmass; 501 return _position;
493
494 Ptot *= tmass;
495 return Ptot;
496 */
497 } 502 }
498 else
499 return _position;
500 } 503 }
501 } 504 }
502 /* 505 /*
@@ -1511,7 +1514,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1511 } 1514 }
1512 Body = IntPtr.Zero; 1515 Body = IntPtr.Zero;
1513 hasOOBoffsetFromMesh = false; 1516 hasOOBoffsetFromMesh = false;
1514 CalcPrimBodyData();
1515 } 1517 }
1516/* 1518/*
1517 private void ChildSetGeom(OdePrim odePrim) 1519 private void ChildSetGeom(OdePrim odePrim)
@@ -1601,7 +1603,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1601 1603
1602 Body = d.BodyCreate(_parent_scene.world); 1604 Body = d.BodyCreate(_parent_scene.world);
1603 1605
1604 DMassDup(ref primdMass, out objdmass); 1606 objdmass = primdMass;
1605 1607
1606 // rotate inertia 1608 // rotate inertia
1607 myrot.X = _orientation.X; 1609 myrot.X = _orientation.X;
@@ -1623,9 +1625,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1623 d.Mass tmpdmass = new d.Mass { }; 1625 d.Mass tmpdmass = new d.Mass { };
1624 Vector3 rcm; 1626 Vector3 rcm;
1625 1627
1626 rcm.X = _position.X + objdmass.c.X; 1628 rcm.X = _position.X;
1627 rcm.Y = _position.Y + objdmass.c.Y; 1629 rcm.Y = _position.Y;
1628 rcm.Z = _position.Z + objdmass.c.Z; 1630 rcm.Z = _position.Z;
1629 1631
1630 lock (childrenPrim) 1632 lock (childrenPrim)
1631 { 1633 {
@@ -1637,7 +1639,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1637 continue; 1639 continue;
1638 } 1640 }
1639 1641
1640 DMassCopy(ref prm.primdMass, ref tmpdmass); 1642 tmpdmass = prm.primdMass;
1641 1643
1642 // apply prim current rotation to inertia 1644 // apply prim current rotation to inertia
1643 quat.X = prm._orientation.X; 1645 quat.X = prm._orientation.X;
@@ -1648,10 +1650,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1648 d.MassRotate(ref tmpdmass, ref mat); 1650 d.MassRotate(ref tmpdmass, ref mat);
1649 1651
1650 Vector3 ppos = prm._position; 1652 Vector3 ppos = prm._position;
1651 ppos.X += tmpdmass.c.X - rcm.X; 1653 ppos.X -= rcm.X;
1652 ppos.Y += tmpdmass.c.Y - rcm.Y; 1654 ppos.Y -= rcm.Y;
1653 ppos.Z += tmpdmass.c.Z - rcm.Z; 1655 ppos.Z -= rcm.Z;
1654
1655 // refer inertia to root prim center of mass position 1656 // refer inertia to root prim center of mass position
1656 d.MassTranslate(ref tmpdmass, 1657 d.MassTranslate(ref tmpdmass,
1657 ppos.X, 1658 ppos.X,
@@ -1683,9 +1684,13 @@ namespace OpenSim.Region.Physics.OdePlugin
1683 d.GeomSetOffsetWorldPosition(prim_geom, _position.X, _position.Y, _position.Z); 1684 d.GeomSetOffsetWorldPosition(prim_geom, _position.X, _position.Y, _position.Z);
1684 1685
1685 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body 1686 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body
1686 myrot.W = -myrot.W; 1687 myrot.X = -myrot.X;
1688 myrot.Y = -myrot.Y;
1689 myrot.Z = -myrot.Z;
1690
1687 d.RfromQ(out mymat, ref myrot); 1691 d.RfromQ(out mymat, ref myrot);
1688 d.MassRotate(ref objdmass, ref mymat); 1692 d.MassRotate(ref objdmass, ref mymat);
1693
1689 d.BodySetMass(Body, ref objdmass); 1694 d.BodySetMass(Body, ref objdmass);
1690 _mass = objdmass.mass; 1695 _mass = objdmass.mass;
1691 1696
@@ -2237,7 +2242,33 @@ namespace OpenSim.Region.Physics.OdePlugin
2237 case ProfileShape.HalfCircle: 2242 case ProfileShape.HalfCircle:
2238 if (_pbs.PathCurve == (byte)Extrusion.Curve1) 2243 if (_pbs.PathCurve == (byte)Extrusion.Curve1)
2239 { 2244 {
2240 volume *= 0.52359877559829887307710723054658f; 2245 volume *= 0.5236f;
2246
2247 if (hollowAmount > 0.0)
2248 {
2249 hollowVolume *= hollowAmount;
2250
2251 switch (_pbs.HollowShape)
2252 {
2253 case HollowShape.Circle:
2254 case HollowShape.Triangle: // diference in sl is minor and odd
2255 case HollowShape.Same:
2256 break;
2257
2258 case HollowShape.Square:
2259 hollowVolume *= 0.909f;
2260 break;
2261
2262 // case HollowShape.Triangle:
2263 // hollowVolume *= .827f;
2264 // break;
2265 default:
2266 hollowVolume = 0;
2267 break;
2268 }
2269 volume *= (1.0f - hollowVolume);
2270 }
2271
2241 } 2272 }
2242 break; 2273 break;
2243 2274
@@ -3704,24 +3735,6 @@ namespace OpenSim.Region.Physics.OdePlugin
3704 return true; 3735 return true;
3705 } 3736 }
3706 3737
3707 internal static void DMassCopy(ref d.Mass src, ref d.Mass dst)
3708 {
3709 dst.c.W = src.c.W;
3710 dst.c.X = src.c.X;
3711 dst.c.Y = src.c.Y;
3712 dst.c.Z = src.c.Z;
3713 dst.mass = src.mass;
3714 dst.I.M00 = src.I.M00;
3715 dst.I.M01 = src.I.M01;
3716 dst.I.M02 = src.I.M02;
3717 dst.I.M10 = src.I.M10;
3718 dst.I.M11 = src.I.M11;
3719 dst.I.M12 = src.I.M12;
3720 dst.I.M20 = src.I.M20;
3721 dst.I.M21 = src.I.M21;
3722 dst.I.M22 = src.I.M22;
3723 }
3724
3725 internal static void DMassSubPartFromObj(ref d.Mass part, ref d.Mass theobj) 3738 internal static void DMassSubPartFromObj(ref d.Mass part, ref d.Mass theobj)
3726 { 3739 {
3727 // assumes object center of mass is zero 3740 // assumes object center of mass is zero
@@ -3745,25 +3758,6 @@ namespace OpenSim.Region.Physics.OdePlugin
3745 theobj.I.M22 -= part.I.M22; 3758 theobj.I.M22 -= part.I.M22;
3746 } 3759 }
3747 3760
3748 private static void DMassDup(ref d.Mass src, out d.Mass dst)
3749 {
3750 dst = new d.Mass { };
3751
3752 dst.c.W = src.c.W;
3753 dst.c.X = src.c.X;
3754 dst.c.Y = src.c.Y;
3755 dst.c.Z = src.c.Z;
3756 dst.mass = src.mass;
3757 dst.I.M00 = src.I.M00;
3758 dst.I.M01 = src.I.M01;
3759 dst.I.M02 = src.I.M02;
3760 dst.I.M10 = src.I.M10;
3761 dst.I.M11 = src.I.M11;
3762 dst.I.M12 = src.I.M12;
3763 dst.I.M20 = src.I.M20;
3764 dst.I.M21 = src.I.M21;
3765 dst.I.M22 = src.I.M22;
3766 }
3767 private void donullchange() 3761 private void donullchange()
3768 { 3762 {
3769 } 3763 }
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index fa3d33e..84195d3 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -301,7 +301,7 @@ namespace OpenSim.Region.Physics.OdePlugin
301 // split static geometry collision into a grid as before 301 // split static geometry collision into a grid as before
302 private IntPtr[,] staticPrimspace; 302 private IntPtr[,] staticPrimspace;
303 303
304 private Object OdeLock; 304 public Object OdeLock;
305 private static Object SimulationLock; 305 private static Object SimulationLock;
306 306
307 public IMesher mesher; 307 public IMesher mesher;
@@ -746,8 +746,7 @@ namespace OpenSim.Region.Physics.OdePlugin
746 ); 746 );
747 // do volume detection case 747 // do volume detection case
748 if ( 748 if (
749 (p1 is OdePrim) && (((OdePrim)p1).m_isVolumeDetect) || 749 (p1.IsVolumeDtc || p2.IsVolumeDtc))
750 (p2 is OdePrim) && (((OdePrim)p2).m_isVolumeDetect))
751 { 750 {
752 collision_accounting_events(p1, p2, maxDepthContact); 751 collision_accounting_events(p1, p2, maxDepthContact);
753 return; 752 return;
@@ -1024,9 +1023,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1024 bool p1events = p1.SubscribedEvents(); 1023 bool p1events = p1.SubscribedEvents();
1025 bool p2events = p2.SubscribedEvents(); 1024 bool p2events = p2.SubscribedEvents();
1026 1025
1027 if (p1 is OdePrim && p1.IsVolumeDtc) 1026 if (p1.IsVolumeDtc)
1028 p2events = false; 1027 p2events = false;
1029 if (p2 is OdePrim && p2.IsVolumeDtc) 1028 if (p2.IsVolumeDtc)
1030 p1events = false; 1029 p1events = false;
1031 1030
1032 if (!(p2events || p1events)) 1031 if (!(p2events || p1events))
@@ -1725,6 +1724,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1725// checkThread(); 1724// checkThread();
1726 1725
1727 lock (SimulationLock) 1726 lock (SimulationLock)
1727 lock(OdeLock)
1728 { 1728 {
1729 // adjust number of iterations per step 1729 // adjust number of iterations per step
1730 try 1730 try