///this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete those public DiscreteDynamicsWorld(IDispatcher dispatcher, IBroadphaseInterface pairCache, IConstraintSolver constraintSolver, ICollisionConfiguration collisionConfiguration) : base(dispatcher, pairCache, collisionConfiguration) { m_ownsIslandManager = true; m_constraints = new ObjectArray <TypedConstraint>(); m_sortedConstraints = new ObjectArray <TypedConstraint>(); m_islandSortPredicate = new SortConstraintOnIslandPredicate(); m_islandQuickSortPredicate = new QuickSortConstraintOnIslandPredicate(); m_actions = new List <IActionInterface>(); m_nonStaticRigidBodies = new ObjectArray <RigidBody>(); m_islandManager = new SimulationIslandManager(); m_constraintSolver = constraintSolver; IndexedVector3 gravity = new IndexedVector3(0, -10, 0); SetGravity(ref gravity); m_localTime = 0f; m_profileTimings = 0; m_synchronizeAllMotionStates = false; if (m_constraintSolver == null) { m_constraintSolver = new SequentialImpulseConstraintSolver(); m_ownsConstraintSolver = true; } else { m_ownsConstraintSolver = false; } }
protected void CalculateSimulationIslands() { SimulationIslandManager.UpdateActivationState(this, Dispatcher); for (int i = 0; i < _constraints.Count; i++) { TypedConstraint constraint = _constraints[i]; RigidBody colObj0 = constraint.RigidBodyA; RigidBody colObj1 = constraint.RigidBodyB; if (((colObj0 != null) && (colObj0.MergesSimulationIslands)) && ((colObj1 != null) && (colObj1.MergesSimulationIslands))) { if (colObj0.IsActive || colObj1.IsActive) { SimulationIslandManager.UnionFind.Unite((colObj0).IslandTag, (colObj1).IslandTag); } } } //Store the island id in each body SimulationIslandManager.StoreIslandActivationState(this); }
//this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete those public DiscreteDynamicsWorld(IDispatcher dispatcher, OverlappingPairCache pairCache, IConstraintSolver constraintSolver) : base(dispatcher, pairCache) { _constraintSolver = constraintSolver != null ? constraintSolver : new SequentialImpulseConstraintSolver(); _debugDrawer = null; _gravity = new Vector3(0, -10, 0); _localTime = 1f / 60f; _profileTimings = 0; _islandManager = new SimulationIslandManager(); _ownsIslandManager = true; _ownsConstraintSolver = constraintSolver == null; }
//-------------------------------------------------------------- /// <summary> /// Initializes a new instance of the <see cref="Simulation"/> class. /// </summary> public Simulation() { Settings = new SimulationSettings(); var collisionDetection = new CollisionDetection { CollisionFilter = new CollisionFilter(), FullContactSetPerFrame = true }; CollisionDomain = new CollisionDomain(collisionDetection); ConstraintSolver = new SequentialImpulseBasedSolver(this); Constraints = new ConstraintCollection(); Constraints.CollectionChanged += OnConstraintsChanged; ForceEffects = new ForceEffectCollection(); ForceEffects.CollectionChanged += OnForceEffectsChanged; RigidBodies = new RigidBodyCollection(); RigidBodies.CollectionChanged += OnRigidBodiesChanged; ContactConstraintsInternal = new List<ContactConstraint>(); IslandManager = new SimulationIslandManager(this); // Define the "World" as a rigid body. // - World is an imaginary body that is used to define the space of the simulation. // - The user can use World in constraints e.g. to anchor objects in the world. // - No contacts are computed for World. World = new RigidBody(new BoxShape(20000, 20000, 20000)) { CollisionResponseEnabled = false, CollisionObject = { Type = CollisionObjectType.Trigger }, MotionType = MotionType.Static, Name = "World", Simulation = this, }; // Remove "World" from the collision domain. CollisionDomain.CollisionObjects.Remove(World.CollisionObject); #if STOPWATCH Diagnostics = new SimulationDiagnostics(); #endif // Store delegate methods to avoid garbage when multithreading. _updateVelocityMethod = i => { var body = RigidBodies[i]; body.UpdateVelocity(_fixedTimeStep); }; _solveIslandMethod = SolveIsland; _updatePoseMethod = i => { var body = RigidBodies[i]; body.UpdatePose(_fixedTimeStep); }; _computeTimeOfImpactMethod = ComputeTimeOfImpact_Multithreaded; _moveToTimeOfImpactMethod = MoveToTimeOfImpact; }