aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/PhysicsModules
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/PhysicsModules')
-rw-r--r--OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs36
-rw-r--r--OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs253
2 files changed, 243 insertions, 46 deletions
diff --git a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs
index 33f0337..ad9b28f 100644
--- a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs
+++ b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs
@@ -55,6 +55,28 @@ namespace OpenSim.Region.PhysicsModules.SharedBase
55 Absolute 55 Absolute
56 } 56 }
57 57
58 public class PhysicsInertiaData
59 {
60 public float TotalMass; // the total mass of a linkset
61 public Vector3 CenterOfMass; // the center of mass position relative to root part position
62 public Vector3 Inertia; // (Ixx, Iyy, Izz) moment of inertia relative to center of mass and principal axis in local coords
63 public Vector4 InertiaRotation; // if principal axis don't match local axis, the principal axis rotation
64 // or the upper triangle of the inertia tensor
65 // Ixy (= Iyx), Ixz (= Izx), Iyz (= Izy))
66
67 public PhysicsInertiaData()
68 {
69 }
70
71 public PhysicsInertiaData(PhysicsInertiaData source)
72 {
73 TotalMass = source.TotalMass;
74 CenterOfMass = source.CenterOfMass;
75 Inertia = source.Inertia;
76 InertiaRotation = source.InertiaRotation;
77 }
78 }
79
58 public struct CameraData 80 public struct CameraData
59 { 81 {
60 public Quaternion CameraRotation; 82 public Quaternion CameraRotation;
@@ -463,6 +485,20 @@ namespace OpenSim.Region.PhysicsModules.SharedBase
463 485
464 public virtual void AddCollisionEvent(uint CollidedWith, ContactPoint contact) { } 486 public virtual void AddCollisionEvent(uint CollidedWith, ContactPoint contact) { }
465 487
488 public virtual PhysicsInertiaData GetInertiaData()
489 {
490 PhysicsInertiaData data = new PhysicsInertiaData();
491 data.TotalMass = this.Mass;
492 data.CenterOfMass = CenterOfMass - Position;
493 data.Inertia = Vector3.Zero;
494 data.InertiaRotation = Vector4.Zero;
495 return data;
496 }
497
498 public virtual void SetInertiaData(PhysicsInertiaData inertia)
499 {
500 }
501
466 // Warning in a parent part it returns itself, not null 502 // Warning in a parent part it returns itself, not null
467 public virtual PhysicsActor ParentActor { get { return this; } } 503 public virtual PhysicsActor ParentActor { get { return this; } }
468 504
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs
index 45ef273..d560b41 100644
--- a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs
+++ b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs
@@ -182,14 +182,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde
182 private float m_streamCost; 182 private float m_streamCost;
183 183
184 public d.Mass primdMass; // prim inertia information on it's own referencial 184 public d.Mass primdMass; // prim inertia information on it's own referencial
185 private PhysicsInertiaData m_InertiaOverride;
185 float primMass; // prim own mass 186 float primMass; // prim own mass
186 float primVolume; // prim own volume; 187 float primVolume; // prim own volume;
187 float _mass; // object mass acording to case 188 float m_mass; // object mass acording to case
188 189
189 public int givefakepos; 190 public int givefakepos;
190 private Vector3 fakepos; 191 private Vector3 fakepos;
191 public int givefakeori; 192 public int givefakeori;
192 private Quaternion fakeori; 193 private Quaternion fakeori;
194 private PhysicsInertiaData m_fakeInertiaOverride;
193 195
194 private int m_eventsubscription; 196 private int m_eventsubscription;
195 private int m_cureventsubscription; 197 private int m_cureventsubscription;
@@ -465,10 +467,110 @@ namespace OpenSim.Region.PhysicsModule.ubOde
465 } 467 }
466 } 468 }
467 469
470 public override PhysicsInertiaData GetInertiaData()
471 {
472 PhysicsInertiaData inertia;
473 if(childPrim)
474 {
475 if(_parent != null)
476 return _parent.GetInertiaData();
477 else
478 {
479 inertia = new PhysicsInertiaData();
480 inertia.TotalMass = -1;
481 return inertia;
482 }
483 }
484
485 inertia = new PhysicsInertiaData();
486
487 // double buffering
488 if(m_fakeInertiaOverride != null)
489 {
490 d.Mass objdmass = new d.Mass();
491 objdmass.I.M00 = m_fakeInertiaOverride.Inertia.X;
492 objdmass.I.M11 = m_fakeInertiaOverride.Inertia.Y;
493 objdmass.I.M22 = m_fakeInertiaOverride.Inertia.Z;
494
495 objdmass.mass = m_fakeInertiaOverride.TotalMass;
496
497 if(Math.Abs(m_fakeInertiaOverride.InertiaRotation.W) < 0.999)
498 {
499 d.Matrix3 inertiarotmat = new d.Matrix3();
500 d.Quaternion inertiarot = new d.Quaternion();
501
502 inertiarot.X = m_fakeInertiaOverride.InertiaRotation.X;
503 inertiarot.Y = m_fakeInertiaOverride.InertiaRotation.Y;
504 inertiarot.Z = m_fakeInertiaOverride.InertiaRotation.Z;
505 inertiarot.W = m_fakeInertiaOverride.InertiaRotation.W;
506 d.RfromQ(out inertiarotmat, ref inertiarot);
507 d.MassRotate(ref objdmass, ref inertiarotmat);
508 }
509
510 inertia.TotalMass = m_fakeInertiaOverride.TotalMass;
511 inertia.CenterOfMass = m_fakeInertiaOverride.CenterOfMass;
512 inertia.Inertia.X = objdmass.I.M00;
513 inertia.Inertia.Y = objdmass.I.M11;
514 inertia.Inertia.Z = objdmass.I.M22;
515 inertia.InertiaRotation.X = objdmass.I.M01;
516 inertia.InertiaRotation.Y = objdmass.I.M02;
517 inertia.InertiaRotation.Z = objdmass.I.M12;
518 return inertia;
519 }
520
521 inertia.TotalMass = m_mass;
522
523 if(Body == IntPtr.Zero || prim_geom == IntPtr.Zero)
524 {
525 inertia.CenterOfMass = Vector3.Zero;
526 inertia.Inertia = Vector3.Zero;
527 inertia.InertiaRotation = Vector4.Zero;
528 return inertia;
529 }
530
531 d.Vector3 dtmp;
532 d.Mass m = new d.Mass();
533 lock(_parent_scene.OdeLock)
534 {
535 d.AllocateODEDataForThread(0);
536 dtmp = d.GeomGetOffsetPosition(prim_geom);
537 d.BodyGetMass(Body, out m);
538 }
539
540 Vector3 cm = new Vector3(-dtmp.X, -dtmp.Y, -dtmp.Z);
541 inertia.CenterOfMass = cm;
542 inertia.Inertia = new Vector3(m.I.M00, m.I.M11, m.I.M22);
543 inertia.InertiaRotation = new Vector4(m.I.M01, m.I.M02 , m.I.M12, 0);
544
545 return inertia;
546 }
547
548 public override void SetInertiaData(PhysicsInertiaData inertia)
549 {
550 if(childPrim)
551 {
552 if(_parent != null)
553 _parent.SetInertiaData(inertia);
554 return;
555 }
556
557 if(inertia.TotalMass > 0)
558 m_fakeInertiaOverride = new PhysicsInertiaData(inertia);
559 else
560 m_fakeInertiaOverride = null;
561
562 if (inertia.TotalMass > _parent_scene.maximumMassObject)
563 inertia.TotalMass = _parent_scene.maximumMassObject;
564 AddChange(changes.SetInertia,(object)m_fakeInertiaOverride);
565 }
566
468 public override Vector3 CenterOfMass 567 public override Vector3 CenterOfMass
469 { 568 {
470 get 569 get
471 { 570 {
571 if(!childPrim && m_fakeInertiaOverride != null)
572 return m_fakeInertiaOverride.CenterOfMass;
573
472 lock (_parent_scene.OdeLock) 574 lock (_parent_scene.OdeLock)
473 { 575 {
474 d.AllocateODEDataForThread(0); 576 d.AllocateODEDataForThread(0);
@@ -922,8 +1024,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde
922 { 1024 {
923 float old = m_density; 1025 float old = m_density;
924 m_density = value / 100f; 1026 m_density = value / 100f;
925 if(m_density != old) 1027 // if(m_density != old)
926 UpdatePrimBodyData(); 1028 // UpdatePrimBodyData();
927 } 1029 }
928 } 1030 }
929 public override float GravModifier 1031 public override float GravModifier
@@ -1716,26 +1818,29 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1716 m_log.Warn("[PHYSICS]: MakeBody root geom already had a body"); 1818 m_log.Warn("[PHYSICS]: MakeBody root geom already had a body");
1717 } 1819 }
1718 1820
1719 d.Matrix3 mymat = new d.Matrix3(); 1821 bool noInertiaOverride = (m_InertiaOverride == null);
1720 d.Quaternion myrot = new d.Quaternion();
1721 d.Mass objdmass = new d.Mass { };
1722 1822
1723 Body = d.BodyCreate(_parent_scene.world); 1823 Body = d.BodyCreate(_parent_scene.world);
1724 1824
1725 objdmass = primdMass; 1825 d.Matrix3 mymat = new d.Matrix3();
1826 d.Quaternion myrot = new d.Quaternion();
1827 d.Mass objdmass = new d.Mass { };
1726 1828
1727 // rotate inertia
1728 myrot.X = _orientation.X; 1829 myrot.X = _orientation.X;
1729 myrot.Y = _orientation.Y; 1830 myrot.Y = _orientation.Y;
1730 myrot.Z = _orientation.Z; 1831 myrot.Z = _orientation.Z;
1731 myrot.W = _orientation.W; 1832 myrot.W = _orientation.W;
1732
1733 d.RfromQ(out mymat, ref myrot); 1833 d.RfromQ(out mymat, ref myrot);
1734 d.MassRotate(ref objdmass, ref mymat);
1735 1834
1736 // set the body rotation 1835 // set the body rotation
1737 d.BodySetRotation(Body, ref mymat); 1836 d.BodySetRotation(Body, ref mymat);
1738 1837
1838 if(noInertiaOverride)
1839 {
1840 objdmass = primdMass;
1841 d.MassRotate(ref objdmass, ref mymat);
1842 }
1843
1739 // recompute full object inertia if needed 1844 // recompute full object inertia if needed
1740 if (childrenPrim.Count > 0) 1845 if (childrenPrim.Count > 0)
1741 { 1846 {
@@ -1758,27 +1863,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1758 continue; 1863 continue;
1759 } 1864 }
1760 1865
1761 tmpdmass = prm.primdMass;
1762
1763 // apply prim current rotation to inertia
1764 quat.X = prm._orientation.X; 1866 quat.X = prm._orientation.X;
1765 quat.Y = prm._orientation.Y; 1867 quat.Y = prm._orientation.Y;
1766 quat.Z = prm._orientation.Z; 1868 quat.Z = prm._orientation.Z;
1767 quat.W = prm._orientation.W; 1869 quat.W = prm._orientation.W;
1768 d.RfromQ(out mat, ref quat); 1870 d.RfromQ(out mat, ref quat);
1769 d.MassRotate(ref tmpdmass, ref mat); 1871
1770
1771 Vector3 ppos = prm._position;
1772 ppos.X -= rcm.X;
1773 ppos.Y -= rcm.Y;
1774 ppos.Z -= rcm.Z;
1775 // refer inertia to root prim center of mass position
1776 d.MassTranslate(ref tmpdmass,
1777 ppos.X,
1778 ppos.Y,
1779 ppos.Z);
1780
1781 d.MassAdd(ref objdmass, ref tmpdmass); // add to total object inertia
1782 // fix prim colision cats 1872 // fix prim colision cats
1783 1873
1784 if (d.GeomGetBody(prm.prim_geom) != IntPtr.Zero) 1874 if (d.GeomGetBody(prm.prim_geom) != IntPtr.Zero)
@@ -1791,6 +1881,24 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1791 d.GeomSetBody(prm.prim_geom, Body); 1881 d.GeomSetBody(prm.prim_geom, Body);
1792 prm.Body = Body; 1882 prm.Body = Body;
1793 d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat); // set relative rotation 1883 d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat); // set relative rotation
1884
1885 if(noInertiaOverride)
1886 {
1887 tmpdmass = prm.primdMass;
1888
1889 d.MassRotate(ref tmpdmass, ref mat);
1890 Vector3 ppos = prm._position;
1891 ppos.X -= rcm.X;
1892 ppos.Y -= rcm.Y;
1893 ppos.Z -= rcm.Z;
1894 // refer inertia to root prim center of mass position
1895 d.MassTranslate(ref tmpdmass,
1896 ppos.X,
1897 ppos.Y,
1898 ppos.Z);
1899
1900 d.MassAdd(ref objdmass, ref tmpdmass); // add to total object inertia
1901 }
1794 } 1902 }
1795 } 1903 }
1796 } 1904 }
@@ -1799,19 +1907,60 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1799 // associate root geom with body 1907 // associate root geom with body
1800 d.GeomSetBody(prim_geom, Body); 1908 d.GeomSetBody(prim_geom, Body);
1801 1909
1802 d.BodySetPosition(Body, _position.X + objdmass.c.X, _position.Y + objdmass.c.Y, _position.Z + objdmass.c.Z); 1910 if(noInertiaOverride)
1911 d.BodySetPosition(Body, _position.X + objdmass.c.X, _position.Y + objdmass.c.Y, _position.Z + objdmass.c.Z);
1912 else
1913 {
1914 Vector3 ncm = m_InertiaOverride.CenterOfMass * _orientation;
1915 d.BodySetPosition(Body,
1916 _position.X + ncm.X,
1917 _position.Y + ncm.Y,
1918 _position.Z + ncm.Z);
1919 }
1920
1803 d.GeomSetOffsetWorldPosition(prim_geom, _position.X, _position.Y, _position.Z); 1921 d.GeomSetOffsetWorldPosition(prim_geom, _position.X, _position.Y, _position.Z);
1804 1922
1805 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body 1923 if(noInertiaOverride)
1806 myrot.X = -myrot.X; 1924 {
1807 myrot.Y = -myrot.Y; 1925 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body
1808 myrot.Z = -myrot.Z; 1926 myrot.X = -myrot.X;
1927 myrot.Y = -myrot.Y;
1928 myrot.Z = -myrot.Z;
1809 1929
1810 d.RfromQ(out mymat, ref myrot); 1930 d.RfromQ(out mymat, ref myrot);
1811 d.MassRotate(ref objdmass, ref mymat); 1931 d.MassRotate(ref objdmass, ref mymat);
1812 1932
1813 d.BodySetMass(Body, ref objdmass); 1933 d.BodySetMass(Body, ref objdmass);
1814 _mass = objdmass.mass; 1934 m_mass = objdmass.mass;
1935 }
1936 else
1937 {
1938 objdmass.c.X = 0;
1939 objdmass.c.Y = 0;
1940 objdmass.c.Z = 0;
1941
1942 objdmass.I.M00 = m_InertiaOverride.Inertia.X;
1943 objdmass.I.M11 = m_InertiaOverride.Inertia.Y;
1944 objdmass.I.M22 = m_InertiaOverride.Inertia.Z;
1945
1946 objdmass.mass = m_InertiaOverride.TotalMass;
1947
1948 if(Math.Abs(m_InertiaOverride.InertiaRotation.W) < 0.999)
1949 {
1950 d.Matrix3 inertiarotmat = new d.Matrix3();
1951 d.Quaternion inertiarot = new d.Quaternion();
1952
1953 inertiarot.X = m_InertiaOverride.InertiaRotation.X;
1954 inertiarot.Y = m_InertiaOverride.InertiaRotation.Y;
1955 inertiarot.Z = m_InertiaOverride.InertiaRotation.Z;
1956 inertiarot.W = m_InertiaOverride.InertiaRotation.W;
1957 d.RfromQ(out inertiarotmat, ref inertiarot);
1958 d.MassRotate(ref objdmass, ref inertiarotmat);
1959 }
1960 d.BodySetMass(Body, ref objdmass);
1961
1962 m_mass = objdmass.mass;
1963 }
1815 1964
1816 // disconnect from world gravity so we can apply buoyancy 1965 // disconnect from world gravity so we can apply buoyancy
1817 d.BodySetGravityMode(Body, false); 1966 d.BodySetGravityMode(Body, false);
@@ -1990,7 +2139,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1990 SetInStaticSpace(prm); 2139 SetInStaticSpace(prm);
1991 } 2140 }
1992 prm.Body = IntPtr.Zero; 2141 prm.Body = IntPtr.Zero;
1993 prm._mass = prm.primMass; 2142 prm.m_mass = prm.primMass;
1994 prm.m_collisionscore = 0; 2143 prm.m_collisionscore = 0;
1995 } 2144 }
1996 } 2145 }
@@ -2004,7 +2153,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
2004 } 2153 }
2005 Body = IntPtr.Zero; 2154 Body = IntPtr.Zero;
2006 } 2155 }
2007 _mass = primMass; 2156 m_mass = primMass;
2008 m_collisionscore = 0; 2157 m_collisionscore = 0;
2009 } 2158 }
2010 2159
@@ -2081,7 +2230,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
2081 d.BodySetPosition(Body, dobjpos.X + thispos.X, dobjpos.Y + thispos.Y, dobjpos.Z + thispos.Z); 2230 d.BodySetPosition(Body, dobjpos.X + thispos.X, dobjpos.Y + thispos.Y, dobjpos.Z + thispos.Z);
2082 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body 2231 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body
2083 d.BodySetMass(Body, ref objdmass); 2232 d.BodySetMass(Body, ref objdmass);
2084 _mass = objdmass.mass; 2233 m_mass = objdmass.mass;
2085 } 2234 }
2086 2235
2087 private void FixInertia(Vector3 NewPos) 2236 private void FixInertia(Vector3 NewPos)
@@ -2145,7 +2294,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
2145 d.BodySetPosition(Body, dobjpos.X + thispos.X, dobjpos.Y + thispos.Y, dobjpos.Z + thispos.Z); 2294 d.BodySetPosition(Body, dobjpos.X + thispos.X, dobjpos.Y + thispos.Y, dobjpos.Z + thispos.Z);
2146 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body 2295 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body
2147 d.BodySetMass(Body, ref objdmass); 2296 d.BodySetMass(Body, ref objdmass);
2148 _mass = objdmass.mass; 2297 m_mass = objdmass.mass;
2149 } 2298 }
2150 2299
2151 private void FixInertia(Quaternion newrot) 2300 private void FixInertia(Quaternion newrot)
@@ -2211,7 +2360,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
2211 d.BodySetPosition(Body, dobjpos.X + thispos.X, dobjpos.Y + thispos.Y, dobjpos.Z + thispos.Z); 2360 d.BodySetPosition(Body, dobjpos.X + thispos.X, dobjpos.Y + thispos.Y, dobjpos.Z + thispos.Z);
2212 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body 2361 d.MassTranslate(ref objdmass, -objdmass.c.X, -objdmass.c.Y, -objdmass.c.Z); // ode wants inertia at center of body
2213 d.BodySetMass(Body, ref objdmass); 2362 d.BodySetMass(Body, ref objdmass);
2214 _mass = objdmass.mass; 2363 m_mass = objdmass.mass;
2215 } 2364 }
2216 2365
2217 2366
@@ -2226,7 +2375,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
2226 if (primMass > _parent_scene.maximumMassObject) 2375 if (primMass > _parent_scene.maximumMassObject)
2227 primMass = _parent_scene.maximumMassObject; 2376 primMass = _parent_scene.maximumMassObject;
2228 2377
2229 _mass = primMass; // just in case 2378 m_mass = primMass; // just in case
2230 2379
2231 d.MassSetBoxTotal(out primdMass, primMass, 2.0f * m_OBB.X, 2.0f * m_OBB.Y, 2.0f * m_OBB.Z); 2380 d.MassSetBoxTotal(out primdMass, primMass, 2.0f * m_OBB.X, 2.0f * m_OBB.Y, 2.0f * m_OBB.Z);
2232 2381
@@ -3306,6 +3455,15 @@ namespace OpenSim.Region.PhysicsModule.ubOde
3306 m_useHoverPID = active; 3455 m_useHoverPID = active;
3307 } 3456 }
3308 3457
3458 private void changeInertia(PhysicsInertiaData inertia)
3459 {
3460 m_InertiaOverride = inertia;
3461
3462 if (Body != IntPtr.Zero)
3463 DestroyBody();
3464 MakeBody();
3465 }
3466
3309 #endregion 3467 #endregion
3310 3468
3311 public void Move() 3469 public void Move()
@@ -3346,7 +3504,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
3346 float fy = 0; 3504 float fy = 0;
3347 float fz = 0; 3505 float fz = 0;
3348 3506
3349 float m_mass = _mass; 3507 float mass = m_mass;
3350 3508
3351 if (m_usePID && m_PIDTau > 0) 3509 if (m_usePID && m_PIDTau > 0)
3352 { 3510 {
@@ -3453,9 +3611,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde
3453 fz = _parent_scene.gravityz * b; 3611 fz = _parent_scene.gravityz * b;
3454 } 3612 }
3455 3613
3456 fx *= m_mass; 3614 fx *= mass;
3457 fy *= m_mass; 3615 fy *= mass;
3458 fz *= m_mass; 3616 fz *= mass;
3459 3617
3460 // constant force 3618 // constant force
3461 fx += m_force.X; 3619 fx += m_force.X;
@@ -3941,6 +4099,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde
3941 changePIDHoverActive((bool)arg); 4099 changePIDHoverActive((bool)arg);
3942 break; 4100 break;
3943 4101
4102 case changes.SetInertia:
4103 changeInertia((PhysicsInertiaData) arg);
4104 break;
4105
3944 case changes.Null: 4106 case changes.Null:
3945 donullchange(); 4107 donullchange();
3946 break; 4108 break;
@@ -3957,7 +4119,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
3957 _parent_scene.AddChange((PhysicsActor) this, what, arg); 4119 _parent_scene.AddChange((PhysicsActor) this, what, arg);
3958 } 4120 }
3959 4121
3960
3961 private struct strVehicleBoolParam 4122 private struct strVehicleBoolParam
3962 { 4123 {
3963 public int param; 4124 public int param;