diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs | 203 |
1 files changed, 34 insertions, 169 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs index e60a760..962b540 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs | |||
@@ -25,6 +25,7 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | using System; | 27 | using System; |
28 | using System.Collections.Generic; | ||
28 | using System.Runtime.InteropServices; | 29 | using System.Runtime.InteropServices; |
29 | using System.Security; | 30 | using System.Security; |
30 | using System.Text; | 31 | using System.Text; |
@@ -32,93 +33,6 @@ using OpenMetaverse; | |||
32 | 33 | ||
33 | namespace OpenSim.Region.Physics.BulletSPlugin { | 34 | namespace OpenSim.Region.Physics.BulletSPlugin { |
34 | 35 | ||
35 | // Classes to allow some type checking for the API | ||
36 | // These hold pointers to allocated objects in the unmanaged space. | ||
37 | |||
38 | // The physics engine controller class created at initialization | ||
39 | public struct BulletSim | ||
40 | { | ||
41 | public BulletSim(uint worldId, BSScene bss, IntPtr xx) | ||
42 | { | ||
43 | ptr = xx; | ||
44 | worldID = worldId; | ||
45 | physicsScene = bss; | ||
46 | } | ||
47 | public IntPtr ptr; | ||
48 | public uint worldID; | ||
49 | // The scene is only in here so very low level routines have a handle to print debug/error messages | ||
50 | public BSScene physicsScene; | ||
51 | } | ||
52 | |||
53 | // An allocated Bullet btRigidBody | ||
54 | public struct BulletBody | ||
55 | { | ||
56 | public BulletBody(uint id, IntPtr xx) | ||
57 | { | ||
58 | ID = id; | ||
59 | ptr = xx; | ||
60 | collisionFilter = 0; | ||
61 | collisionMask = 0; | ||
62 | } | ||
63 | public IntPtr ptr; | ||
64 | public uint ID; | ||
65 | public CollisionFilterGroups collisionFilter; | ||
66 | public CollisionFilterGroups collisionMask; | ||
67 | public override string ToString() | ||
68 | { | ||
69 | StringBuilder buff = new StringBuilder(); | ||
70 | buff.Append("<id="); | ||
71 | buff.Append(ID.ToString()); | ||
72 | buff.Append(",p="); | ||
73 | buff.Append(ptr.ToString("X")); | ||
74 | if (collisionFilter != 0 || collisionMask != 0) | ||
75 | { | ||
76 | buff.Append(",f="); | ||
77 | buff.Append(collisionFilter.ToString("X")); | ||
78 | buff.Append(",m="); | ||
79 | buff.Append(collisionMask.ToString("X")); | ||
80 | } | ||
81 | buff.Append(">"); | ||
82 | return buff.ToString(); | ||
83 | } | ||
84 | } | ||
85 | |||
86 | public struct BulletShape | ||
87 | { | ||
88 | public BulletShape(IntPtr xx) | ||
89 | { | ||
90 | ptr = xx; | ||
91 | type=BSPhysicsShapeType.SHAPE_UNKNOWN; | ||
92 | shapeKey = (System.UInt64)FixedShapeKey.KEY_NONE; | ||
93 | isNativeShape = false; | ||
94 | } | ||
95 | public BulletShape(IntPtr xx, BSPhysicsShapeType typ) | ||
96 | { | ||
97 | ptr = xx; | ||
98 | type = typ; | ||
99 | shapeKey = 0; | ||
100 | isNativeShape = false; | ||
101 | } | ||
102 | public IntPtr ptr; | ||
103 | public BSPhysicsShapeType type; | ||
104 | public System.UInt64 shapeKey; | ||
105 | public bool isNativeShape; | ||
106 | public override string ToString() | ||
107 | { | ||
108 | StringBuilder buff = new StringBuilder(); | ||
109 | buff.Append("<p="); | ||
110 | buff.Append(ptr.ToString("X")); | ||
111 | buff.Append(",s="); | ||
112 | buff.Append(type.ToString()); | ||
113 | buff.Append(",k="); | ||
114 | buff.Append(shapeKey.ToString("X")); | ||
115 | buff.Append(",n="); | ||
116 | buff.Append(isNativeShape.ToString()); | ||
117 | buff.Append(">"); | ||
118 | return buff.ToString(); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | // Constraint type values as defined by Bullet | 36 | // Constraint type values as defined by Bullet |
123 | public enum ConstraintType : int | 37 | public enum ConstraintType : int |
124 | { | 38 | { |
@@ -132,44 +46,6 @@ public enum ConstraintType : int | |||
132 | MAX_CONSTRAINT_TYPE | 46 | MAX_CONSTRAINT_TYPE |
133 | } | 47 | } |
134 | 48 | ||
135 | // An allocated Bullet btConstraint | ||
136 | public struct BulletConstraint | ||
137 | { | ||
138 | public BulletConstraint(IntPtr xx) | ||
139 | { | ||
140 | ptr = xx; | ||
141 | } | ||
142 | public IntPtr ptr; | ||
143 | } | ||
144 | |||
145 | // An allocated HeightMapThing which holds various heightmap info. | ||
146 | // Made a class rather than a struct so there would be only one | ||
147 | // instance of this and C# will pass around pointers rather | ||
148 | // than making copies. | ||
149 | public class BulletHeightMapInfo | ||
150 | { | ||
151 | public BulletHeightMapInfo(uint id, float[] hm, IntPtr xx) { | ||
152 | ID = id; | ||
153 | Ptr = xx; | ||
154 | heightMap = hm; | ||
155 | terrainRegionBase = Vector3.Zero; | ||
156 | minCoords = new Vector3(100f, 100f, 25f); | ||
157 | maxCoords = new Vector3(101f, 101f, 26f); | ||
158 | minZ = maxZ = 0f; | ||
159 | sizeX = sizeY = 256f; | ||
160 | } | ||
161 | public uint ID; | ||
162 | public IntPtr Ptr; | ||
163 | public float[] heightMap; | ||
164 | public Vector3 terrainRegionBase; | ||
165 | public Vector3 minCoords; | ||
166 | public Vector3 maxCoords; | ||
167 | public float sizeX, sizeY; | ||
168 | public float minZ, maxZ; | ||
169 | public BulletShape terrainShape; | ||
170 | public BulletBody terrainBody; | ||
171 | } | ||
172 | |||
173 | // =============================================================================== | 49 | // =============================================================================== |
174 | [StructLayout(LayoutKind.Sequential)] | 50 | [StructLayout(LayoutKind.Sequential)] |
175 | public struct ConvexHull | 51 | public struct ConvexHull |
@@ -287,6 +163,8 @@ public struct ConfigurationParameters | |||
287 | public float terrainFriction; | 163 | public float terrainFriction; |
288 | public float terrainHitFraction; | 164 | public float terrainHitFraction; |
289 | public float terrainRestitution; | 165 | public float terrainRestitution; |
166 | public float terrainCollisionMargin; | ||
167 | |||
290 | public float avatarFriction; | 168 | public float avatarFriction; |
291 | public float avatarStandingFriction; | 169 | public float avatarStandingFriction; |
292 | public float avatarDensity; | 170 | public float avatarDensity; |
@@ -296,6 +174,8 @@ public struct ConfigurationParameters | |||
296 | public float avatarCapsuleHeight; | 174 | public float avatarCapsuleHeight; |
297 | public float avatarContactProcessingThreshold; | 175 | public float avatarContactProcessingThreshold; |
298 | 176 | ||
177 | public float vehicleAngularDamping; | ||
178 | |||
299 | public float maxPersistantManifoldPoolSize; | 179 | public float maxPersistantManifoldPoolSize; |
300 | public float maxCollisionAlgorithmPoolSize; | 180 | public float maxCollisionAlgorithmPoolSize; |
301 | public float shouldDisableContactPoolDynamicAllocation; | 181 | public float shouldDisableContactPoolDynamicAllocation; |
@@ -353,56 +233,35 @@ public enum CollisionFlags : uint | |||
353 | CF_CHARACTER_OBJECT = 1 << 4, | 233 | CF_CHARACTER_OBJECT = 1 << 4, |
354 | CF_DISABLE_VISUALIZE_OBJECT = 1 << 5, | 234 | CF_DISABLE_VISUALIZE_OBJECT = 1 << 5, |
355 | CF_DISABLE_SPU_COLLISION_PROCESS = 1 << 6, | 235 | CF_DISABLE_SPU_COLLISION_PROCESS = 1 << 6, |
356 | // Following used by BulletSim to control collisions | 236 | // Following used by BulletSim to control collisions and updates |
357 | BS_SUBSCRIBE_COLLISION_EVENTS = 1 << 10, | 237 | BS_SUBSCRIBE_COLLISION_EVENTS = 1 << 10, |
358 | BS_FLOATS_ON_WATER = 1 << 11, | 238 | BS_FLOATS_ON_WATER = 1 << 11, |
239 | BS_VEHICLE_COLLISIONS = 1 << 12, | ||
359 | BS_NONE = 0, | 240 | BS_NONE = 0, |
360 | BS_ALL = 0xFFFFFFFF, | 241 | BS_ALL = 0xFFFFFFFF |
361 | |||
362 | // These are the collision flags switched depending on physical state. | ||
363 | // The other flags are used for other things and should not be fooled with. | ||
364 | BS_ACTIVE = CF_STATIC_OBJECT | ||
365 | | CF_KINEMATIC_OBJECT | ||
366 | | CF_NO_CONTACT_RESPONSE | ||
367 | }; | 242 | }; |
368 | 243 | ||
369 | // Values for collisions groups and masks | 244 | // Values f collisions groups and masks |
370 | public enum CollisionFilterGroups : uint | 245 | public enum CollisionFilterGroups : uint |
371 | { | 246 | { |
372 | // Don't use the bit definitions!! Define the use in a | 247 | // Don't use the bit definitions!! Define the use in a |
373 | // filter/mask definition below. This way collision interactions | 248 | // filter/mask definition below. This way collision interactions |
374 | // are more easily debugged. | 249 | // are more easily found and debugged. |
375 | BNoneFilter = 0, | 250 | BNoneGroup = 0, |
376 | BDefaultFilter = 1 << 0, | 251 | BDefaultGroup = 1 << 0, |
377 | BStaticFilter = 1 << 1, | 252 | BStaticGroup = 1 << 1, |
378 | BKinematicFilter = 1 << 2, | 253 | BKinematicGroup = 1 << 2, |
379 | BDebrisFilter = 1 << 3, | 254 | BDebrisGroup = 1 << 3, |
380 | BSensorTrigger = 1 << 4, | 255 | BSensorTrigger = 1 << 4, |
381 | BCharacterFilter = 1 << 5, | 256 | BCharacterGroup = 1 << 5, |
382 | BAllFilter = 0xFFFFFFFF, | 257 | BAllGroup = 0xFFFFFFFF, |
383 | // Filter groups defined by BulletSim | 258 | // Filter groups defined by BulletSim |
384 | BGroundPlaneFilter = 1 << 10, | 259 | BGroundPlaneGroup = 1 << 10, |
385 | BTerrainFilter = 1 << 11, | 260 | BTerrainGroup = 1 << 11, |
386 | BRaycastFilter = 1 << 12, | 261 | BRaycastGroup = 1 << 12, |
387 | BSolidFilter = 1 << 13, | 262 | BSolidGroup = 1 << 13, |
388 | BLinksetFilter = 1 << 14, | 263 | // BLinksetGroup = xx // a linkset proper is either static or dynamic |
389 | 264 | BLinksetChildGroup = 1 << 14, | |
390 | // The collsion filters and masked are defined in one place -- don't want them scattered | ||
391 | AvatarFilter = BCharacterFilter, | ||
392 | AvatarMask = BAllFilter, | ||
393 | ObjectFilter = BSolidFilter, | ||
394 | ObjectMask = BAllFilter, | ||
395 | StaticObjectFilter = BStaticFilter, | ||
396 | StaticObjectMask = BAllFilter & ~BStaticFilter, // static objects don't collide with each other | ||
397 | LinksetFilter = BLinksetFilter, | ||
398 | LinksetMask = BAllFilter & ~BLinksetFilter, // linkset objects don't collide with each other | ||
399 | VolumeDetectFilter = BSensorTrigger, | ||
400 | VolumeDetectMask = ~BSensorTrigger, | ||
401 | TerrainFilter = BTerrainFilter, | ||
402 | TerrainMask = BAllFilter & ~BStaticFilter, // static objects on the ground don't collide | ||
403 | GroundPlaneFilter = BGroundPlaneFilter, | ||
404 | GroundPlaneMask = BAllFilter | ||
405 | |||
406 | }; | 265 | }; |
407 | 266 | ||
408 | // CFM controls the 'hardness' of the constraint. 0=fixed, 0..1=violatable. Default=0 | 267 | // CFM controls the 'hardness' of the constraint. 0=fixed, 0..1=violatable. Default=0 |
@@ -429,7 +288,7 @@ public enum ConstraintParamAxis : int | |||
429 | 288 | ||
430 | // =============================================================================== | 289 | // =============================================================================== |
431 | static class BulletSimAPI { | 290 | static class BulletSimAPI { |
432 | 291 | // =============================================================================== | |
433 | // Link back to the managed code for outputting log messages | 292 | // Link back to the managed code for outputting log messages |
434 | [UnmanagedFunctionPointer(CallingConvention.Cdecl)] | 293 | [UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
435 | public delegate void DebugLogCallback([MarshalAs(UnmanagedType.LPStr)]string msg); | 294 | public delegate void DebugLogCallback([MarshalAs(UnmanagedType.LPStr)]string msg); |
@@ -482,6 +341,9 @@ public static extern IntPtr BuildNativeShape2(IntPtr world, ShapeData shapeData) | |||
482 | public static extern bool IsNativeShape2(IntPtr shape); | 341 | public static extern bool IsNativeShape2(IntPtr shape); |
483 | 342 | ||
484 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 343 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
344 | public static extern void SetShapeCollisionMargin(IntPtr shape, float margin); | ||
345 | |||
346 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | ||
485 | public static extern IntPtr BuildCapsuleShape2(IntPtr world, float radius, float height, Vector3 scale); | 347 | public static extern IntPtr BuildCapsuleShape2(IntPtr world, float radius, float height, Vector3 scale); |
486 | 348 | ||
487 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 349 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
@@ -938,7 +800,7 @@ public static extern IntPtr GetConstraintRef2(IntPtr obj, int index); | |||
938 | public static extern int GetNumConstraintRefs2(IntPtr obj); | 800 | public static extern int GetNumConstraintRefs2(IntPtr obj); |
939 | 801 | ||
940 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 802 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
941 | public static extern void SetCollisionFilterMask2(IntPtr body, uint filter, uint mask); | 803 | public static extern bool SetCollisionGroupMask2(IntPtr body, uint filter, uint mask); |
942 | 804 | ||
943 | // ===================================================================================== | 805 | // ===================================================================================== |
944 | // btCollisionShape entries | 806 | // btCollisionShape entries |
@@ -1000,13 +862,16 @@ public static extern void DumpRigidBody2(IntPtr sim, IntPtr collisionObject); | |||
1000 | public static extern void DumpCollisionShape2(IntPtr sim, IntPtr collisionShape); | 862 | public static extern void DumpCollisionShape2(IntPtr sim, IntPtr collisionShape); |
1001 | 863 | ||
1002 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 864 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
865 | public static extern void DumpMapInfo2(IntPtr sim, IntPtr manInfo); | ||
866 | |||
867 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | ||
1003 | public static extern void DumpConstraint2(IntPtr sim, IntPtr constrain); | 868 | public static extern void DumpConstraint2(IntPtr sim, IntPtr constrain); |
1004 | 869 | ||
1005 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 870 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
1006 | public static extern void DumpAllInfo2(IntPtr sim); | 871 | public static extern void DumpActivationInfo2(IntPtr sim); |
1007 | 872 | ||
1008 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 873 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
1009 | public static extern void DumpMapInfo2(IntPtr sim, IntPtr manInfo); | 874 | public static extern void DumpAllInfo2(IntPtr sim); |
1010 | 875 | ||
1011 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 876 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
1012 | public static extern void DumpPhysicsStatistics2(IntPtr sim); | 877 | public static extern void DumpPhysicsStatistics2(IntPtr sim); |