Пример #1
0
        public void AddCollisionObject(CollisionObject collisionObject, BroadphaseProxy.CollisionFilterGroups collisionFilterGroup, BroadphaseProxy.CollisionFilterGroups collisionFilterMask)
        {
            //check that the object isn't already added
            if (!_collisionObjects.Contains(collisionObject))
            {
                _collisionObjects.Add(collisionObject);

                //calculate new AABB
                Matrix trans = collisionObject.WorldTransform;

                Vector3 minAabb;
                Vector3 maxAabb;
                collisionObject.CollisionShape.GetAabb(trans, out minAabb, out maxAabb);

                BroadphaseNativeTypes type = collisionObject.CollisionShape.ShapeType;
                collisionObject.Broadphase = Broadphase.CreateProxy(
                    minAabb,
                    maxAabb,
                    type,
                    collisionObject,
                    collisionFilterGroup,
                    collisionFilterMask
                    );
            }
        }
Пример #2
0
 public void RemoveFromBroadphase(Body body)
 {
     foreach (var box in body.Boxes)
     {
         Broadphase.RemoveBox(box);
     }
 }
Пример #3
0
 public void Update(double time)
 {
     //Maximize parallelism, divide narrow phase among threads
     var broad_collisions = Broadphase.Solve(time);
     //Solve narrow phase (subdivision intersections)
     var final_collisions = Narrowphase.Solve(time, broad_collisions);
     //Finally perform impulse resolution
 }
Пример #4
0
        public void InitTest()
        {
            Broadphase bf = new Broadphase();

            bf.Init();

            bf.Dispose();
        }
Пример #5
0
 public void RemoveBody(Body body)
 {
     Debug.Assert(body != null, "Yritetään poistaa null bodya!");
     // todo hidas
     if (colliders.Contains(body))
     {
         Broadphase.RemoveProxy(body.BroadphaseProxy);
         colliders.Remove(body);
         body.OnRemoved();
     }
 }
Пример #6
0
 /// <summary>
 /// Update loop
 /// </summary>
 /// <param name="gameTime">Kuinka paljon simuloidaan</param>
 public void Step(GameTime gameTime)
 {
     // todo update velocity jne
     // todo cache
     for (int i = 0; i < colliders.Count; i++)
     {
         UpdateAABB(colliders[i]);
     }
     Broadphase.CalculateCollisionPairs();
     Narrowphase.SolveCollisions(Broadphase.CollisionPairs);
 }
Пример #7
0
 void FixedUpdate()
 {
     Constants.SetConstants(compute, Time.fixedDeltaTime);
     VelSimulation.Simulate();
     Broadphase.FindBand(2f * constants.radius);
     for (var i = 0; i < 4; i++)
     {
         ParticleSolver.Solve();
         WallSolver.Solve();
         Velocities.ClampMagnitude();
     }
     PosSimulation.Simulate();
     BoundsChecker.Check();
     Lifes.Simulate();
 }
Пример #8
0
        /// <summary>
        /// Luo bodyn maailmaan ja alustaa broadphase proxyn
        /// </summary>
        /// <param name="body"></param>
        /// <param name="group">Mihin collision ryhmään kuuluu</param>
        /// <param name="mask">Minkä ryhmien kanssa törmää</param>
        public void CreateBody(Body body, CollisionGroup group = CollisionGroup.Group1, CollisionGroup mask = CollisionGroup.All)
        {
            Debug.Assert(body != null, "Yritetään lisätä null bodya!");
            // todo hidas
            if (colliders.Contains(body))
            {
                return;
            }

            colliders.Add(body);
            BroadphaseProxy proxy = BroadphaseProxy.Create(body, group, mask);

            body.BroadphaseProxy = proxy;
            Broadphase.AddProxy(ref proxy);
            body.OnAdded();
        }
Пример #9
0
        public void RemoveCollisionObject(CollisionObject collisionObject)
        {
            BroadphaseProxy bp = collisionObject.Broadphase;

            if (bp != null)
            {
                //
                // only clear the cached algorithms
                //
                Broadphase.CleanProxyFromPairs(bp);
                Broadphase.DestroyProxy(bp);
                collisionObject.Broadphase = null;
            }

            _collisionObjects.Remove(collisionObject);
        }
