protected Simulation(BufferPool bufferPool, SimulationAllocationSizes initialAllocationSizes, int solverIterationCount, int solverFallbackBatchThreshold, ITimestepper timestepper) { BufferPool = bufferPool; PhysicsShapes3D = new PhysicsShapes3D(bufferPool, initialAllocationSizes.ShapesPerType); BroadPhase = new BroadPhase(bufferPool, initialAllocationSizes.Bodies, initialAllocationSizes.Bodies + initialAllocationSizes.Statics); Bodies3D = new Bodies3D(bufferPool, PhysicsShapes3D, BroadPhase, initialAllocationSizes.Bodies, initialAllocationSizes.Islands, initialAllocationSizes.ConstraintCountPerBodyEstimate); Statics = new Statics(bufferPool, PhysicsShapes3D, Bodies3D, BroadPhase, initialAllocationSizes.Statics); Solver = new Solver(Bodies3D, BufferPool, solverIterationCount, solverFallbackBatchThreshold, initialCapacity: initialAllocationSizes.Constraints, initialIslandCapacity: initialAllocationSizes.Islands, minimumCapacityPerTypeBatch: initialAllocationSizes.ConstraintsPerTypeBatch); constraintRemover = new ConstraintRemover(BufferPool, Bodies3D, Solver); Sleeper = new IslandSleeper(Bodies3D, Solver, BroadPhase, constraintRemover, BufferPool); Awakener = new IslandAwakener(Bodies3D, Statics, Solver, BroadPhase, Sleeper, bufferPool); Statics.awakener = Awakener; Solver.awakener = Awakener; Bodies3D.Initialize(Solver, Awakener, Sleeper); SolverBatchCompressor = new BatchCompressor(Solver, Bodies3D); BodyLayoutOptimizer = new BodyLayoutOptimizer(Bodies3D, BroadPhase, Solver, bufferPool); ConstraintLayoutOptimizer = new ConstraintLayoutOptimizer(Bodies3D, Solver); Timestepper = timestepper; }
/// <summary> /// Constructs a simulation supporting dynamic movement and constraints with the specified narrow phase callbacks. /// </summary> /// <param name="bufferPool">Buffer pool used to fill persistent structures and main thread ephemeral resources across the engine.</param> /// <param name="narrowPhaseCallbacks">Callbacks to use in the narrow phase.</param> /// <param name="poseIntegratorCallbacks">Callbacks to use in the pose integrator.</param> /// <param name="timestepper">Timestepper that defines how the simulation state should be updated. If null, defaults to PositionFirstTimestepper.</param> /// <param name="solverIterationCount">Number of iterations the solver should use.</param> /// <param name="solverFallbackBatchThreshold">Number of synchronized batches the solver should maintain before falling back to a lower quality jacobi hybrid solver.</param> /// <param name="initialAllocationSizes">Allocation sizes to initialize the simulation with. If left null, default values are chosen.</param> /// <returns>New simulation.</returns> public static Simulation Create <TNarrowPhaseCallbacks, TPoseIntegratorCallbacks>( BufferPool bufferPool, TNarrowPhaseCallbacks narrowPhaseCallbacks, TPoseIntegratorCallbacks poseIntegratorCallbacks, ITimestepper timestepper = null, int solverIterationCount = 8, int solverFallbackBatchThreshold = 64, SimulationAllocationSizes?initialAllocationSizes = null) where TNarrowPhaseCallbacks : struct, INarrowPhaseCallbacks where TPoseIntegratorCallbacks : struct, IPoseIntegratorCallbacks { if (initialAllocationSizes == null) { initialAllocationSizes = new SimulationAllocationSizes { Bodies = 4096, Statics = 4096, ShapesPerType = 128, ConstraintCountPerBodyEstimate = 8, Constraints = 16384, ConstraintsPerTypeBatch = 256 }; } var simulation = new Simulation(bufferPool, initialAllocationSizes.Value, solverIterationCount, solverFallbackBatchThreshold, timestepper == null ? new PositionFirstTimestepper() : timestepper); simulation.PoseIntegrator = new PoseIntegrator <TPoseIntegratorCallbacks>(simulation.Bodies3D, simulation.PhysicsShapes3D, simulation.BroadPhase, poseIntegratorCallbacks); var narrowPhase = new NarrowPhase <TNarrowPhaseCallbacks>(simulation, DefaultTypes.CreateDefaultCollisionTaskRegistry(), DefaultTypes.CreateDefaultSweepTaskRegistry(), narrowPhaseCallbacks, initialAllocationSizes.Value.Islands + 1); DefaultTypes.RegisterDefaults(simulation.Solver, narrowPhase); simulation.NarrowPhase = narrowPhase; simulation.Sleeper.pairCache = narrowPhase.PairCache; simulation.Awakener.pairCache = narrowPhase.PairCache; simulation.Solver.pairCache = narrowPhase.PairCache; simulation.BroadPhaseOverlapFinder = new CollidableOverlapFinder <TNarrowPhaseCallbacks>(narrowPhase, simulation.BroadPhase); return(simulation); }