private void CheckParticleEdge_F2D( ref List <Particle.CCDDebugInfo> ccds, Particle particle, Particle origin, Particle neighbor, ref List <CollisionSubframeBuffer> collisionBuffer, double timeCoefficientPrediction, CollisionSubframeBuffer subframeToAdd ) { // swept collision for body LineSegment edge = new LineSegment(origin.x, neighbor.x); LineSegment edgeNext = new LineSegment(edge.start + origin.v * timeCoefficientPrediction, edge.end + neighbor.v * timeCoefficientPrediction); EdgePointCCDSolver.SolverInput solverInput = new EdgePointCCDSolver.SolverInput(edge, edgeNext, particle.x, particle.x); double?ccdCollisionTime = EdgePointCCDSolver.Solve(solverInput); if (ccdCollisionTime != null) { Particle.CCDDebugInfo ccd = GenerateDebugInfo(solverInput, ccdCollisionTime.Value); CollisionSubframeBuffer contact = GenerateContact_ImpulseConservation_F2D( particle, origin, neighbor, ccd, ccdCollisionTime.Value, timeCoefficientPrediction, subframeToAdd ); if (contact != null) { collisionBuffer.Add(contact); } ccds.Add(ccd); if (LsmBody.pauseOnBodyBodyCollision) { Testbed.Paused = true; } } }
private void CheckParticleEdge_F2D( ref List<Particle.CCDDebugInfo> ccds, Particle particle, Particle origin, Particle neighbor, ref List<CollisionSubframeBuffer> collisionBuffer, double timeCoefficientPrediction, CollisionSubframeBuffer subframeToAdd ) { // swept collision for body LineSegment edge = new LineSegment(origin.x, neighbor.x); LineSegment edgeNext = new LineSegment(edge.start + origin.v * timeCoefficientPrediction, edge.end + neighbor.v * timeCoefficientPrediction); EdgePointCCDSolver.SolverInput solverInput = new EdgePointCCDSolver.SolverInput(edge, edgeNext, particle.x, particle.x); double? ccdCollisionTime = EdgePointCCDSolver.Solve(solverInput); if (ccdCollisionTime != null) { Particle.CCDDebugInfo ccd = GenerateDebugInfo(solverInput, ccdCollisionTime.Value); CollisionSubframeBuffer contact = GenerateContact_ImpulseConservation_F2D( particle, origin, neighbor, ccd, ccdCollisionTime.Value, timeCoefficientPrediction, subframeToAdd ); if (contact != null) { collisionBuffer.Add(contact); } ccds.Add(ccd); if (LsmBody.pauseOnBodyBodyCollision) Testbed.Paused = true; } }
private void CheckParticleEdge_D2D( ref List<Particle.CCDDebugInfo> ccds, Particle particle, Particle origin, Particle neighbor, ref List<CollisionSubframeBuffer> collisionBuffer, double timeCoefficientPrediction, CollisionSubframeBuffer subframeToAdd ) { // TODO: avoid code coping (see below) Vector2 pos = particle.x; Vector2 velocity = particle.v; Vector2 posNext = pos + velocity * timeCoefficientPrediction; // swept collision for body LineSegment edge = new LineSegment(origin.x, neighbor.x); LineSegment edgeNext = new LineSegment(edge.start + origin.v * timeCoefficientPrediction, edge.end + neighbor.v * timeCoefficientPrediction); EdgePointCCDSolver.SolverInput solverInput = new EdgePointCCDSolver.SolverInput(edge, edgeNext, pos, posNext); double? ccdCollisionTime = EdgePointCCDSolver.Solve(solverInput); if (ccdCollisionTime != null) { Particle.CCDDebugInfo ccd = GenerateDebugInfo(solverInput, ccdCollisionTime.Value); CollisionSubframeBuffer contact = // TODO: use the Rule of conservative impulse to handle this case. Simple reflection rule is not effective here. GenerateContact_ImpulseConservation( // GenerateContact_Reflection( particle, origin, neighbor, ccd, ccdCollisionTime.Value, timeCoefficientPrediction, subframeToAdd ); if (contact != null) { collisionBuffer.Add(contact); } ccds.Add(ccd); if (LsmBody.pauseOnBodyBodyCollision) Testbed.Paused = true; } }