Beispiel #1
0
        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();
        }
Beispiel #2
0
 internal static void RemoveRigidBody(RigidBody rigid)
 {
     if (rigid.BulletRigidBody.IsInWorld)
     {
         world.RemoveRigidBody(rigid.BulletRigidBody);
     }
 }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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();
        }
Beispiel #5
0
 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();
        }
Beispiel #7
0
        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();
        }
Beispiel #9
0
        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();
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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();
        }
Beispiel #12
0
 public void RemoveBodyToTheWorld(RigidBody Body) => dynamicsWorld.RemoveRigidBody(Body);
Beispiel #13
0
 public void RemoveRigidBody(Physics3DRigidBody rb)
 {
     world.RemoveRigidBody(rb.rigidBody);
     rb.rigidBody.Dispose();
 }
Beispiel #14
0
 public void removeBulletObject(BulletObject objeto)
 {
     bulletObjects.Remove(objeto);
     dynamicsWorld.RemoveRigidBody(objeto.body);
     objeto.Dispose();
 }
Beispiel #15
0
    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();
        }
    }
Beispiel #16
0
 internal void Remove(RigidBody physicsBody)
 {
     DynamicsWorld.RemoveRigidBody(physicsBody);
 }