static void Main(string[] args) { { var world = new DiscreteDynamicsWorld(); world.Gravity = new Vector3(0.0f, -10.0f, 0.0f); var info0 = new RigidBodyConstructionInfo(); info0.Mass = 1.0f; info0.CollisionShape = new BulletDotNet.Shapes.BoxShape(Vector3.One); info0.CenterOfMass = Vector3.Zero; var rb0 = new RigidBody(info0, OnGetTransform0, OnSetTransform0); var info1 = new RigidBodyConstructionInfo(); info1.Mass = 0.0f; info1.CollisionShape = new BulletDotNet.Shapes.BoxShape(Vector3.One); info1.CenterOfMass = Vector3.Zero; var rb1 = new RigidBody(info1, OnGetTransform1, OnSetTransform1); world.AddRigidBody(rb0); world.AddRigidBody(rb1); for (int i = 0; i < 100; i++) { rb0.Activate(); world.StepSimulation(1.0f / 60.0f); } world.RemoveRigidBody(rb0); world.RemoveRigidBody(rb1); } GC.Collect(); GC.WaitForPendingFinalizers(); }
internal static void RemoveRigidBody(RigidBody rigid) { if (rigid.BulletRigidBody.IsInWorld) { world.RemoveRigidBody(rigid.BulletRigidBody); } }
public void AlignedCollisionObjectArrayTest() { var worldArray = _world.CollisionObjectArray; Assert.IsEmpty(worldArray); _world.AddRigidBody(_body1); _world.AddRigidBody(_body2); Assert.That(worldArray, Has.Count.EqualTo(2)); Assert.AreEqual(2, _world.NumCollisionObjects); Assert.True(worldArray.Contains(_body1)); Assert.True(worldArray.Contains(_body2)); Assert.AreEqual(0, worldArray.IndexOf(_body1)); Assert.AreEqual(1, worldArray.IndexOf(_body2)); _world.RemoveRigidBody(_body1); Assert.That(worldArray, Has.Count.EqualTo(1)); Assert.AreEqual(1, _world.NumCollisionObjects); _world.RemoveRigidBody(_body1); Assert.That(worldArray, Has.Count.EqualTo(1)); Assert.AreEqual(1, _world.NumCollisionObjects); worldArray.Remove(_body2); Assert.AreEqual(0, _world.NumCollisionObjects); _world.AddRigidBody(_body1); _world.AddRigidBody(_body2); worldArray.Clear(); Assert.AreEqual(0, _world.NumCollisionObjects); }
public void TearDown() { world.RemoveRigidBody(body1); world.RemoveRigidBody(body2); boxShape.Dispose(); body1.MotionState.Dispose(); body2.MotionState.Dispose(); body1.Dispose(); body2.Dispose(); ghostObject.Dispose(); world.Dispose(); dispatcher.Dispose(); broadphase.Dispose(); conf.Dispose(); }
public void SimulationStep(float elapsedTime) { if (ActiveBodies.Count == 0 || World == null) { System.Threading.Thread.Sleep(100); return; } if (AddBodyQueue.Count > 0) { var lst = AddBodyQueue.ToArray(); AddBodyQueue = new List <PhysicalBody>(); foreach (var b in lst) { World.AddRigidBody(b.Body); } } if (RemoveBodyQueue.Count > 0) { var lst = RemoveBodyQueue.ToArray(); RemoveBodyQueue = new List <PhysicalBody>(); foreach (var b in lst) { World.RemoveRigidBody(b.Body); } } World.StepSimulation(elapsedTime); for (int i = 0; i < ActiveBodies.Count; i++) { var b = ActiveBodies[i]; if (b != null && b.Body != null && b.Body.ActivationState != ActivationState.IslandSleeping) { b.ApplyChanges(); } } }
//Dispose of components and clean up public override void Dispose() { if (_disposing) { return; } //Unregister all registered rigidbodies foreach (var rb in _bulletRigidBodies) { _dynamicsWorld.RemoveRigidBody(rb); } //Find all constraints and tell them to dispose var constraints = (BulletConstraint[])Object.FindObjectsOfType(typeof(BulletConstraint)); if (constraints.Length == 0) { return; } foreach (var tc in constraints) { tc.Dispose(); } //Find all Bullet rigidbody instances and tell them to dispose var rigidBodies = (BulletRigidBody[])Object.FindObjectsOfType(typeof(BulletRigidBody)); if (rigidBodies.Length == 0) { return; } foreach (var rb in rigidBodies) { rb.Dispose(); } //Dispose of the physics world components in reverse order _disposing = true; _dynamicsWorld.Dispose(); _constraintSolver?.Dispose(); _broadphaseInterface.Dispose(); _collisionDispatcher.Dispose(); _collisionConfig.Dispose(); _bulletBehaviors.Clear(); _threadedSolver?.Dispose(); }
public void TearDown() { world.RemoveRigidBody(gImpactMesh); world.RemoveRigidBody(triangleMesh); gImpactMesh.MotionState.Dispose(); triangleMesh.MotionState.Dispose(); gImpactMesh.Dispose(); triangleMesh.Dispose(); gImpactMeshShape.Dispose(); triangleMeshShape.Dispose(); indexVertexArray.Dispose(); indexVertexArray2.Dispose(); world.Dispose(); dispatcher.Dispose(); broadphase.Dispose(); conf.Dispose(); }
public void TearDown() { world.RemoveRigidBody(body1); world.RemoveRigidBody(body2); body1.CollisionShape.Dispose(); body2.CollisionShape.Dispose(); body1.MotionState.Dispose(); body2.MotionState.Dispose(); body1.Dispose(); body2.Dispose(); broadphase.OverlappingPairUserCallback.Dispose(); broadphase.OverlappingPairUserCallback = null; world.Dispose(); dispatcher.Dispose(); broadphase.Dispose(); conf.Dispose(); }
public void TearDown() { world.RemoveRigidBody(ground); ground.MotionState.Dispose(); ground.Dispose(); groundShape.Dispose(); world.RemoveRigidBody(compound); compound.MotionState.Dispose(); compound.Dispose(); boxShape.Dispose(); boxShape2.Dispose(); boxShape3.Dispose(); compoundShape.Dispose(); compoundShape2.Dispose(); world.Dispose(); dispatcher.Dispose(); broadphase.Dispose(); conf.Dispose(); }
public override void RemovePoser(Poser poser) { if (!_rigidBodies.ContainsKey(poser)) { return; } var constraints = _constraints[poser]; var rigidBodies = _rigidBodies[poser]; foreach (var constraint in constraints) { _world.RemoveConstraint(constraint); } foreach (var rigidBody in rigidBodies) { _world.RemoveRigidBody(rigidBody); } _constraints.Remove(poser); _rigidBodies.Remove(poser); _motionStates.Remove(poser); }
public void AlignedObjectArray_CollisionObjectTest() { // Allocate bodies var bodies = new List <RigidBody>(); for (int i = 0; i < 100; i++) { bodies.Add(CreateBody(10.0f, boxShape, new Vector3(i * 2, 2, 0))); } var objects = world.CollisionObjectArray; for (int i = 0; i < bodies.Count; i++) { Assert.AreEqual(objects[i], bodies[i]); } // Dispose all bodies foreach (var body in bodies) { world.RemoveRigidBody(body); body.MotionState.Dispose(); body.Dispose(); } Assert.AreEqual(0, objects.Count); Assert.AreEqual(0, world.NumCollisionObjects); // Allocate second set of bodies // that may have the same address var bodies2 = new List <RigidBody>(); for (int i = 0; i < 100; i++) { bodies2.Add(CreateBody(10.0f, boxShape, new Vector3(i * 2, 2, 0))); } foreach (var body in bodies) { foreach (var body2 in bodies2) { // Bodies with the same address should not be the same Assert.AreNotEqual(body, body2); } } bodies.Clear(); }
public void RemoveBodyToTheWorld(RigidBody Body) => dynamicsWorld.RemoveRigidBody(Body);
public void RemoveRigidBody(Physics3DRigidBody rb) { world.RemoveRigidBody(rb.rigidBody); rb.rigidBody.Dispose(); }
public void removeBulletObject(BulletObject objeto) { bulletObjects.Remove(objeto); dynamicsWorld.RemoveRigidBody(objeto.body); objeto.Dispose(); }
private void Start() { //Create a World Debug.Log("Initialize physics"); List <CollisionShape> CollisionShapes = new List <CollisionShape>(); DefaultCollisionConfiguration CollisionConf = new DefaultCollisionConfiguration(); CollisionDispatcher Dispatcher = new CollisionDispatcher(CollisionConf); DbvtBroadphase Broadphase = new DbvtBroadphase(); DiscreteDynamicsWorld World = new DiscreteDynamicsWorld(Dispatcher, Broadphase, null, CollisionConf) { Gravity = new BulletSharp.Math.Vector3(0, -9.80665f, 0) }; // create a few dynamic rigidbodies const float mass = 1.0f; //Add a single cube RigidBody fallRigidBody; BoxShape shape = new BoxShape(1f, 1f, 1f); BulletSharp.Math.Vector3 localInertia = BulletSharp.Math.Vector3.Zero; shape.CalculateLocalInertia(mass, out localInertia); RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, null, shape, localInertia); fallRigidBody = new RigidBody(rbInfo); rbInfo.Dispose(); Matrix st = Matrix.Translation(new BulletSharp.Math.Vector3(0f, 10f, 0f)); fallRigidBody.WorldTransform = st; World.AddRigidBody(fallRigidBody); Matrix trans; //Step the simulation 300 steps for (int i = 0; i < 300; i++) { World.StepSimulation(1f / 60f, 10); fallRigidBody.GetWorldTransform(out trans); Debug.Log("box height: " + trans.Origin); } //Clean up. World.RemoveRigidBody(fallRigidBody); fallRigidBody.Dispose(); Debug.Log("ExitPhysics"); if (World != null) { //remove/dispose constraints int i; for (i = World.NumConstraints - 1; i >= 0; i--) { TypedConstraint constraint = World.GetConstraint(i); World.RemoveConstraint(constraint); constraint.Dispose(); } //remove the rigidbodies from the dynamics world and delete them for (i = World.NumCollisionObjects - 1; i >= 0; i--) { CollisionObject obj = World.CollisionObjectArray[i]; RigidBody body = obj as RigidBody; if (body != null && body.MotionState != null) { body.MotionState.Dispose(); } World.RemoveCollisionObject(obj); obj.Dispose(); } //delete collision shapes foreach (CollisionShape ss in CollisionShapes) { ss.Dispose(); } CollisionShapes.Clear(); World.Dispose(); Broadphase.Dispose(); Dispatcher.Dispose(); CollisionConf.Dispose(); } if (Broadphase != null) { Broadphase.Dispose(); } if (Dispatcher != null) { Dispatcher.Dispose(); } if (CollisionConf != null) { CollisionConf.Dispose(); } }
internal void Remove(RigidBody physicsBody) { DynamicsWorld.RemoveRigidBody(physicsBody); }