/// <summary> /// Adds the character to the engine processing pipeline. /// </summary> /// <param name="character">The character.</param> /// <param name="group">The group.</param> /// <param name="mask">The mask.</param> /// <exception cref="System.Exception">Cannot perform this action when the physics engine is set to CollisionsOnly</exception> public void AddCharacter(Character character, CollisionFilterGroupFlags group, CollisionFilterGroupFlags mask) { if (discreteDynamicsWorld == null) throw new Exception("Cannot perform this action when the physics engine is set to CollisionsOnly"); var collider = character.InternalCollider; var action = character.KinematicCharacter; discreteDynamicsWorld.AddCollisionObject(collider, (BulletSharp.CollisionFilterGroups)group, (BulletSharp.CollisionFilterGroups)mask); discreteDynamicsWorld.AddCharacter(action); character.Simulation = this; }
/// <summary> /// Removes the character from the engine processing pipeline. /// </summary> /// <param name="character">The character.</param> /// <exception cref="System.Exception">Cannot perform this action when the physics engine is set to CollisionsOnly</exception> public void RemoveCharacter(Character character) { if (discreteDynamicsWorld == null) throw new Exception("Cannot perform this action when the physics engine is set to CollisionsOnly"); var collider = character.InternalCollider; var action = character.KinematicCharacter; discreteDynamicsWorld.RemoveCollisionObject(collider); discreteDynamicsWorld.RemoveCharacter(action); character.Simulation = null; }
/// <summary> /// Creates the character. /// </summary> /// <param name="collider">The collider.</param> /// <param name="stepHeight">Height of the step.</param> /// <returns></returns> public Character CreateCharacter(ColliderShape collider, float stepHeight) { var ch = new Character(collider) { InternalCollider = new BulletSharp.PairCachingGhostObject { CollisionShape = collider.InternalShape } }; ch.InternalCollider.UserObject = ch; ch.InternalCollider.CollisionFlags |= BulletSharp.CollisionFlags.CharacterObject; if (collider.NeedsCustomCollisionCallback) { ch.InternalCollider.CollisionFlags |= BulletSharp.CollisionFlags.CustomMaterialCallback; } ch.InternalCollider.ContactProcessingThreshold = !canCcd ? 1e18f : 1e30f; ch.KinematicCharacter = new BulletSharp.KinematicCharacterController((BulletSharp.PairCachingGhostObject)ch.InternalCollider, (BulletSharp.ConvexShape)collider.InternalShape, stepHeight); return ch; }