Пример #10
0
 void OnDestroy()
 {
     if (Positions != null)
     {
         Positions.Dispose();
     }
     if (Velocities != null)
     {
         Velocities.Dispose();
     }
     if (Lifes != null)
     {
         Lifes.Dispose();
     }
     if (Constants != null)
     {
         Constants.Dispose();
     }
     if (Walls != null)
     {
         Walls.Dispose();
     }
     if (VelSimulation != null)
     {
         VelSimulation.Dispose();
     }
     if (PosSimulation != null)
     {
         PosSimulation.Dispose();
     }
     if (Broadphase != null)
     {
         Broadphase.Dispose();
     }
     if (WallSolver != null)
     {
         WallSolver.Dispose();
     }
     if (ParticleSolver != null)
     {
         ParticleSolver.Dispose();
     }
     if (Combiner != null)
     {
         Combiner.Dispose();
     }
 }
Пример #11
0
 public void Dispose(bool disposing)
 {
     if (disposing)
     {
         //clean up remaining objects
         foreach (CollisionObject collisionObject in _collisionObjects)
         {
             BroadphaseProxy bp = collisionObject.Broadphase;
             if (bp != null)
             {
                 //
                 // only clear the cached algorithms
                 //
                 Broadphase.CleanProxyFromPairs(bp);
                 Broadphase.DestroyProxy(bp);
             }
         }
     }
 }
    private void Start()
    {
        switch (bType)
        {
        case broadphaseType.Dummy:
            broadphase = Dummy.CreateInstance();
            break;

        case broadphaseType.AABBTree:
            break;
        }

        switch (cType)
        {
        case collisionDetectionType.GJK:
            collisionDetection = GJKwithEPA.CreateInstance();
            break;

        case collisionDetectionType.SAT:
            break;
        }
    }
Пример #13
0
        public void ExitPhysics()
        {
            // Remove/dispose constraints
            for (int i = World.NumConstraints - 1; i >= 0; i--)
            {
                var constraint = World.GetConstraint(i);
                World.RemoveConstraint(constraint);
                constraint.Dispose();
            }

            // Remove/dispose rigid bodies
            for (int i = World.NumCollisionObjects - 1; i >= 0; i--)
            {
                var obj  = World.CollisionObjectArray[i];
                var body = obj as RigidBody;
                if (body != null && body.MotionState != null)
                {
                    body.MotionState.Dispose();
                }
                World.RemoveCollisionObject(obj);
                obj.Dispose();
            }

            //delete collision shapes
            foreach (var shape in CollisionShapes)
            {
                shape.Dispose();
            }
            CollisionShapes.Clear();

            World.Dispose();
            Broadphase.Dispose();
            if (Dispatcher != null)
            {
                Dispatcher.Dispose();
            }
            CollisionConf.Dispose();
        }
Пример #14
0
        /// <summary>
        /// Päivittää GameObjectin bodyn BroadphaseProxyn AABB:n ajantasalle
        /// </summary>
        /// <param name="collider"></param>
        private void UpdateAABB(Body collider)
        {
            AABB aabb = collider.GetAABB();

            Broadphase.SetProxyAABB(collider.BroadphaseProxy, ref aabb);
        }
Пример #15
0
 public void RemoveBody(PhysicsBody body)
 {
     Broadphase.RemoveBody(body);
 }
Пример #16
0
 public void AddBody(PhysicsBody body)
 {
     Broadphase.AddBody(body);
 }
Пример #17
0
        public void Broadphase_InitializeTest()
        {
            var broadphase = new Broadphase(0, 0);

            broadphase.Dispose();
        }
Пример #18
0
 public void AddForce(ForceField field)
 {
     Broadphase.AddBody(field.Area);
 }
