diff options
author | Robert Adams | 2012-11-03 21:08:39 -0700 |
---|---|---|
committer | Robert Adams | 2012-11-03 21:16:02 -0700 |
commit | 79f7c466a116bf368423d4e18163f34fd8d66ce1 (patch) | |
tree | 8acd97fa89b1d900f785cec052fedfac7dde6027 | |
parent | BulletSim: search the mesh and hull lists to find shapes if type is not known... (diff) | |
download | opensim-SC-79f7c466a116bf368423d4e18163f34fd8d66ce1.zip opensim-SC-79f7c466a116bf368423d4e18163f34fd8d66ce1.tar.gz opensim-SC-79f7c466a116bf368423d4e18163f34fd8d66ce1.tar.bz2 opensim-SC-79f7c466a116bf368423d4e18163f34fd8d66ce1.tar.xz |
BulletSim: fix compound linkset crash by not freeing shape of child prims.
Remove all compilation warnings (mostly 'protected' in sealed classes.)
Add the dynamicAabbEnable parameter to creation of compound shapes.
Diffstat (limited to '')
6 files changed, 25 insertions, 17 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index 38609e3..819635a 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -89,7 +89,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
89 | 89 | ||
90 | //Angular properties | 90 | //Angular properties |
91 | private Vector3 m_angularMotorDirection = Vector3.Zero; // angular velocity requested by LSL motor | 91 | private Vector3 m_angularMotorDirection = Vector3.Zero; // angular velocity requested by LSL motor |
92 | private int m_angularMotorApply = 0; // application frame counter | 92 | // private int m_angularMotorApply = 0; // application frame counter |
93 | private Vector3 m_angularMotorVelocity = Vector3.Zero; // current angular motor velocity | 93 | private Vector3 m_angularMotorVelocity = Vector3.Zero; // current angular motor velocity |
94 | private float m_angularMotorTimescale = 0; // motor angular velocity ramp up rate | 94 | private float m_angularMotorTimescale = 0; // motor angular velocity ramp up rate |
95 | private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate | 95 | private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate |
@@ -199,7 +199,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
199 | break; | 199 | break; |
200 | case Vehicle.ANGULAR_MOTOR_DIRECTION: | 200 | case Vehicle.ANGULAR_MOTOR_DIRECTION: |
201 | m_angularMotorDirection = new Vector3(pValue, pValue, pValue); | 201 | m_angularMotorDirection = new Vector3(pValue, pValue, pValue); |
202 | m_angularMotorApply = 100; | 202 | // m_angularMotorApply = 100; |
203 | break; | 203 | break; |
204 | case Vehicle.LINEAR_FRICTION_TIMESCALE: | 204 | case Vehicle.LINEAR_FRICTION_TIMESCALE: |
205 | m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue); | 205 | m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue); |
@@ -229,7 +229,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
229 | pValue.Y = Math.Max(-12.56f, Math.Min(pValue.Y, 12.56f)); | 229 | pValue.Y = Math.Max(-12.56f, Math.Min(pValue.Y, 12.56f)); |
230 | pValue.Z = Math.Max(-12.56f, Math.Min(pValue.Z, 12.56f)); | 230 | pValue.Z = Math.Max(-12.56f, Math.Min(pValue.Z, 12.56f)); |
231 | m_angularMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z); | 231 | m_angularMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z); |
232 | m_angularMotorApply = 100; | 232 | // m_angularMotorApply = 100; |
233 | break; | 233 | break; |
234 | case Vehicle.LINEAR_FRICTION_TIMESCALE: | 234 | case Vehicle.LINEAR_FRICTION_TIMESCALE: |
235 | m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); | 235 | m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index 6e68695..12c6d7a 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs | |||
@@ -83,8 +83,8 @@ public sealed class BSLinksetCompound : BSLinkset | |||
83 | public override bool MakeDynamic(BSPhysObject child) | 83 | public override bool MakeDynamic(BSPhysObject child) |
84 | { | 84 | { |
85 | bool ret = false; | 85 | bool ret = false; |
86 | DetailLog("{0},BSLinksetCompound.MakeDynamic,call,isChild={1}", child.LocalID, HasChild(child)); | 86 | DetailLog("{0},BSLinksetCompound.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child)); |
87 | if (HasChild(child)) | 87 | if (!IsRoot(child)) |
88 | { | 88 | { |
89 | // Physical children are removed from the world as the shape ofthe root compound | 89 | // Physical children are removed from the world as the shape ofthe root compound |
90 | // shape takes over. | 90 | // shape takes over. |
@@ -103,8 +103,8 @@ public sealed class BSLinksetCompound : BSLinkset | |||
103 | public override bool MakeStatic(BSPhysObject child) | 103 | public override bool MakeStatic(BSPhysObject child) |
104 | { | 104 | { |
105 | bool ret = false; | 105 | bool ret = false; |
106 | DetailLog("{0},BSLinksetCompound.MakeStatic,call,hasChild={1}", child.LocalID, HasChild(child)); | 106 | DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child)); |
107 | if (HasChild(child)) | 107 | if (!IsRoot(child)) |
108 | { | 108 | { |
109 | // The non-physical children can come back to life. | 109 | // The non-physical children can come back to life. |
110 | BulletSimAPI.RemoveFromCollisionFlags2(child.PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); | 110 | BulletSimAPI.RemoveFromCollisionFlags2(child.PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); |
@@ -240,6 +240,7 @@ public sealed class BSLinksetCompound : BSLinkset | |||
240 | // A mesh or hull is created because scale is not available on a native shape. | 240 | // A mesh or hull is created because scale is not available on a native shape. |
241 | // (TODO: Bullet does have a btScaledCollisionShape. Can that be used?) | 241 | // (TODO: Bullet does have a btScaledCollisionShape. Can that be used?) |
242 | BulletShape saveShape = cPrim.PhysShape; | 242 | BulletShape saveShape = cPrim.PhysShape; |
243 | cPrim.PhysShape.ptr = IntPtr.Zero; // Don't let the create free the child's shape | ||
243 | PhysicsScene.Shapes.CreateGeomMeshOrHull(cPrim, null); | 244 | PhysicsScene.Shapes.CreateGeomMeshOrHull(cPrim, null); |
244 | BulletShape newShape = cPrim.PhysShape; | 245 | BulletShape newShape = cPrim.PhysShape; |
245 | cPrim.PhysShape = saveShape; | 246 | cPrim.PhysShape = saveShape; |
@@ -263,7 +264,7 @@ public sealed class BSLinksetCompound : BSLinkset | |||
263 | float linksetMass = LinksetMass; | 264 | float linksetMass = LinksetMass; |
264 | LinksetRoot.UpdatePhysicalMassProperties(linksetMass); | 265 | LinksetRoot.UpdatePhysicalMassProperties(linksetMass); |
265 | 266 | ||
266 | // DEBUG: see of inter-linkset collisions are causing problems | 267 | // DEBUG: see of inter-linkset collisions are causing problems for constraint linksets. |
267 | // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr, | 268 | // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr, |
268 | // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask); | 269 | // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask); |
269 | 270 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index af403aa..aaa0d93 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -703,6 +703,9 @@ public sealed class BSPrim : BSPhysObject | |||
703 | // For good measure, make sure the transform is set through to the motion state | 703 | // For good measure, make sure the transform is set through to the motion state |
704 | BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); | 704 | BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); |
705 | 705 | ||
706 | // Center of mass is at the center of the object | ||
707 | BulletSimAPI.SetCenterOfMassByPosRot2(Linkset.LinksetRoot.PhysBody.ptr, _position, _orientation); | ||
708 | |||
706 | // A dynamic object has mass | 709 | // A dynamic object has mass |
707 | UpdatePhysicalMassProperties(RawMass); | 710 | UpdatePhysicalMassProperties(RawMass); |
708 | 711 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index c2e0ef1..740f339 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |||
@@ -1391,7 +1391,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters | |||
1391 | // If the local ID is APPLY_TO_NONE, just change the default value | 1391 | // If the local ID is APPLY_TO_NONE, just change the default value |
1392 | // If the localID is APPLY_TO_ALL change the default value and apply the new value to all the lIDs | 1392 | // If the localID is APPLY_TO_ALL change the default value and apply the new value to all the lIDs |
1393 | // If the localID is a specific object, apply the parameter change to only that object | 1393 | // If the localID is a specific object, apply the parameter change to only that object |
1394 | protected void UpdateParameterObject(ref float defaultLoc, string parm, uint localID, float val) | 1394 | private void UpdateParameterObject(ref float defaultLoc, string parm, uint localID, float val) |
1395 | { | 1395 | { |
1396 | List<uint> objectIDs = new List<uint>(); | 1396 | List<uint> objectIDs = new List<uint>(); |
1397 | switch (localID) | 1397 | switch (localID) |
@@ -1416,7 +1416,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters | |||
1416 | } | 1416 | } |
1417 | 1417 | ||
1418 | // schedule the actual updating of the paramter to when the phys engine is not busy | 1418 | // schedule the actual updating of the paramter to when the phys engine is not busy |
1419 | protected void TaintedUpdateParameter(string parm, List<uint> lIDs, float val) | 1419 | private void TaintedUpdateParameter(string parm, List<uint> lIDs, float val) |
1420 | { | 1420 | { |
1421 | float xval = val; | 1421 | float xval = val; |
1422 | List<uint> xlIDs = lIDs; | 1422 | List<uint> xlIDs = lIDs; |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs index 4a31c7d..29a23c0 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs | |||
@@ -38,7 +38,7 @@ public sealed class BSShapeCollection : IDisposable | |||
38 | { | 38 | { |
39 | private static string LogHeader = "[BULLETSIM SHAPE COLLECTION]"; | 39 | private static string LogHeader = "[BULLETSIM SHAPE COLLECTION]"; |
40 | 40 | ||
41 | protected BSScene PhysicsScene { get; set; } | 41 | private BSScene PhysicsScene { get; set; } |
42 | 42 | ||
43 | private Object m_collectionActivityLock = new Object(); | 43 | private Object m_collectionActivityLock = new Object(); |
44 | 44 | ||
@@ -103,11 +103,12 @@ public sealed class BSShapeCollection : IDisposable | |||
103 | { | 103 | { |
104 | // Do we have the correct geometry for this type of object? | 104 | // Do we have the correct geometry for this type of object? |
105 | // Updates prim.BSShape with information/pointers to shape. | 105 | // Updates prim.BSShape with information/pointers to shape. |
106 | // CreateGeom returns 'true' of BSShape as changed to a new shape. | 106 | // Returns 'true' of BSShape is changed to a new shape. |
107 | bool newGeom = CreateGeom(forceRebuild, prim, shapeCallback); | 107 | bool newGeom = CreateGeom(forceRebuild, prim, shapeCallback); |
108 | // If we had to select a new shape geometry for the object, | 108 | // If we had to select a new shape geometry for the object, |
109 | // rebuild the body around it. | 109 | // rebuild the body around it. |
110 | // Updates prim.BSBody with information/pointers to requested body | 110 | // Updates prim.BSBody with information/pointers to requested body |
111 | // Returns 'true' if BSBody was changed. | ||
111 | bool newBody = CreateBody((newGeom || forceRebuild), prim, PhysicsScene.World, | 112 | bool newBody = CreateBody((newGeom || forceRebuild), prim, PhysicsScene.World, |
112 | prim.PhysShape, bodyCallback); | 113 | prim.PhysShape, bodyCallback); |
113 | ret = newGeom || newBody; | 114 | ret = newGeom || newBody; |
@@ -431,6 +432,7 @@ public sealed class BSShapeCollection : IDisposable | |||
431 | return ret; | 432 | return ret; |
432 | } | 433 | } |
433 | 434 | ||
435 | // Create a mesh/hull shape or a native shape if 'nativeShapePossible' is 'true'. | ||
434 | private bool CreateGeomNonSpecial(bool forceRebuild, BSPhysObject prim, ShapeDestructionCallback shapeCallback) | 436 | private bool CreateGeomNonSpecial(bool forceRebuild, BSPhysObject prim, ShapeDestructionCallback shapeCallback) |
435 | { | 437 | { |
436 | bool ret = false; | 438 | bool ret = false; |
@@ -797,15 +799,17 @@ public sealed class BSShapeCollection : IDisposable | |||
797 | private bool GetReferenceToCompoundShape(BSPhysObject prim, ShapeDestructionCallback shapeCallback) | 799 | private bool GetReferenceToCompoundShape(BSPhysObject prim, ShapeDestructionCallback shapeCallback) |
798 | { | 800 | { |
799 | // Remove reference to the old shape | 801 | // Remove reference to the old shape |
800 | // Don't need to do this as the shape is freed when we create the new root shape below. | 802 | // Don't need to do this as the shape is freed when the new root shape is created below. |
801 | // DereferenceShape(prim.PhysShape, true, shapeCallback); | 803 | // DereferenceShape(prim.PhysShape, true, shapeCallback); |
802 | 804 | ||
803 | BulletShape cShape = new BulletShape( | 805 | BulletShape cShape = new BulletShape( |
804 | BulletSimAPI.CreateCompoundShape2(PhysicsScene.World.ptr), ShapeData.PhysicsShapeType.SHAPE_COMPOUND); | 806 | BulletSimAPI.CreateCompoundShape2(PhysicsScene.World.ptr, false), ShapeData.PhysicsShapeType.SHAPE_COMPOUND); |
805 | 807 | ||
806 | // Create the shape for the root prim and add it to the compound shape | 808 | // Create the shape for the root prim and add it to the compound shape. Cannot be a native shape. |
807 | CreateGeomNonSpecial(true, prim, null); | 809 | CreateGeomMeshOrHull(prim, shapeCallback); |
808 | BulletSimAPI.AddChildShapeToCompoundShape2(cShape.ptr, prim.PhysShape.ptr, OMV.Vector3.Zero, OMV.Quaternion.Identity); | 810 | BulletSimAPI.AddChildShapeToCompoundShape2(cShape.ptr, prim.PhysShape.ptr, OMV.Vector3.Zero, OMV.Quaternion.Identity); |
811 | DetailLog("{0},BSShapeCollection.GetReferenceToCompoundShape,addRootPrim,compShape={1},rootShape={2}", | ||
812 | prim.LocalID, cShape, prim.PhysShape); | ||
809 | 813 | ||
810 | prim.PhysShape = cShape; | 814 | prim.PhysShape = cShape; |
811 | 815 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs index ac6d2b2..702bd77 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs | |||
@@ -614,7 +614,7 @@ public static extern bool IsNativeShape2(IntPtr shape); | |||
614 | public static extern IntPtr BuildCapsuleShape2(IntPtr world, float radius, float height, Vector3 scale); | 614 | public static extern IntPtr BuildCapsuleShape2(IntPtr world, float radius, float height, Vector3 scale); |
615 | 615 | ||
616 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 616 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
617 | public static extern IntPtr CreateCompoundShape2(IntPtr sim); | 617 | public static extern IntPtr CreateCompoundShape2(IntPtr sim, bool enableDynamicAabbTree); |
618 | 618 | ||
619 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 619 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
620 | public static extern int GetNumberOfCompoundChildren2(IntPtr cShape); | 620 | public static extern int GetNumberOfCompoundChildren2(IntPtr cShape); |