From cb07ba0d68eeb57bae1cb60f387483ff720cc29d Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Sat, 10 Nov 2007 19:13:52 +0000 Subject: * Moves the Meshmerizer to a separate plugin * Experimental. Linux Prebuild needs testing. * One more update after this to remove the ODEMeshing directory.... --- .../Region/Physics/BulletXPlugin/BulletXPlugin.cs | 145 ++++++++++++++++----- 1 file changed, 114 insertions(+), 31 deletions(-) (limited to 'OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs') 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; using System.Collections.Generic; using MonoXnaCompactMaths; using OpenSim.Framework; +using OpenSim.Framework.Console; using OpenSim.Region.Physics.Manager; using XnaDevRu.BulletX; using XnaDevRu.BulletX.Dynamics; @@ -74,15 +75,6 @@ using BoxShape=XnaDevRu.BulletX.BoxShape; namespace OpenSim.Region.Physics.BulletXPlugin { - /// - /// This class is only here for compilations reasons - /// - public class Mesh - { - public Mesh() - { - } - } /// /// BulletXConversions are called now BulletXMaths @@ -268,6 +260,65 @@ namespace OpenSim.Region.Physics.BulletXPlugin } } + + // Class to detect and debug collisions + // Mainly used for debugging purposes + class CollisionDispatcherLocal : CollisionDispatcher + { + + BulletXScene relatedScene; + + public CollisionDispatcherLocal(BulletXScene s) + : base() + { + relatedScene=s; + } + + public override bool NeedsCollision(CollisionObject bodyA, CollisionObject bodyB) + { + RigidBody rb; + BulletXCharacter bxcA=null; + BulletXPrim bxpA = null; + Type t = bodyA.GetType(); + if (t==typeof(RigidBody)) { + rb = (RigidBody)bodyA; + relatedScene._characters.TryGetValue(rb, out bxcA); + relatedScene._prims.TryGetValue(rb, out bxpA); + } + String nameA; + if (bxcA != null) + nameA = bxcA._name; + else if (bxpA != null) + nameA = bxpA._name; + else + nameA = "null"; + + BulletXCharacter bxcB = null; + BulletXPrim bxpB = null; + t = bodyB.GetType(); + if (t == typeof(RigidBody)) + { + rb = (RigidBody)bodyB; + relatedScene._characters.TryGetValue(rb, out bxcB); + relatedScene._prims.TryGetValue(rb, out bxpB); + } + String nameB; + if (bxcB != null) + nameB = bxcB._name; + else if (bxpB != null) + nameB = bxpB._name; + else + nameB = "null"; + + bool needsCollision=base.NeedsCollision(bodyA, bodyB); + + MainLog.Instance.Debug("BulletX", "A collision was detected between {0} and {1} --> {2}", nameA, nameB, needsCollision); + + + return needsCollision; + } + } + /// /// PhysicsScene Class for BulletX /// @@ -294,8 +345,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin private const int simulationSubSteps = 10; //private float[] _heightmap; private BulletXPlanet _simFlatPlanet; - private List _characters = new List(); - private List _prims = new List(); + internal Dictionary _characters = new Dictionary(); + internal Dictionary _prims = new Dictionary(); + + public IMesher mesher; + public static float Gravity { @@ -334,7 +388,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin public BulletXScene() { - cDispatcher = new CollisionDispatcher(); + cDispatcher = new CollisionDispatcherLocal(this); Vector3 worldMinDim = new Vector3((float) minXY, (float) minXY, (float) minZ); Vector3 worldMaxDim = new Vector3((float) maxXY, (float) maxXY, (float) maxZ); opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles); @@ -348,6 +402,12 @@ namespace OpenSim.Region.Physics.BulletXPlugin //this._heightmap = new float[65536]; } + public override void Initialise(IMesher meshmerizer) + { + mesher = meshmerizer; + } + + public override PhysicsActor AddAvatar(string avName, PhysicsVector position) { PhysicsVector pos = new PhysicsVector(); @@ -358,7 +418,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin lock (BulletXLock) { newAv = new BulletXCharacter(avName, this, pos); - _characters.Add(newAv); + _characters.Add(newAv.RigidBody, newAv); } return newAv; } @@ -379,7 +439,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin ((BulletXCharacter) actor).RigidBody.ActivationState = ActivationState.DisableSimulation; AddForgottenRigidBody(((BulletXCharacter) actor).RigidBody); } - _characters.Remove((BulletXCharacter) actor); + _characters.Remove(((BulletXCharacter)actor).RigidBody); } GC.Collect(); } @@ -405,7 +465,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin } else { - Mesh mesh = null; + IMesh mesh = mesher.CreateMesh(primName, pbs, size); result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); } break; @@ -419,13 +479,13 @@ namespace OpenSim.Region.Physics.BulletXPlugin } public PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, AxiomQuaternion rotation, - Mesh mesh, PrimitiveBaseShape pbs, bool isPhysical) + IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) { BulletXPrim newPrim = null; lock (BulletXLock) { newPrim = new BulletXPrim(name, this, position, size, rotation, mesh, pbs, isPhysical); - _prims.Add(newPrim); + _prims.Add(newPrim.RigidBody, newPrim); } return newPrim; } @@ -446,7 +506,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin ((BulletXPrim) prim).RigidBody.ActivationState = ActivationState.DisableSimulation; AddForgottenRigidBody(((BulletXPrim) prim).RigidBody); } - _prims.Remove((BulletXPrim) prim); + _prims.Remove(((BulletXPrim) prim).RigidBody); } GC.Collect(); } @@ -470,11 +530,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin private void MoveAllObjects(float timeStep) { - foreach (BulletXCharacter actor in _characters) + foreach (BulletXCharacter actor in _characters.Values) { actor.Move(timeStep); } - foreach (BulletXPrim prim in _prims) + foreach (BulletXPrim prim in _prims.Values) { } } @@ -482,14 +542,14 @@ namespace OpenSim.Region.Physics.BulletXPlugin private void ValidateHeightForAll() { float _height; - foreach (BulletXCharacter actor in _characters) + foreach (BulletXCharacter actor in _characters.Values) { //_height = HeightValue(actor.RigidBodyPosition); _height = _simFlatPlanet.HeightValue(actor.RigidBodyPosition); actor.ValidateHeight(_height); //if (_simFlatPlanet.heightIsNotValid(actor.RigidBodyPosition, out _height)) actor.ValidateHeight(_height); } - foreach (BulletXPrim prim in _prims) + foreach (BulletXPrim prim in _prims.Values) { //_height = HeightValue(prim.RigidBodyPosition); _height = _simFlatPlanet.HeightValue(prim.RigidBodyPosition); @@ -510,11 +570,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin { //UpdatePosition > UpdateKinetics. //Not only position will be updated, also velocity cause acceleration. - foreach (BulletXCharacter actor in _characters) + foreach (BulletXCharacter actor in _characters.Values) { actor.UpdateKinetics(); } - foreach (BulletXPrim prim in _prims) + foreach (BulletXPrim prim in _prims.Values) { prim.UpdateKinetics(); } @@ -646,9 +706,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin protected PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; protected RigidBody rigidBody; private Boolean iscolliding = false; + internal string _name; - public BulletXActor() + public BulletXActor(String name) { + _name = name; } public override PhysicsVector Position @@ -847,6 +909,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin } public BulletXCharacter(String avName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector velocity, PhysicsVector size, PhysicsVector acceleration, AxiomQuaternion orientation) + : base(avName) { //This fields will be removed. They're temporal float _sizeX = 0.5f; @@ -1016,14 +1079,15 @@ namespace OpenSim.Region.Physics.BulletXPlugin private bool m_lastUpdateSent = false; public BulletXPrim(String primName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector size, - AxiomQuaternion rotation, Mesh mesh, PrimitiveBaseShape pbs, bool isPhysical) + AxiomQuaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) : this(primName, parent_scene, pos, new PhysicsVector(), size, new PhysicsVector(), rotation, mesh, pbs, isPhysical) { } public BulletXPrim(String primName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector velocity, PhysicsVector size, - PhysicsVector acceleration, AxiomQuaternion rotation, Mesh mesh, PrimitiveBaseShape pbs, + PhysicsVector acceleration, AxiomQuaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) + : base(primName) { if ((size.X == 0) || (size.Y == 0) || (size.Z == 0)) throw new Exception("Size 0"); if (rotation.Norm == 0f) rotation = AxiomQuaternion.Identity; @@ -1037,7 +1101,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin _parent_scene = parent_scene; - CreateRigidBody(parent_scene, pos, size); + CreateRigidBody(parent_scene, mesh, pos, size); } public override PhysicsVector Position @@ -1191,7 +1255,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin } #region Methods for updating values of RigidBody - internal protected void CreateRigidBody(BulletXScene parent_scene, PhysicsVector pos, PhysicsVector size) + internal protected void CreateRigidBody(BulletXScene parent_scene, IMesh mesh, PhysicsVector pos, PhysicsVector size) { //For RigidBody Constructor. The next values might change float _linearDamping = 0.0f; @@ -1204,7 +1268,26 @@ namespace OpenSim.Region.Physics.BulletXPlugin { _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(pos); //For now all prims are boxes - CollisionShape _collisionShape = new XnaDevRu.BulletX.BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(size) / 2.0f); + CollisionShape _collisionShape; + if (mesh == null) + { + _collisionShape = new XnaDevRu.BulletX.BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(size) / 2.0f); + } else { + int iVertexCount = mesh.getVertexList().Count; + int[] indices = mesh.getIndexListAsInt(); + Vector3[] v3Vertices = new Vector3[iVertexCount]; + for (int i = 0; i < iVertexCount; i++) + { + PhysicsVector v=mesh.getVertexList()[i]; + if (v != null) // Note, null has special meaning. See meshing code for details + v3Vertices[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); + else + v3Vertices[i] = MonoXnaCompactMaths.Vector3.Zero; + } + TriangleIndexVertexArray triMesh = new TriangleIndexVertexArray(indices, v3Vertices); + + _collisionShape = new XnaDevRu.BulletX.TriangleMeshShape(triMesh); + } DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); Vector3 _localInertia = new Vector3(); if (_physical) _collisionShape.CalculateLocalInertia(Mass, out _localInertia); //Always when mass > 0 @@ -1231,7 +1314,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin rigidBody.ActivationState = ActivationState.DisableSimulation; this._parent_scene.AddForgottenRigidBody(rigidBody); } - CreateRigidBody(this._parent_scene, this._position, size); + 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 if (_physical) Speed();//Static objects don't have linear velocity ReOrient(); GC.Collect(); -- cgit v1.1