Пример #19
0
        public override void ExitPhysics()
        {
            if (m_inverseModel != null)
            {
                Debug.Log("Dispose inverse model " + m_inverseModel.NumBodies);
                m_inverseModel.Dispose();
            }

            Debug.Log("InverseDynamicsExitPhysics");
            //cleanup in the reverse order of creation/initialization

            //remove the rigidbodies from the dynamics world and delete them

            if (m_dynamicsWorld == null)
            {
                int i;
                for (i = m_dynamicsWorld.NumConstraints - 1; i >= 0; i--)
                {
                    TypedConstraint tc = m_dynamicsWorld.GetConstraint(i);
                    m_dynamicsWorld.RemoveConstraint(tc);
                    tc.Dispose();
                }

                for (i = m_dynamicsWorld.NumMultiBodyConstraints - 1; i >= 0; i--)
                {
                    MultiBodyConstraint mbc = m_dynamicsWorld.GetMultiBodyConstraint(i);
                    m_dynamicsWorld.RemoveMultiBodyConstraint(mbc);
                    mbc.Dispose();
                }

                for (i = m_dynamicsWorld.NumMultibodies - 1; i >= 0; i--)
                {
                    MultiBody mb = m_dynamicsWorld.GetMultiBody(i);
                    m_dynamicsWorld.RemoveMultiBody(mb);
                    mb.Dispose();
                }
                for (i = m_dynamicsWorld.NumCollisionObjects - 1; i >= 0; i--)
                {
                    CollisionObject obj  = m_dynamicsWorld.CollisionObjectArray[i];
                    RigidBody       body = RigidBody.Upcast(obj);
                    if (body != null && body.MotionState != null)
                    {
                        body.MotionState.Dispose();
                    }
                    m_dynamicsWorld.RemoveCollisionObject(obj);
                    obj.Dispose();
                }
            }

            if (m_multiBody != null)
            {
                m_multiBody.Dispose();
            }

            //delete collision shapes
            for (int j = 0; j < CollisionShapes.Count; j++)
            {
                CollisionShape shape = CollisionShapes[j];
                shape.Dispose();
            }
            CollisionShapes.Clear();

            m_dynamicsWorld.Dispose();
            m_dynamicsWorld = null;

            m_solver.Dispose();
            m_solver = null;

            Broadphase.Dispose();
            Broadphase = null;

            Dispatcher.Dispose();
            Dispatcher = null;

            m_pairCache.Dispose();
            m_pairCache = null;

            CollisionConf.Dispose();
            CollisionConf = null;
            Debug.Log("After dispose B");
        }
Пример #20
0
    //IMPORTANT Time.fixedTime must match the timestep being used here.
    public static List <UnityEngine.Vector3> SimulateBall(BRigidBody ballRb, UnityEngine.Vector3 ballThrowForce, int numberOfSimulationSteps, bool reverseOrder)
    {
        var ballPositions = new List <UnityEngine.Vector3>(numberOfSimulationSteps);

        //Create a World
        Debug.Log("Initialize physics");

        CollisionConfiguration CollisionConf;
        CollisionDispatcher    Dispatcher;
        BroadphaseInterface    Broadphase;
        CollisionWorld         cw;
        ConstraintSolver       Solver;

        BulletSharp.SoftBody.SoftBodyWorldInfo softBodyWorldInfo;

        //This should create a copy of the BPhysicsWorld with the same settings
        BPhysicsWorld bw = BPhysicsWorld.Get();

        bw.CreatePhysicsWorld(out cw, out CollisionConf, out Dispatcher, out Broadphase, out Solver, out softBodyWorldInfo);
        World = (DiscreteDynamicsWorld)cw;

        //Copy all existing rigidbodies in scene
        // IMPORTANT rigidbodies must be added to the offline world in the same order that they are in the source world
        // this is because collisions must be resolved in the same order for the sim to be deterministic
        DiscreteDynamicsWorld sourceWorld = (DiscreteDynamicsWorld)bw.world;

        BulletSharp.RigidBody   bulletBallRb = null;
        BulletSharp.Math.Matrix mm           = BulletSharp.Math.Matrix.Identity;
        for (int i = 0; i < sourceWorld.NumCollisionObjects; i++)
        {
            CollisionObject co = sourceWorld.CollisionObjectArray[i];
            if (co != null && co.UserObject is BRigidBody)
            {
                BRigidBody      rb            = (BRigidBody)co.UserObject;
                float           mass          = rb.isDynamic() ? rb.mass : 0f;
                BCollisionShape existingShape = rb.GetComponent <BCollisionShape>();
                CollisionShape  shape         = null;
                if (existingShape is BSphereShape)
                {
                    shape = ((BSphereShape)existingShape).CopyCollisionShape();
                }
                else if (existingShape is BBoxShape)
                {
                    shape = ((BBoxShape)existingShape).CopyCollisionShape();
                }

                RigidBody bulletRB = null;
                BulletSharp.Math.Vector3 localInertia = new BulletSharp.Math.Vector3();
                rb.CreateOrConfigureRigidBody(ref bulletRB, ref localInertia, shape, null);
                BulletSharp.Math.Vector3    pos = rb.GetCollisionObject().WorldTransform.Origin;
                BulletSharp.Math.Quaternion rot = rb.GetCollisionObject().WorldTransform.GetOrientation();
                BulletSharp.Math.Matrix.AffineTransformation(1f, ref rot, ref pos, out mm);
                bulletRB.WorldTransform = mm;
                World.AddRigidBody(bulletRB, rb.groupsIBelongTo, rb.collisionMask);
                if (rb == ballRb)
                {
                    bulletBallRb = bulletRB;
                    bulletRB.ApplyCentralImpulse(ballThrowForce.ToBullet());
                }
            }
        }

        //Step the simulation numberOfSimulationSteps times
        for (int i = 0; i < numberOfSimulationSteps; i++)
        {
            int numSteps = World.StepSimulation(1f / 60f, 10, 1f / 60f);
            ballPositions.Add(bulletBallRb.WorldTransform.Origin.ToUnity());
        }

        UnityEngine.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();
            }

            World.Dispose();
            Broadphase.Dispose();
            Dispatcher.Dispose();
            CollisionConf.Dispose();
        }

        if (Broadphase != null)
        {
            Broadphase.Dispose();
        }
        if (Dispatcher != null)
        {
            Dispatcher.Dispose();
        }
        if (CollisionConf != null)
        {
            CollisionConf.Dispose();
        }

        return(ballPositions);
    }
