diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletXPlugin')
-rw-r--r-- | OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs | 145 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs | 161 |
2 files changed, 275 insertions, 31 deletions
diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs index c733adb..2db7a54 100644 --- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs +++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs | |||
@@ -64,6 +64,7 @@ using System; | |||
64 | using System.Collections.Generic; | 64 | using System.Collections.Generic; |
65 | using MonoXnaCompactMaths; | 65 | using MonoXnaCompactMaths; |
66 | using OpenSim.Framework; | 66 | using OpenSim.Framework; |
67 | using OpenSim.Framework.Console; | ||
67 | using OpenSim.Region.Physics.Manager; | 68 | using OpenSim.Region.Physics.Manager; |
68 | using XnaDevRu.BulletX; | 69 | using XnaDevRu.BulletX; |
69 | using XnaDevRu.BulletX.Dynamics; | 70 | using XnaDevRu.BulletX.Dynamics; |
@@ -74,15 +75,6 @@ using BoxShape=XnaDevRu.BulletX.BoxShape; | |||
74 | 75 | ||
75 | namespace OpenSim.Region.Physics.BulletXPlugin | 76 | namespace OpenSim.Region.Physics.BulletXPlugin |
76 | { | 77 | { |
77 | /// <summary> | ||
78 | /// This class is only here for compilations reasons | ||
79 | /// </summary> | ||
80 | public class Mesh | ||
81 | { | ||
82 | public Mesh() | ||
83 | { | ||
84 | } | ||
85 | } | ||
86 | 78 | ||
87 | /// <summary> | 79 | /// <summary> |
88 | /// BulletXConversions are called now BulletXMaths | 80 | /// BulletXConversions are called now BulletXMaths |
@@ -268,6 +260,65 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
268 | } | 260 | } |
269 | } | 261 | } |
270 | 262 | ||
263 | |||
264 | // Class to detect and debug collisions | ||
265 | // Mainly used for debugging purposes | ||
266 | class CollisionDispatcherLocal : CollisionDispatcher | ||
267 | { | ||
268 | |||
269 | BulletXScene relatedScene; | ||
270 | |||
271 | public CollisionDispatcherLocal(BulletXScene s) | ||
272 | : base() | ||
273 | { | ||
274 | relatedScene=s; | ||
275 | } | ||
276 | |||
277 | public override bool NeedsCollision(CollisionObject bodyA, CollisionObject bodyB) | ||
278 | { | ||
279 | RigidBody rb; | ||
280 | BulletXCharacter bxcA=null; | ||
281 | BulletXPrim bxpA = null; | ||
282 | Type t = bodyA.GetType(); | ||
283 | if (t==typeof(RigidBody)) { | ||
284 | rb = (RigidBody)bodyA; | ||
285 | relatedScene._characters.TryGetValue(rb, out bxcA); | ||
286 | relatedScene._prims.TryGetValue(rb, out bxpA); | ||
287 | } | ||
288 | String nameA; | ||
289 | if (bxcA != null) | ||
290 | nameA = bxcA._name; | ||
291 | else if (bxpA != null) | ||
292 | nameA = bxpA._name; | ||
293 | else | ||
294 | nameA = "null"; | ||
295 | |||
296 | BulletXCharacter bxcB = null; | ||
297 | BulletXPrim bxpB = null; | ||
298 | t = bodyB.GetType(); | ||
299 | if (t == typeof(RigidBody)) | ||
300 | { | ||
301 | rb = (RigidBody)bodyB; | ||
302 | relatedScene._characters.TryGetValue(rb, out bxcB); | ||
303 | relatedScene._prims.TryGetValue(rb, out bxpB); | ||
304 | } | ||
305 | String nameB; | ||
306 | if (bxcB != null) | ||
307 | nameB = bxcB._name; | ||
308 | else if (bxpB != null) | ||
309 | nameB = bxpB._name; | ||
310 | else | ||
311 | nameB = "null"; | ||
312 | |||
313 | bool needsCollision=base.NeedsCollision(bodyA, bodyB); | ||
314 | |||
315 | MainLog.Instance.Debug("BulletX", "A collision was detected between {0} and {1} --> {2}", nameA, nameB, needsCollision); | ||
316 | |||
317 | |||
318 | return needsCollision; | ||
319 | } | ||
320 | } | ||
321 | |||
271 | /// <summary> | 322 | /// <summary> |
272 | /// PhysicsScene Class for BulletX | 323 | /// PhysicsScene Class for BulletX |
273 | /// </summary> | 324 | /// </summary> |
@@ -294,8 +345,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
294 | private const int simulationSubSteps = 10; | 345 | private const int simulationSubSteps = 10; |
295 | //private float[] _heightmap; | 346 | //private float[] _heightmap; |
296 | private BulletXPlanet _simFlatPlanet; | 347 | private BulletXPlanet _simFlatPlanet; |
297 | private List<BulletXCharacter> _characters = new List<BulletXCharacter>(); | 348 | internal Dictionary<RigidBody, BulletXCharacter> _characters = new Dictionary<RigidBody, BulletXCharacter>(); |
298 | private List<BulletXPrim> _prims = new List<BulletXPrim>(); | 349 | internal Dictionary<RigidBody, BulletXPrim> _prims = new Dictionary<RigidBody, BulletXPrim>(); |
350 | |||
351 | public IMesher mesher; | ||
352 | |||
299 | 353 | ||
300 | public static float Gravity | 354 | public static float Gravity |
301 | { | 355 | { |
@@ -334,7 +388,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
334 | 388 | ||
335 | public BulletXScene() | 389 | public BulletXScene() |
336 | { | 390 | { |
337 | cDispatcher = new CollisionDispatcher(); | 391 | cDispatcher = new CollisionDispatcherLocal(this); |
338 | Vector3 worldMinDim = new Vector3((float) minXY, (float) minXY, (float) minZ); | 392 | Vector3 worldMinDim = new Vector3((float) minXY, (float) minXY, (float) minZ); |
339 | Vector3 worldMaxDim = new Vector3((float) maxXY, (float) maxXY, (float) maxZ); | 393 | Vector3 worldMaxDim = new Vector3((float) maxXY, (float) maxXY, (float) maxZ); |
340 | opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles); | 394 | opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles); |
@@ -348,6 +402,12 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
348 | //this._heightmap = new float[65536]; | 402 | //this._heightmap = new float[65536]; |
349 | } | 403 | } |
350 | 404 | ||
405 | public override void Initialise(IMesher meshmerizer) | ||
406 | { | ||
407 | mesher = meshmerizer; | ||
408 | } | ||
409 | |||
410 | |||
351 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position) | 411 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position) |
352 | { | 412 | { |
353 | PhysicsVector pos = new PhysicsVector(); | 413 | PhysicsVector pos = new PhysicsVector(); |
@@ -358,7 +418,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
358 | lock (BulletXLock) | 418 | lock (BulletXLock) |
359 | { | 419 | { |
360 | newAv = new BulletXCharacter(avName, this, pos); | 420 | newAv = new BulletXCharacter(avName, this, pos); |
361 | _characters.Add(newAv); | 421 | _characters.Add(newAv.RigidBody, newAv); |
362 | } | 422 | } |
363 | return newAv; | 423 | return newAv; |
364 | } | 424 | } |
@@ -379,7 +439,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
379 | ((BulletXCharacter) actor).RigidBody.ActivationState = ActivationState.DisableSimulation; | 439 | ((BulletXCharacter) actor).RigidBody.ActivationState = ActivationState.DisableSimulation; |
380 | AddForgottenRigidBody(((BulletXCharacter) actor).RigidBody); | 440 | AddForgottenRigidBody(((BulletXCharacter) actor).RigidBody); |
381 | } | 441 | } |
382 | _characters.Remove((BulletXCharacter) actor); | 442 | _characters.Remove(((BulletXCharacter)actor).RigidBody); |
383 | } | 443 | } |
384 | GC.Collect(); | 444 | GC.Collect(); |
385 | } | 445 | } |
@@ -405,7 +465,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
405 | } | 465 | } |
406 | else | 466 | else |
407 | { | 467 | { |
408 | Mesh mesh = null; | 468 | IMesh mesh = mesher.CreateMesh(primName, pbs, size); |
409 | result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); | 469 | result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); |
410 | } | 470 | } |
411 | break; | 471 | break; |
@@ -419,13 +479,13 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
419 | } | 479 | } |
420 | 480 | ||
421 | public PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, AxiomQuaternion rotation, | 481 | public PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, AxiomQuaternion rotation, |
422 | Mesh mesh, PrimitiveBaseShape pbs, bool isPhysical) | 482 | IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) |
423 | { | 483 | { |
424 | BulletXPrim newPrim = null; | 484 | BulletXPrim newPrim = null; |
425 | lock (BulletXLock) | 485 | lock (BulletXLock) |
426 | { | 486 | { |
427 | newPrim = new BulletXPrim(name, this, position, size, rotation, mesh, pbs, isPhysical); | 487 | newPrim = new BulletXPrim(name, this, position, size, rotation, mesh, pbs, isPhysical); |
428 | _prims.Add(newPrim); | 488 | _prims.Add(newPrim.RigidBody, newPrim); |
429 | } | 489 | } |
430 | return newPrim; | 490 | return newPrim; |
431 | } | 491 | } |
@@ -446,7 +506,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
446 | ((BulletXPrim) prim).RigidBody.ActivationState = ActivationState.DisableSimulation; | 506 | ((BulletXPrim) prim).RigidBody.ActivationState = ActivationState.DisableSimulation; |
447 | AddForgottenRigidBody(((BulletXPrim) prim).RigidBody); | 507 | AddForgottenRigidBody(((BulletXPrim) prim).RigidBody); |
448 | } | 508 | } |
449 | _prims.Remove((BulletXPrim) prim); | 509 | _prims.Remove(((BulletXPrim) prim).RigidBody); |
450 | } | 510 | } |
451 | GC.Collect(); | 511 | GC.Collect(); |
452 | } | 512 | } |
@@ -470,11 +530,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
470 | 530 | ||
471 | private void MoveAllObjects(float timeStep) | 531 | private void MoveAllObjects(float timeStep) |
472 | { | 532 | { |
473 | foreach (BulletXCharacter actor in _characters) | 533 | foreach (BulletXCharacter actor in _characters.Values) |
474 | { | 534 | { |
475 | actor.Move(timeStep); | 535 | actor.Move(timeStep); |
476 | } | 536 | } |
477 | foreach (BulletXPrim prim in _prims) | 537 | foreach (BulletXPrim prim in _prims.Values) |
478 | { | 538 | { |
479 | } | 539 | } |
480 | } | 540 | } |
@@ -482,14 +542,14 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
482 | private void ValidateHeightForAll() | 542 | private void ValidateHeightForAll() |
483 | { | 543 | { |
484 | float _height; | 544 | float _height; |
485 | foreach (BulletXCharacter actor in _characters) | 545 | foreach (BulletXCharacter actor in _characters.Values) |
486 | { | 546 | { |
487 | //_height = HeightValue(actor.RigidBodyPosition); | 547 | //_height = HeightValue(actor.RigidBodyPosition); |
488 | _height = _simFlatPlanet.HeightValue(actor.RigidBodyPosition); | 548 | _height = _simFlatPlanet.HeightValue(actor.RigidBodyPosition); |
489 | actor.ValidateHeight(_height); | 549 | actor.ValidateHeight(_height); |
490 | //if (_simFlatPlanet.heightIsNotValid(actor.RigidBodyPosition, out _height)) actor.ValidateHeight(_height); | 550 | //if (_simFlatPlanet.heightIsNotValid(actor.RigidBodyPosition, out _height)) actor.ValidateHeight(_height); |
491 | } | 551 | } |
492 | foreach (BulletXPrim prim in _prims) | 552 | foreach (BulletXPrim prim in _prims.Values) |
493 | { | 553 | { |
494 | //_height = HeightValue(prim.RigidBodyPosition); | 554 | //_height = HeightValue(prim.RigidBodyPosition); |
495 | _height = _simFlatPlanet.HeightValue(prim.RigidBodyPosition); | 555 | _height = _simFlatPlanet.HeightValue(prim.RigidBodyPosition); |
@@ -510,11 +570,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
510 | { | 570 | { |
511 | //UpdatePosition > UpdateKinetics. | 571 | //UpdatePosition > UpdateKinetics. |
512 | //Not only position will be updated, also velocity cause acceleration. | 572 | //Not only position will be updated, also velocity cause acceleration. |
513 | foreach (BulletXCharacter actor in _characters) | 573 | foreach (BulletXCharacter actor in _characters.Values) |
514 | { | 574 | { |
515 | actor.UpdateKinetics(); | 575 | actor.UpdateKinetics(); |
516 | } | 576 | } |
517 | foreach (BulletXPrim prim in _prims) | 577 | foreach (BulletXPrim prim in _prims.Values) |
518 | { | 578 | { |
519 | prim.UpdateKinetics(); | 579 | prim.UpdateKinetics(); |
520 | } | 580 | } |
@@ -646,9 +706,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
646 | protected PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; | 706 | protected PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; |
647 | protected RigidBody rigidBody; | 707 | protected RigidBody rigidBody; |
648 | private Boolean iscolliding = false; | 708 | private Boolean iscolliding = false; |
709 | internal string _name; | ||
649 | 710 | ||
650 | public BulletXActor() | 711 | public BulletXActor(String name) |
651 | { | 712 | { |
713 | _name = name; | ||
652 | } | 714 | } |
653 | 715 | ||
654 | public override PhysicsVector Position | 716 | public override PhysicsVector Position |
@@ -847,6 +909,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
847 | } | 909 | } |
848 | public BulletXCharacter(String avName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector velocity, | 910 | public BulletXCharacter(String avName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector velocity, |
849 | PhysicsVector size, PhysicsVector acceleration, AxiomQuaternion orientation) | 911 | PhysicsVector size, PhysicsVector acceleration, AxiomQuaternion orientation) |
912 | : base(avName) | ||
850 | { | 913 | { |
851 | //This fields will be removed. They're temporal | 914 | //This fields will be removed. They're temporal |
852 | float _sizeX = 0.5f; | 915 | float _sizeX = 0.5f; |
@@ -1016,14 +1079,15 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1016 | private bool m_lastUpdateSent = false; | 1079 | private bool m_lastUpdateSent = false; |
1017 | 1080 | ||
1018 | public BulletXPrim(String primName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector size, | 1081 | public BulletXPrim(String primName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector size, |
1019 | AxiomQuaternion rotation, Mesh mesh, PrimitiveBaseShape pbs, bool isPhysical) | 1082 | AxiomQuaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) |
1020 | : this(primName, parent_scene, pos, new PhysicsVector(), size, new PhysicsVector(), rotation, mesh, pbs, isPhysical) | 1083 | : this(primName, parent_scene, pos, new PhysicsVector(), size, new PhysicsVector(), rotation, mesh, pbs, isPhysical) |
1021 | { | 1084 | { |
1022 | } | 1085 | } |
1023 | public BulletXPrim(String primName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector velocity, | 1086 | public BulletXPrim(String primName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector velocity, |
1024 | PhysicsVector size, | 1087 | PhysicsVector size, |
1025 | PhysicsVector acceleration, AxiomQuaternion rotation, Mesh mesh, PrimitiveBaseShape pbs, | 1088 | PhysicsVector acceleration, AxiomQuaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, |
1026 | bool isPhysical) | 1089 | bool isPhysical) |
1090 | : base(primName) | ||
1027 | { | 1091 | { |
1028 | if ((size.X == 0) || (size.Y == 0) || (size.Z == 0)) throw new Exception("Size 0"); | 1092 | if ((size.X == 0) || (size.Y == 0) || (size.Z == 0)) throw new Exception("Size 0"); |
1029 | if (rotation.Norm == 0f) rotation = AxiomQuaternion.Identity; | 1093 | if (rotation.Norm == 0f) rotation = AxiomQuaternion.Identity; |
@@ -1037,7 +1101,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1037 | 1101 | ||
1038 | _parent_scene = parent_scene; | 1102 | _parent_scene = parent_scene; |
1039 | 1103 | ||
1040 | CreateRigidBody(parent_scene, pos, size); | 1104 | CreateRigidBody(parent_scene, mesh, pos, size); |
1041 | } | 1105 | } |
1042 | 1106 | ||
1043 | public override PhysicsVector Position | 1107 | public override PhysicsVector Position |
@@ -1191,7 +1255,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1191 | } | 1255 | } |
1192 | 1256 | ||
1193 | #region Methods for updating values of RigidBody | 1257 | #region Methods for updating values of RigidBody |
1194 | internal protected void CreateRigidBody(BulletXScene parent_scene, PhysicsVector pos, PhysicsVector size) | 1258 | internal protected void CreateRigidBody(BulletXScene parent_scene, IMesh mesh, PhysicsVector pos, PhysicsVector size) |
1195 | { | 1259 | { |
1196 | //For RigidBody Constructor. The next values might change | 1260 | //For RigidBody Constructor. The next values might change |
1197 | float _linearDamping = 0.0f; | 1261 | float _linearDamping = 0.0f; |
@@ -1204,7 +1268,26 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1204 | { | 1268 | { |
1205 | _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(pos); | 1269 | _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(pos); |
1206 | //For now all prims are boxes | 1270 | //For now all prims are boxes |
1207 | CollisionShape _collisionShape = new XnaDevRu.BulletX.BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(size) / 2.0f); | 1271 | CollisionShape _collisionShape; |
1272 | if (mesh == null) | ||
1273 | { | ||
1274 | _collisionShape = new XnaDevRu.BulletX.BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(size) / 2.0f); | ||
1275 | } else { | ||
1276 | int iVertexCount = mesh.getVertexList().Count; | ||
1277 | int[] indices = mesh.getIndexListAsInt(); | ||
1278 | Vector3[] v3Vertices = new Vector3[iVertexCount]; | ||
1279 | for (int i = 0; i < iVertexCount; i++) | ||
1280 | { | ||
1281 | PhysicsVector v=mesh.getVertexList()[i]; | ||
1282 | if (v != null) // Note, null has special meaning. See meshing code for details | ||
1283 | v3Vertices[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); | ||
1284 | else | ||
1285 | v3Vertices[i] = MonoXnaCompactMaths.Vector3.Zero; | ||
1286 | } | ||
1287 | TriangleIndexVertexArray triMesh = new TriangleIndexVertexArray(indices, v3Vertices); | ||
1288 | |||
1289 | _collisionShape = new XnaDevRu.BulletX.TriangleMeshShape(triMesh); | ||
1290 | } | ||
1208 | DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); | 1291 | DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); |
1209 | Vector3 _localInertia = new Vector3(); | 1292 | Vector3 _localInertia = new Vector3(); |
1210 | if (_physical) _collisionShape.CalculateLocalInertia(Mass, out _localInertia); //Always when mass > 0 | 1293 | if (_physical) _collisionShape.CalculateLocalInertia(Mass, out _localInertia); //Always when mass > 0 |
@@ -1231,7 +1314,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1231 | rigidBody.ActivationState = ActivationState.DisableSimulation; | 1314 | rigidBody.ActivationState = ActivationState.DisableSimulation; |
1232 | this._parent_scene.AddForgottenRigidBody(rigidBody); | 1315 | this._parent_scene.AddForgottenRigidBody(rigidBody); |
1233 | } | 1316 | } |
1234 | CreateRigidBody(this._parent_scene, this._position, size); | 1317 | CreateRigidBody(this._parent_scene, null, this._position, size); // Note, null for the meshing definitely is wrong. It's here for the moment to apease the compiler |
1235 | if (_physical) Speed();//Static objects don't have linear velocity | 1318 | if (_physical) Speed();//Static objects don't have linear velocity |
1236 | ReOrient(); | 1319 | ReOrient(); |
1237 | GC.Collect(); | 1320 | GC.Collect(); |
diff --git a/OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs b/OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs new file mode 100644 index 0000000..fb30296 --- /dev/null +++ b/OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs | |||
@@ -0,0 +1,161 @@ | |||
1 | /* | ||
2 | Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru | ||
3 | Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com | ||
4 | |||
5 | This software is provided 'as-is', without any express or implied | ||
6 | warranty. In no event will the authors be held liable for any damages | ||
7 | arising from the use of this software. | ||
8 | |||
9 | Permission is granted to anyone to use this software for any purpose, | ||
10 | including commercial applications, and to alter it and redistribute it | ||
11 | freely, subject to the following restrictions: | ||
12 | |||
13 | 1. The origin of this software must not be misrepresented; you must not | ||
14 | claim that you wrote the original software. If you use this software | ||
15 | in a product, an acknowledgment in the product documentation would be | ||
16 | appreciated but is not required. | ||
17 | 2. Altered source versions must be plainly marked as such, and must not be | ||
18 | misrepresented as being the original software. | ||
19 | 3. This notice may not be removed or altered from any source distribution. | ||
20 | */ | ||
21 | |||
22 | /* | ||
23 | |||
24 | This file contains a class TriangleIndexVertexArray. I tried using the class with the same name | ||
25 | from the BulletX implementation and found it unusable for the purpose of using triangle meshes | ||
26 | within BulletX as the implementation was painfully incomplete. | ||
27 | The attempt to derive from the original class failed as viable members were hidden. | ||
28 | Fiddling around with BulletX itself was not my intention. | ||
29 | So I copied the class to the BulletX-plugin and modified it. | ||
30 | If you want to fiddle around with it it's up to you to move all this to BulletX. | ||
31 | If someone someday implements the missing functionality in BulletX, feel free to remove this class. | ||
32 | It's just an ugly hack. | ||
33 | |||
34 | */ | ||
35 | using System; | ||
36 | using System.Collections.Generic; | ||
37 | using System.Text; | ||
38 | using MonoXnaCompactMaths; | ||
39 | |||
40 | namespace OpenSim.Region.Physics.BulletXPlugin | ||
41 | { | ||
42 | /// <summary> | ||
43 | /// IndexedMesh indexes into existing vertex and index arrays, in a similar way OpenGL glDrawElements | ||
44 | /// instead of the number of indices, we pass the number of triangles | ||
45 | /// </summary> | ||
46 | public struct IndexedMesh | ||
47 | { | ||
48 | private int _numTriangles; | ||
49 | private int[] _triangleIndexBase; | ||
50 | private int _triangleIndexStride; | ||
51 | private int _numVertices; | ||
52 | private Vector3[] _vertexBase; | ||
53 | private int _vertexStride; | ||
54 | |||
55 | public IndexedMesh(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride, int numVertices, Vector3[] vertexBase, int vertexStride) | ||
56 | { | ||
57 | _numTriangles = numTriangleIndices; | ||
58 | _triangleIndexBase = triangleIndexBase; | ||
59 | _triangleIndexStride = triangleIndexStride; | ||
60 | _vertexBase = vertexBase; | ||
61 | _numVertices = numVertices; | ||
62 | _vertexStride = vertexStride; | ||
63 | } | ||
64 | |||
65 | public IndexedMesh(int[] triangleIndexBase, Vector3[] vertexBase) | ||
66 | { | ||
67 | _numTriangles = triangleIndexBase.Length; | ||
68 | _triangleIndexBase = triangleIndexBase; | ||
69 | _triangleIndexStride = 32; | ||
70 | _vertexBase = vertexBase; | ||
71 | _numVertices = vertexBase.Length; | ||
72 | _vertexStride = 24; | ||
73 | } | ||
74 | |||
75 | public int TriangleCount { get { return _numTriangles; } set { _numTriangles = value; } } | ||
76 | public int[] TriangleIndexBase { get { return _triangleIndexBase; } set { _triangleIndexBase = value; } } | ||
77 | public int TriangleIndexStride { get { return _triangleIndexStride; } set { _triangleIndexStride = value; } } | ||
78 | public int VertexCount { get { return _numVertices; } set { _numVertices = value; } } | ||
79 | public Vector3[] VertexBase { get { return _vertexBase; } set { _vertexBase = value; } } | ||
80 | public int VertexStride { get { return _vertexStride; } set { _vertexStride = value; } } | ||
81 | } | ||
82 | |||
83 | /// <summary> | ||
84 | /// TriangleIndexVertexArray allows to use multiple meshes, by indexing into existing triangle/index arrays. | ||
85 | /// Additional meshes can be added using addIndexedMesh | ||
86 | /// </summary> | ||
87 | public class TriangleIndexVertexArray : XnaDevRu.BulletX.StridingMeshInterface | ||
88 | { | ||
89 | List<IndexedMesh> _indexedMeshes = new List<IndexedMesh>(); | ||
90 | |||
91 | public TriangleIndexVertexArray() { } | ||
92 | |||
93 | public TriangleIndexVertexArray(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride, int numVertices, Vector3[] vertexBase, int vertexStride) | ||
94 | { | ||
95 | IndexedMesh mesh = new IndexedMesh(); | ||
96 | mesh.TriangleCount = numTriangleIndices; | ||
97 | mesh.TriangleIndexBase = triangleIndexBase; | ||
98 | mesh.TriangleIndexStride = triangleIndexStride; | ||
99 | mesh.VertexBase = vertexBase; | ||
100 | mesh.VertexCount = numVertices; | ||
101 | mesh.VertexStride = vertexStride; | ||
102 | |||
103 | AddIndexedMesh(mesh); | ||
104 | } | ||
105 | |||
106 | public TriangleIndexVertexArray(int[] triangleIndexBase, Vector3[] vertexBase) | ||
107 | : this(triangleIndexBase.Length, triangleIndexBase, 32, vertexBase.Length, vertexBase, 24) { } | ||
108 | |||
109 | public void AddIndexedMesh(IndexedMesh indexedMesh) | ||
110 | { | ||
111 | _indexedMeshes.Add(indexedMesh); | ||
112 | } | ||
113 | |||
114 | public override void GetLockedVertexIndexBase(out List<Vector3> verts, out List<int> indicies, out int numfaces, int subpart) | ||
115 | { | ||
116 | throw new Exception("The method or operation is not implemented."); | ||
117 | } | ||
118 | |||
119 | public override void GetLockedReadOnlyVertexIndexBase(out List<Vector3> verts, out List<int> indicies, out int numfaces, int subpart) | ||
120 | { | ||
121 | IndexedMesh m = _indexedMeshes[0]; | ||
122 | Vector3[] vertexBase = m.VertexBase; | ||
123 | verts = new List<Vector3>(); | ||
124 | foreach (Vector3 v in vertexBase) | ||
125 | { | ||
126 | verts.Add(v); | ||
127 | } | ||
128 | int[] indexBase = m.TriangleIndexBase; | ||
129 | indicies = new List<int>(); | ||
130 | foreach (int i in indexBase) | ||
131 | { | ||
132 | indicies.Add(i); | ||
133 | } | ||
134 | numfaces = vertexBase.GetLength(0); | ||
135 | } | ||
136 | |||
137 | public override void UnLockVertexBase(int subpart) | ||
138 | { | ||
139 | throw new Exception("The method or operation is not implemented."); | ||
140 | } | ||
141 | |||
142 | public override void UnLockReadOnlyVertexBase(int subpart) | ||
143 | { | ||
144 | } | ||
145 | |||
146 | public override int SubPartsCount() | ||
147 | { | ||
148 | return _indexedMeshes.Count; | ||
149 | } | ||
150 | |||
151 | public override void PreallocateVertices(int numverts) | ||
152 | { | ||
153 | throw new Exception("The method or operation is not implemented."); | ||
154 | } | ||
155 | |||
156 | public override void PreallocateIndices(int numindices) | ||
157 | { | ||
158 | throw new Exception("The method or operation is not implemented."); | ||
159 | } | ||
160 | } | ||
161 | } | ||