示例#1
0
        //public void AttachGhost()
        //{
        //    // add a callback for the ghost object to detect collisions
        //    PhysicsHandler.World.Broadphase.OverlappingPairCache.SetInternalGhostPairCallback(new GhostPairCallback());

        //    // attach a ghost object to the collider
        //    Ghost = new GhostObject();
        //    Ghost.CollisionShape = Body.CollisionShape;
        //    Ghost.WorldTransform = Body.WorldTransform;
        //    Ghost.CollisionFlags |= CollisionFlags.NoContactResponse;

        //    // add the ghost object to the world
        //    PhysicsHandler.World.AddCollisionObject(Ghost, CollisionFilterGroups.SensorTrigger, CollisionFilterGroups.AllFilter);
        //}

        //public bool CollisionTestGhost()
        //{
        //    if (Ghost != null)
        //    {
        //        // if base ---> ignore

        //        // if prev/next neighbour ---> ignore

        //        // if any original manipulator collider ---> ignore

        //        Console.WriteLine($"Collisions: {Ghost.NumOverlappingObjects}");
        //        return Ghost.NumOverlappingObjects > 0;
        //    }
        //    else
        //        throw new ArgumentNullException("The ghost object is undefined!", "Ghost");
        //}

        public Collider DeepCopy()
        {
            // body cannot be cloned directly, so the only way is to re-initialize it
            Collider collider = default;

            switch (Type)
            {
            case RigidBodyType.Static:
                collider = PhysicsHandler.CreateStaticCollider(Body.CollisionShape, Body.MotionState.WorldTransform);
                break;

            case RigidBodyType.Kinematic:
                collider = PhysicsHandler.CreateKinematicCollider(Body.CollisionShape, Body.MotionState.WorldTransform);
                break;

            case RigidBodyType.Dynamic:
                collider = PhysicsHandler.CreateDynamicCollider(Body.CollisionShape, 1.0f / Body.InvMass, Body.MotionState.WorldTransform);
                break;
            }

            // disable collider to prevent it from producing collision impulses
            collider.Body.CollisionFlags |= CollisionFlags.NoContactResponse;

            // copy callback
            collider.CollisionCallback = new CollisionCallback(collider.Body, null);

            return(collider);
        }
示例#2
0
        public void Convert(RigidBodyType type, float mass)
        {
            PhysicsHandler.RemoveRigidBody(Body);

            // set mass properties
            if (type != RigidBodyType.Dynamic)
            {
                mass = 0;
            }

            Body.SetMassProps(mass, Body.CollisionShape.CalculateLocalInertia(mass));

            // set body type
            switch (type)
            {
            case RigidBodyType.Static:
                Body.CollisionFlags = CollisionFlags.StaticObject;
                Body.ForceActivationState(ActivationState.ActiveTag);
                break;

            case RigidBodyType.Kinematic:
                Body.CollisionFlags = CollisionFlags.StaticObject | CollisionFlags.KinematicObject;
                Body.ForceActivationState(ActivationState.DisableDeactivation);
                break;

            case RigidBodyType.Dynamic:
                Body.CollisionFlags = CollisionFlags.None;
                Body.ForceActivationState(ActivationState.ActiveTag);
                Body.Activate();
                break;
            }

            PhysicsHandler.AddRigidBody(Body);
        }
示例#3
0
 public bool CollisionTest()
 {
     return(PhysicsHandler.ContactTest(Body, CollisionCallback));
 }
示例#4
0
 public bool CollisionPairTest(Collider other)
 {
     return(PhysicsHandler.ContactPairTest(Body, other.Body, CollisionCallback));
 }