Пример #21
0
 public CollisionWorld(int staticBodyCount, int dynamicBodyCount)
 {
     m_PhysicsBodies = new NativeArray <PhysicsBody>(staticBodyCount + dynamicBodyCount, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
     Broadphase      = new Broadphase(staticBodyCount, dynamicBodyCount);
 }
Пример #22
0
 public void RemoveForce(ForceField field)
 {
     Broadphase.RemoveBody(field.Area);
 }
Пример #23
0
 // Has broadphase find all contacts and call AddContact on the
 // ContactManager for each pair found
 public void FindNewContacts()
 {
     Broadphase.UpdatePairs();
 }
Пример #24
0
        // Remove contacts without broadphase overlap
        // Solves contact manifolds
        public void TestCollisions()
        {
            for (int h = 0; h < ContactList.Count; h++)
            {
                var  constraint = ContactList[h];
                Box  A          = constraint.A;
                Box  B          = constraint.B;
                Body bodyA      = A.body;
                Body bodyB      = B.body;

                constraint.Flags &= ~ContactFlags.eIsland;

                if (!bodyA.IsAwake() && !bodyB.IsAwake())
                {
                    continue;
                }

                if (!bodyA.CanCollide(bodyB))
                {
                    RemoveContact(constraint);
                    continue;
                }

                // Check if contact should persist
                if (!Broadphase.TestOverlap(A.broadPhaseIndex, B.broadPhaseIndex))
                {
                    RemoveContact(constraint);
                    continue;
                }
                Manifold manifold    = constraint.manifold;
                Manifold oldManifold = constraint.manifold;
                Vec3     ot0         = oldManifold.tangentVectors;
                Vec3     ot1         = oldManifold.bitangentVectors;
                constraint.SolveCollision();
                AABB.ComputeBasis(manifold.normal, ref manifold.tangentVectors, ref manifold.bitangentVectors);

                for (int i = 0; i < manifold.contactCount; ++i)
                {
                    Contact c = manifold.contacts[i];
                    c.tangentImpulse = c.bitangentImpulse = c.normalImpulse = 0;
                    byte oldWarmStart = c.warmStarted;
                    c.warmStarted = 0;

                    for (int j = 0; j < oldManifold.contactCount; ++j)
                    {
                        Contact oc = oldManifold.contacts[j];
                        if (c.fp.key == oc.fp.key)
                        {
                            c.normalImpulse = oc.normalImpulse;

                            // Attempt to re-project old friction solutions
                            Vec3 friction = ot0 * oc.tangentImpulse + ot1 * oc.bitangentImpulse;
                            c.tangentImpulse   = Vec3.Dot(friction, manifold.tangentVectors);
                            c.bitangentImpulse = Vec3.Dot(friction, manifold.bitangentVectors);
                            c.warmStarted      = Math.Max(oldWarmStart, (byte)(oldWarmStart + 1));
                            break;
                        }
                    }
                }

                if (ContactListener != null)
                {
                    var now_colliding = constraint.Flags & ContactFlags.eColliding;
                    var was_colliding = constraint.Flags & ContactFlags.eWasColliding;

                    if (now_colliding > 0 && was_colliding == 0)
                    {
                        ContactListener.BeginContact(constraint);
                    }

                    else if (now_colliding == 0 && was_colliding > 0)
                    {
                        ContactListener.EndContact(constraint);
                    }
                }
            }
        }
Пример #25
0
 public List <BroadphaseProxy> QueryAABB(ref AABB aabb)
 {
     return(Broadphase.QueryAABB(ref aabb));
 }