diff options
Diffstat (limited to '')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs | 564 |
1 files changed, 282 insertions, 282 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs index e5c4777..524a1d0 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs | |||
@@ -1,282 +1,282 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyrightD | 9 | * * Redistributions in binary form must reproduce the above copyrightD |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSimulator Project nor the | 12 | * * Neither the name of the OpenSimulator Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
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.Collections.Generic; |
29 | using System.Text; | 29 | using System.Text; |
30 | using OMV = OpenMetaverse; | 30 | using OMV = OpenMetaverse; |
31 | 31 | ||
32 | namespace OpenSim.Region.Physics.BulletSPlugin | 32 | namespace OpenSim.Region.Physics.BulletSPlugin |
33 | { | 33 | { |
34 | // Classes to allow some type checking for the API | 34 | // Classes to allow some type checking for the API |
35 | // These hold pointers to allocated objects in the unmanaged space. | 35 | // These hold pointers to allocated objects in the unmanaged space. |
36 | 36 | ||
37 | // The physics engine controller class created at initialization | 37 | // The physics engine controller class created at initialization |
38 | public struct BulletSim | 38 | public struct BulletSim |
39 | { | 39 | { |
40 | public BulletSim(uint worldId, BSScene bss, IntPtr xx) | 40 | public BulletSim(uint worldId, BSScene bss, IntPtr xx) |
41 | { | 41 | { |
42 | ptr = xx; | 42 | ptr = xx; |
43 | worldID = worldId; | 43 | worldID = worldId; |
44 | physicsScene = bss; | 44 | physicsScene = bss; |
45 | } | 45 | } |
46 | public IntPtr ptr; | 46 | public IntPtr ptr; |
47 | public uint worldID; | 47 | public uint worldID; |
48 | // The scene is only in here so very low level routines have a handle to print debug/error messages | 48 | // The scene is only in here so very low level routines have a handle to print debug/error messages |
49 | public BSScene physicsScene; | 49 | public BSScene physicsScene; |
50 | } | 50 | } |
51 | 51 | ||
52 | // An allocated Bullet btRigidBody | 52 | // An allocated Bullet btRigidBody |
53 | public struct BulletBody | 53 | public struct BulletBody |
54 | { | 54 | { |
55 | public BulletBody(uint id) : this(id, IntPtr.Zero) | 55 | public BulletBody(uint id) : this(id, IntPtr.Zero) |
56 | { | 56 | { |
57 | } | 57 | } |
58 | public BulletBody(uint id, IntPtr xx) | 58 | public BulletBody(uint id, IntPtr xx) |
59 | { | 59 | { |
60 | ID = id; | 60 | ID = id; |
61 | ptr = xx; | 61 | ptr = xx; |
62 | collisionType = CollisionType.Static; | 62 | collisionType = CollisionType.Static; |
63 | } | 63 | } |
64 | public IntPtr ptr; | 64 | public IntPtr ptr; |
65 | public uint ID; | 65 | public uint ID; |
66 | public CollisionType collisionType; | 66 | public CollisionType collisionType; |
67 | 67 | ||
68 | public void Clear() | 68 | public void Clear() |
69 | { | 69 | { |
70 | ptr = IntPtr.Zero; | 70 | ptr = IntPtr.Zero; |
71 | } | 71 | } |
72 | public bool HasPhysicalBody { get { return ptr != IntPtr.Zero; } } | 72 | public bool HasPhysicalBody { get { return ptr != IntPtr.Zero; } } |
73 | 73 | ||
74 | // Apply the specificed collision mask into the physical world | 74 | // Apply the specificed collision mask into the physical world |
75 | public void ApplyCollisionMask() | 75 | public void ApplyCollisionMask() |
76 | { | 76 | { |
77 | // Should assert the body has been added to the physical world. | 77 | // Should assert the body has been added to the physical world. |
78 | // (The collision masks are stored in the collision proxy cache which only exists for | 78 | // (The collision masks are stored in the collision proxy cache which only exists for |
79 | // a collision body that is in the world.) | 79 | // a collision body that is in the world.) |
80 | BulletSimAPI.SetCollisionGroupMask2(ptr, | 80 | BulletSimAPI.SetCollisionGroupMask2(ptr, |
81 | BulletSimData.CollisionTypeMasks[collisionType].group, | 81 | BulletSimData.CollisionTypeMasks[collisionType].group, |
82 | BulletSimData.CollisionTypeMasks[collisionType].mask); | 82 | BulletSimData.CollisionTypeMasks[collisionType].mask); |
83 | } | 83 | } |
84 | 84 | ||
85 | public override string ToString() | 85 | public override string ToString() |
86 | { | 86 | { |
87 | StringBuilder buff = new StringBuilder(); | 87 | StringBuilder buff = new StringBuilder(); |
88 | buff.Append("<id="); | 88 | buff.Append("<id="); |
89 | buff.Append(ID.ToString()); | 89 | buff.Append(ID.ToString()); |
90 | buff.Append(",p="); | 90 | buff.Append(",p="); |
91 | buff.Append(ptr.ToString("X")); | 91 | buff.Append(ptr.ToString("X")); |
92 | buff.Append(",c="); | 92 | buff.Append(",c="); |
93 | buff.Append(collisionType); | 93 | buff.Append(collisionType); |
94 | buff.Append(">"); | 94 | buff.Append(">"); |
95 | return buff.ToString(); | 95 | return buff.ToString(); |
96 | } | 96 | } |
97 | } | 97 | } |
98 | 98 | ||
99 | public struct BulletShape | 99 | public struct BulletShape |
100 | { | 100 | { |
101 | public BulletShape(IntPtr xx) | 101 | public BulletShape(IntPtr xx) |
102 | { | 102 | { |
103 | ptr = xx; | 103 | ptr = xx; |
104 | type=BSPhysicsShapeType.SHAPE_UNKNOWN; | 104 | type=BSPhysicsShapeType.SHAPE_UNKNOWN; |
105 | shapeKey = (System.UInt64)FixedShapeKey.KEY_NONE; | 105 | shapeKey = (System.UInt64)FixedShapeKey.KEY_NONE; |
106 | isNativeShape = false; | 106 | isNativeShape = false; |
107 | } | 107 | } |
108 | public BulletShape(IntPtr xx, BSPhysicsShapeType typ) | 108 | public BulletShape(IntPtr xx, BSPhysicsShapeType typ) |
109 | { | 109 | { |
110 | ptr = xx; | 110 | ptr = xx; |
111 | type = typ; | 111 | type = typ; |
112 | shapeKey = 0; | 112 | shapeKey = 0; |
113 | isNativeShape = false; | 113 | isNativeShape = false; |
114 | } | 114 | } |
115 | public IntPtr ptr; | 115 | public IntPtr ptr; |
116 | public BSPhysicsShapeType type; | 116 | public BSPhysicsShapeType type; |
117 | public System.UInt64 shapeKey; | 117 | public System.UInt64 shapeKey; |
118 | public bool isNativeShape; | 118 | public bool isNativeShape; |
119 | 119 | ||
120 | public void Clear() | 120 | public void Clear() |
121 | { | 121 | { |
122 | ptr = IntPtr.Zero; | 122 | ptr = IntPtr.Zero; |
123 | } | 123 | } |
124 | public bool HasPhysicalShape { get { return ptr != IntPtr.Zero; } } | 124 | public bool HasPhysicalShape { get { return ptr != IntPtr.Zero; } } |
125 | 125 | ||
126 | public override string ToString() | 126 | public override string ToString() |
127 | { | 127 | { |
128 | StringBuilder buff = new StringBuilder(); | 128 | StringBuilder buff = new StringBuilder(); |
129 | buff.Append("<p="); | 129 | buff.Append("<p="); |
130 | buff.Append(ptr.ToString("X")); | 130 | buff.Append(ptr.ToString("X")); |
131 | buff.Append(",s="); | 131 | buff.Append(",s="); |
132 | buff.Append(type.ToString()); | 132 | buff.Append(type.ToString()); |
133 | buff.Append(",k="); | 133 | buff.Append(",k="); |
134 | buff.Append(shapeKey.ToString("X")); | 134 | buff.Append(shapeKey.ToString("X")); |
135 | buff.Append(",n="); | 135 | buff.Append(",n="); |
136 | buff.Append(isNativeShape.ToString()); | 136 | buff.Append(isNativeShape.ToString()); |
137 | buff.Append(">"); | 137 | buff.Append(">"); |
138 | return buff.ToString(); | 138 | return buff.ToString(); |
139 | } | 139 | } |
140 | } | 140 | } |
141 | 141 | ||
142 | // An allocated Bullet btConstraint | 142 | // An allocated Bullet btConstraint |
143 | public struct BulletConstraint | 143 | public struct BulletConstraint |
144 | { | 144 | { |
145 | public BulletConstraint(IntPtr xx) | 145 | public BulletConstraint(IntPtr xx) |
146 | { | 146 | { |
147 | ptr = xx; | 147 | ptr = xx; |
148 | } | 148 | } |
149 | public IntPtr ptr; | 149 | public IntPtr ptr; |
150 | 150 | ||
151 | public void Clear() | 151 | public void Clear() |
152 | { | 152 | { |
153 | ptr = IntPtr.Zero; | 153 | ptr = IntPtr.Zero; |
154 | } | 154 | } |
155 | public bool HasPhysicalConstraint { get { return ptr != IntPtr.Zero; } } | 155 | public bool HasPhysicalConstraint { get { return ptr != IntPtr.Zero; } } |
156 | } | 156 | } |
157 | 157 | ||
158 | // An allocated HeightMapThing which holds various heightmap info. | 158 | // An allocated HeightMapThing which holds various heightmap info. |
159 | // Made a class rather than a struct so there would be only one | 159 | // Made a class rather than a struct so there would be only one |
160 | // instance of this and C# will pass around pointers rather | 160 | // instance of this and C# will pass around pointers rather |
161 | // than making copies. | 161 | // than making copies. |
162 | public class BulletHeightMapInfo | 162 | public class BulletHeightMapInfo |
163 | { | 163 | { |
164 | public BulletHeightMapInfo(uint id, float[] hm, IntPtr xx) { | 164 | public BulletHeightMapInfo(uint id, float[] hm, IntPtr xx) { |
165 | ID = id; | 165 | ID = id; |
166 | Ptr = xx; | 166 | Ptr = xx; |
167 | heightMap = hm; | 167 | heightMap = hm; |
168 | terrainRegionBase = OMV.Vector3.Zero; | 168 | terrainRegionBase = OMV.Vector3.Zero; |
169 | minCoords = new OMV.Vector3(100f, 100f, 25f); | 169 | minCoords = new OMV.Vector3(100f, 100f, 25f); |
170 | maxCoords = new OMV.Vector3(101f, 101f, 26f); | 170 | maxCoords = new OMV.Vector3(101f, 101f, 26f); |
171 | minZ = maxZ = 0f; | 171 | minZ = maxZ = 0f; |
172 | sizeX = sizeY = 256f; | 172 | sizeX = sizeY = 256f; |
173 | } | 173 | } |
174 | public uint ID; | 174 | public uint ID; |
175 | public IntPtr Ptr; | 175 | public IntPtr Ptr; |
176 | public float[] heightMap; | 176 | public float[] heightMap; |
177 | public OMV.Vector3 terrainRegionBase; | 177 | public OMV.Vector3 terrainRegionBase; |
178 | public OMV.Vector3 minCoords; | 178 | public OMV.Vector3 minCoords; |
179 | public OMV.Vector3 maxCoords; | 179 | public OMV.Vector3 maxCoords; |
180 | public float sizeX, sizeY; | 180 | public float sizeX, sizeY; |
181 | public float minZ, maxZ; | 181 | public float minZ, maxZ; |
182 | public BulletShape terrainShape; | 182 | public BulletShape terrainShape; |
183 | public BulletBody terrainBody; | 183 | public BulletBody terrainBody; |
184 | } | 184 | } |
185 | 185 | ||
186 | // The general class of collsion object. | 186 | // The general class of collsion object. |
187 | public enum CollisionType | 187 | public enum CollisionType |
188 | { | 188 | { |
189 | Avatar, | 189 | Avatar, |
190 | Groundplane, | 190 | Groundplane, |
191 | Terrain, | 191 | Terrain, |
192 | Static, | 192 | Static, |
193 | Dynamic, | 193 | Dynamic, |
194 | VolumeDetect, | 194 | VolumeDetect, |
195 | // Linkset, // A linkset proper should be either Static or Dynamic | 195 | // Linkset, // A linkset proper should be either Static or Dynamic |
196 | LinksetChild, | 196 | LinksetChild, |
197 | Unknown | 197 | Unknown |
198 | }; | 198 | }; |
199 | 199 | ||
200 | // Hold specification of group and mask collision flags for a CollisionType | 200 | // Hold specification of group and mask collision flags for a CollisionType |
201 | public struct CollisionTypeFilterGroup | 201 | public struct CollisionTypeFilterGroup |
202 | { | 202 | { |
203 | public CollisionTypeFilterGroup(CollisionType t, uint g, uint m) | 203 | public CollisionTypeFilterGroup(CollisionType t, uint g, uint m) |
204 | { | 204 | { |
205 | type = t; | 205 | type = t; |
206 | group = g; | 206 | group = g; |
207 | mask = m; | 207 | mask = m; |
208 | } | 208 | } |
209 | public CollisionType type; | 209 | public CollisionType type; |
210 | public uint group; | 210 | public uint group; |
211 | public uint mask; | 211 | public uint mask; |
212 | }; | 212 | }; |
213 | 213 | ||
214 | /* | 214 | /* |
215 | // The collsion filters and masked are defined in one place -- don't want them scattered | 215 | // The collsion filters and masked are defined in one place -- don't want them scattered |
216 | AvatarGroup = BCharacterGroup, | 216 | AvatarGroup = BCharacterGroup, |
217 | AvatarMask = BAllGroup, | 217 | AvatarMask = BAllGroup, |
218 | ObjectGroup = BSolidGroup, | 218 | ObjectGroup = BSolidGroup, |
219 | ObjectMask = BAllGroup, | 219 | ObjectMask = BAllGroup, |
220 | StaticObjectGroup = BStaticGroup, | 220 | StaticObjectGroup = BStaticGroup, |
221 | StaticObjectMask = AvatarGroup | ObjectGroup, // static things don't interact with much | 221 | StaticObjectMask = AvatarGroup | ObjectGroup, // static things don't interact with much |
222 | LinksetGroup = BLinksetGroup, | 222 | LinksetGroup = BLinksetGroup, |
223 | LinksetMask = BAllGroup, | 223 | LinksetMask = BAllGroup, |
224 | LinksetChildGroup = BLinksetChildGroup, | 224 | LinksetChildGroup = BLinksetChildGroup, |
225 | LinksetChildMask = BNoneGroup, // Linkset children disappear from the world | 225 | LinksetChildMask = BNoneGroup, // Linkset children disappear from the world |
226 | VolumeDetectGroup = BSensorTrigger, | 226 | VolumeDetectGroup = BSensorTrigger, |
227 | VolumeDetectMask = ~BSensorTrigger, | 227 | VolumeDetectMask = ~BSensorTrigger, |
228 | TerrainGroup = BTerrainGroup, | 228 | TerrainGroup = BTerrainGroup, |
229 | TerrainMask = BAllGroup & ~BStaticGroup, // static objects on the ground don't collide | 229 | TerrainMask = BAllGroup & ~BStaticGroup, // static objects on the ground don't collide |
230 | GroundPlaneGroup = BGroundPlaneGroup, | 230 | GroundPlaneGroup = BGroundPlaneGroup, |
231 | GroundPlaneMask = BAllGroup | 231 | GroundPlaneMask = BAllGroup |
232 | */ | 232 | */ |
233 | 233 | ||
234 | public static class BulletSimData | 234 | public static class BulletSimData |
235 | { | 235 | { |
236 | 236 | ||
237 | // Map of collisionTypes to flags for collision groups and masks. | 237 | // Map of collisionTypes to flags for collision groups and masks. |
238 | // As mentioned above, don't use the CollisionFilterGroups definitions directly in the code | 238 | // As mentioned above, don't use the CollisionFilterGroups definitions directly in the code |
239 | // but, instead, user references to this dictionary. This makes finding and debugging | 239 | // but, instead, use references to this dictionary. Finding and debugging |
240 | // collision flag usage easier. | 240 | // collision flag problems will be made easier. |
241 | public static Dictionary<CollisionType, CollisionTypeFilterGroup> CollisionTypeMasks | 241 | public static Dictionary<CollisionType, CollisionTypeFilterGroup> CollisionTypeMasks |
242 | = new Dictionary<CollisionType, CollisionTypeFilterGroup>() | 242 | = new Dictionary<CollisionType, CollisionTypeFilterGroup>() |
243 | { | 243 | { |
244 | { CollisionType.Avatar, | 244 | { CollisionType.Avatar, |
245 | new CollisionTypeFilterGroup(CollisionType.Avatar, | 245 | new CollisionTypeFilterGroup(CollisionType.Avatar, |
246 | (uint)CollisionFilterGroups.BCharacterGroup, | 246 | (uint)CollisionFilterGroups.BCharacterGroup, |
247 | (uint)CollisionFilterGroups.BAllGroup) | 247 | (uint)CollisionFilterGroups.BAllGroup) |
248 | }, | 248 | }, |
249 | { CollisionType.Groundplane, | 249 | { CollisionType.Groundplane, |
250 | new CollisionTypeFilterGroup(CollisionType.Groundplane, | 250 | new CollisionTypeFilterGroup(CollisionType.Groundplane, |
251 | (uint)CollisionFilterGroups.BGroundPlaneGroup, | 251 | (uint)CollisionFilterGroups.BGroundPlaneGroup, |
252 | (uint)CollisionFilterGroups.BAllGroup) | 252 | (uint)CollisionFilterGroups.BAllGroup) |
253 | }, | 253 | }, |
254 | { CollisionType.Terrain, | 254 | { CollisionType.Terrain, |
255 | new CollisionTypeFilterGroup(CollisionType.Terrain, | 255 | new CollisionTypeFilterGroup(CollisionType.Terrain, |
256 | (uint)CollisionFilterGroups.BTerrainGroup, | 256 | (uint)CollisionFilterGroups.BTerrainGroup, |
257 | (uint)(CollisionFilterGroups.BAllGroup & ~CollisionFilterGroups.BStaticGroup)) | 257 | (uint)(CollisionFilterGroups.BAllGroup & ~CollisionFilterGroups.BStaticGroup)) |
258 | }, | 258 | }, |
259 | { CollisionType.Static, | 259 | { CollisionType.Static, |
260 | new CollisionTypeFilterGroup(CollisionType.Static, | 260 | new CollisionTypeFilterGroup(CollisionType.Static, |
261 | (uint)CollisionFilterGroups.BStaticGroup, | 261 | (uint)CollisionFilterGroups.BStaticGroup, |
262 | (uint)(CollisionFilterGroups.BCharacterGroup | CollisionFilterGroups.BSolidGroup)) | 262 | (uint)(CollisionFilterGroups.BCharacterGroup | CollisionFilterGroups.BSolidGroup)) |
263 | }, | 263 | }, |
264 | { CollisionType.Dynamic, | 264 | { CollisionType.Dynamic, |
265 | new CollisionTypeFilterGroup(CollisionType.Dynamic, | 265 | new CollisionTypeFilterGroup(CollisionType.Dynamic, |
266 | (uint)CollisionFilterGroups.BSolidGroup, | 266 | (uint)CollisionFilterGroups.BSolidGroup, |
267 | (uint)(CollisionFilterGroups.BAllGroup)) | 267 | (uint)(CollisionFilterGroups.BAllGroup)) |
268 | }, | 268 | }, |
269 | { CollisionType.VolumeDetect, | 269 | { CollisionType.VolumeDetect, |
270 | new CollisionTypeFilterGroup(CollisionType.VolumeDetect, | 270 | new CollisionTypeFilterGroup(CollisionType.VolumeDetect, |
271 | (uint)CollisionFilterGroups.BSensorTrigger, | 271 | (uint)CollisionFilterGroups.BSensorTrigger, |
272 | (uint)(~CollisionFilterGroups.BSensorTrigger)) | 272 | (uint)(~CollisionFilterGroups.BSensorTrigger)) |
273 | }, | 273 | }, |
274 | { CollisionType.LinksetChild, | 274 | { CollisionType.LinksetChild, |
275 | new CollisionTypeFilterGroup(CollisionType.LinksetChild, | 275 | new CollisionTypeFilterGroup(CollisionType.LinksetChild, |
276 | (uint)CollisionFilterGroups.BTerrainGroup, | 276 | (uint)CollisionFilterGroups.BTerrainGroup, |
277 | (uint)(CollisionFilterGroups.BNoneGroup)) | 277 | (uint)(CollisionFilterGroups.BNoneGroup)) |
278 | }, | 278 | }, |
279 | }; | 279 | }; |
280 | 280 | ||
281 | } | 281 | } |
282 | } | 282 | } |