pull out collision handlers into functions

This commit is contained in:
Quaternions 2024-08-08 15:54:23 -07:00
parent b9e34f53c3
commit cfee6f119f

View File

@ -634,7 +634,7 @@ pub struct ContactCollision{
face_id:model_physics::MinkowskiFace, face_id:model_physics::MinkowskiFace,
convex_mesh_id:ConvexMeshId, convex_mesh_id:ConvexMeshId,
} }
#[derive(Debug,Clone,Eq,Hash,PartialEq)] #[derive(Debug,Clone,Copy,Eq,Hash,PartialEq)]
pub struct IntersectCollision{ pub struct IntersectCollision{
convex_mesh_id:ConvexMeshId, convex_mesh_id:ConvexMeshId,
} }
@ -1271,25 +1271,16 @@ fn run_teleport_behaviour(wormhole:&Option<gameplay_attributes::Wormhole>,models
} }
} }
fn atomic_internal_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:TimedInstruction<PhysicsInternalInstruction>){ fn collision_start_contact(
state.time=ins.time; state:&mut PhysicsState,
let should_advance_body=match ins.instruction{ data:&PhysicsData,
PhysicsInternalInstruction::CollisionStart(_) contacting:&gameplay_attributes::ContactingAttributes,
|PhysicsInternalInstruction::CollisionEnd(_) general:&gameplay_attributes::GeneralAttributes,
|PhysicsInternalInstruction::StrafeTick contact:ContactCollision,
|PhysicsInternalInstruction::ReachWalkTargetVelocity=>true, ){
};
if should_advance_body{
state.body.advance_time(state.time);
}
match ins.instruction{
PhysicsInternalInstruction::CollisionStart(collision)=>{
let convex_mesh_id=collision.convex_mesh_id();
match (data.models.attr(convex_mesh_id.model_id),&collision){
(PhysicsCollisionAttributes::Contact{contacting,general},&Collision::Contact(contact))=>{
let incident_velocity=state.body.velocity; let incident_velocity=state.body.velocity;
//add to touching //add to touching
state.touching.insert(collision); state.touching.insert(Collision::Contact(contact));
//clip v //clip v
set_velocity(&mut state.body,&state.touching,&data.models,&data.hitbox_mesh,incident_velocity); set_velocity(&mut state.body,&state.touching,&data.models,&data.hitbox_mesh,incident_velocity);
match &contacting.contact_behaviour{ match &contacting.contact_behaviour{
@ -1324,7 +1315,7 @@ fn atomic_internal_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:Tim
} }
//I love making functions with 10 arguments to dodge the borrow checker //I love making functions with 10 arguments to dodge the borrow checker
if let Some(mode)=data.modes.get_mode(state.mode_state.get_mode_id()){ if let Some(mode)=data.modes.get_mode(state.mode_state.get_mode_id()){
run_teleport_behaviour(&general.wormhole,&data.models,mode,&state.style,&data.hitbox_mesh,&mut state.mode_state,&mut state.touching,&mut state.body,convex_mesh_id); run_teleport_behaviour(&general.wormhole,&data.models,mode,&state.style,&data.hitbox_mesh,&mut state.mode_state,&mut state.touching,&mut state.body,contact.convex_mesh_id);
} }
if state.style.get_control(Controls::Jump,state.input_state.controls){ if state.style.get_control(Controls::Jump,state.input_state.controls){
if let (Some(jump_settings),Some(walk_state))=(&state.style.jump,state.move_state.get_walk_state()){ if let (Some(jump_settings),Some(walk_state))=(&state.style.jump,state.move_state.get_walk_state()){
@ -1351,16 +1342,23 @@ fn atomic_internal_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:Tim
//doing enum to set the acceleration when surfing //doing enum to set the acceleration when surfing
//doing input_and_body to refresh the walk state if you hit a wall while accelerating //doing input_and_body to refresh the walk state if you hit a wall while accelerating
state.apply_enum_and_input_and_body(data); state.apply_enum_and_input_and_body(data);
}, }
(PhysicsCollisionAttributes::Intersect{intersecting:_,general},Collision::Intersect(_intersect))=>{
fn collision_start_intersect(
state:&mut PhysicsState,
data:&PhysicsData,
intersecting:&gameplay_attributes::IntersectingAttributes,
general:&gameplay_attributes::GeneralAttributes,
intersect:IntersectCollision,
){
//I think that setting the velocity to 0 was preventing surface contacts from entering an infinite loop //I think that setting the velocity to 0 was preventing surface contacts from entering an infinite loop
state.touching.insert(collision); state.touching.insert(Collision::Intersect(intersect));
//insta booster! //insta booster!
if let Some(booster)=&general.booster{ if let Some(booster)=&general.booster{
state.cull_velocity(data,booster.boost(state.body.velocity)); state.cull_velocity(data,booster.boost(state.body.velocity));
} }
if let Some(mode)=data.modes.get_mode(state.mode_state.get_mode_id()){ if let Some(mode)=data.modes.get_mode(state.mode_state.get_mode_id()){
let zone=mode.get_zone(convex_mesh_id.model_id.into()); let zone=mode.get_zone(intersect.convex_mesh_id.model_id.into());
match zone{ match zone{
Some(gameplay_modes::Zone::Start)=>{ Some(gameplay_modes::Zone::Start)=>{
println!("@@@@ Starting new run!"); println!("@@@@ Starting new run!");
@ -1375,16 +1373,18 @@ fn atomic_internal_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:Tim
Some(gameplay_modes::Zone::Anticheat)=>state.run.flag(run::FlagReason::Anticheat), Some(gameplay_modes::Zone::Anticheat)=>state.run.flag(run::FlagReason::Anticheat),
None=>(), None=>(),
} }
run_teleport_behaviour(&general.wormhole,&data.models,mode,&state.style,&data.hitbox_mesh,&mut state.mode_state,&mut state.touching,&mut state.body,convex_mesh_id); run_teleport_behaviour(&general.wormhole,&data.models,mode,&state.style,&data.hitbox_mesh,&mut state.mode_state,&mut state.touching,&mut state.body,intersect.convex_mesh_id);
} }
}, }
_=>panic!("invalid pair"),
} fn collision_end_contact(
}, state:&mut PhysicsState,
PhysicsInternalInstruction::CollisionEnd(collision)=>{ data:&PhysicsData,
match (data.models.attr(collision.convex_mesh_id().model_id),&collision){ _contacting:&gameplay_attributes::ContactingAttributes,
(PhysicsCollisionAttributes::Contact{contacting:_,general:_},&Collision::Contact(contact))=>{ _general:&gameplay_attributes::GeneralAttributes,
state.touching.remove(&collision);//remove contact before calling contact_constrain_acceleration contact:ContactCollision,
){
state.touching.remove(&Collision::Contact(contact));//remove contact before calling contact_constrain_acceleration
//check ground //check ground
//TODO do better //TODO do better
//this is inner code from state.cull_velocity //this is inner code from state.cull_velocity
@ -1395,11 +1395,17 @@ fn atomic_internal_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:Tim
}, },
None=>state.apply_enum_and_body(data), None=>state.apply_enum_and_body(data),
} }
}, }
(PhysicsCollisionAttributes::Intersect{intersecting: _,general:_},Collision::Intersect(_))=>{ fn collision_end_intersect(
state.touching.remove(&collision); state:&mut PhysicsState,
data:&PhysicsData,
_intersecting:&gameplay_attributes::IntersectingAttributes,
_general:&gameplay_attributes::GeneralAttributes,
intersect:IntersectCollision,
){
state.touching.remove(&Collision::Intersect(intersect));
if let Some(mode)=data.modes.get_mode(state.mode_state.get_mode_id()){ if let Some(mode)=data.modes.get_mode(state.mode_state.get_mode_id()){
let zone=mode.get_zone(collision.convex_mesh_id().model_id.into()); let zone=mode.get_zone(intersect.convex_mesh_id.model_id.into());
match zone{ match zone{
Some(gameplay_modes::Zone::Start)=>{ Some(gameplay_modes::Zone::Start)=>{
match state.run.start(state.time){ match state.run.start(state.time){
@ -1410,7 +1416,34 @@ fn atomic_internal_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:Tim
_=>(), _=>(),
} }
} }
}
fn atomic_internal_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:TimedInstruction<PhysicsInternalInstruction>){
state.time=ins.time;
let should_advance_body=match ins.instruction{
PhysicsInternalInstruction::CollisionStart(_)
|PhysicsInternalInstruction::CollisionEnd(_)
|PhysicsInternalInstruction::StrafeTick
|PhysicsInternalInstruction::ReachWalkTargetVelocity=>true,
};
if should_advance_body{
state.body.advance_time(state.time);
}
match ins.instruction{
PhysicsInternalInstruction::CollisionStart(collision)=>{
match (data.models.attr(collision.convex_mesh_id().model_id),&collision){
(PhysicsCollisionAttributes::Contact{contacting,general},&Collision::Contact(contact))=>
collision_start_contact(state,data,contacting,general,contact),
(PhysicsCollisionAttributes::Intersect{intersecting,general},&Collision::Intersect(intersect))=>
collision_start_intersect(state,data,intersecting,general,intersect),
_=>panic!("invalid pair"),
}
}, },
PhysicsInternalInstruction::CollisionEnd(collision)=>{
match (data.models.attr(collision.convex_mesh_id().model_id),&collision){
(PhysicsCollisionAttributes::Contact{contacting,general},&Collision::Contact(contact))=>
collision_end_contact(state,data,contacting,general,contact),
(PhysicsCollisionAttributes::Intersect{intersecting,general},&Collision::Intersect(intersect))=>
collision_end_intersect(state,data,intersecting,general,intersect),
_=>panic!("invalid pair"), _=>panic!("invalid pair"),
} }
}, },