diff --git a/engine/physics/src/physics.rs b/engine/physics/src/physics.rs index 6cdfc83f..eae0ffa8 100644 --- a/engine/physics/src/physics.rs +++ b/engine/physics/src/physics.rs @@ -1167,16 +1167,18 @@ impl<'a> PhysicsContext<'a>{ let model_mesh=data.models.mesh(convex_mesh_id); let minkowski=model_physics::MinkowskiMesh::minkowski_sum(model_mesh,data.hitbox_mesh.transformed_mesh()); collector.collect(minkowski.predict_collision_in(relative_body,state.time..=collector.time()) - //temp (?) code to avoid collision loops - .map(|(face,dt)|{ - // this must be rounded to avoid the infinite loop when hitting the start zone - let time=relative_body.time+dt.into(); - (time,face,dt) - }).map(|(time,face,dt)| + .and_then(|(face,dt)|{ + // prevent active intersects from repeatedly getting picked up + let collision=Collision::new(convex_mesh_id,face); + match collision{ + Collision::Contact(contact)=>(!state.touching.contacts.contains(&contact)).then_some((collision,dt)), + Collision::Intersect(intersect)=>(!state.touching.intersects.contains(&intersect)).then_some((collision,dt)), + } + }).map(|(collision,dt)| TimedInstruction{ - time, + time:relative_body.time+dt.into(), instruction:InternalInstruction::CollisionStart( - Collision::new(convex_mesh_id,face), + collision, dt ) }