///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);
        }
Example #3
0
 //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;
 }
 //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;
 }
Example #5
0
        //--------------------------------------------------------------
        /// <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;
        }