//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); }
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); }
public bool CollisionTest() { return(PhysicsHandler.ContactTest(Body, CollisionCallback)); }
public bool CollisionPairTest(Collider other) { return(PhysicsHandler.ContactPairTest(Body, other.Body, CollisionCallback)); }