forked from StrafesNET/strafe-project
physics: change body api
This commit is contained in:
parent
b6b090de78
commit
5f2cf8f32e
@ -31,6 +31,14 @@ impl<T> Body<T>
|
|||||||
time,
|
time,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub const fn relative_to<'a>(&'a self,body0:&'a Body<T>)->VirtualBody<'a,T>{
|
||||||
|
//(p0,v0,a0,t0)
|
||||||
|
//(p1,v1,a1,t1)
|
||||||
|
VirtualBody{
|
||||||
|
body0,
|
||||||
|
body1:self,
|
||||||
|
}
|
||||||
|
}
|
||||||
pub fn extrapolated_position(&self,time:Time<T>)->Planar64Vec3{
|
pub fn extrapolated_position(&self,time:Time<T>)->Planar64Vec3{
|
||||||
let dt=time-self.time;
|
let dt=time-self.time;
|
||||||
self.position
|
self.position
|
||||||
@ -137,14 +145,6 @@ pub struct VirtualBody<'a,T>{
|
|||||||
impl<T> VirtualBody<'_,T>
|
impl<T> VirtualBody<'_,T>
|
||||||
where Time<T>:Copy,
|
where Time<T>:Copy,
|
||||||
{
|
{
|
||||||
pub const fn relative<'a>(body0:&'a Body<T>,body1:&'a Body<T>)->VirtualBody<'a,T>{
|
|
||||||
//(p0,v0,a0,t0)
|
|
||||||
//(p1,v1,a1,t1)
|
|
||||||
VirtualBody{
|
|
||||||
body0,
|
|
||||||
body1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pub fn extrapolated_position(&self,time:Time<T>)->Planar64Vec3{
|
pub fn extrapolated_position(&self,time:Time<T>)->Planar64Vec3{
|
||||||
self.body1.extrapolated_position(time)-self.body0.extrapolated_position(time)
|
self.body1.extrapolated_position(time)-self.body0.extrapolated_position(time)
|
||||||
}
|
}
|
||||||
|
@ -791,7 +791,7 @@ impl TouchingState{
|
|||||||
crate::push_solve::push_solve(&contacts,acceleration)
|
crate::push_solve::push_solve(&contacts,acceleration)
|
||||||
}
|
}
|
||||||
fn predict_collision_end(&self,collector:&mut instruction::InstructionCollector<InternalInstruction,TimeInner>,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,body:&Body,start_time:Time){
|
fn predict_collision_end(&self,collector:&mut instruction::InstructionCollector<InternalInstruction,TimeInner>,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,body:&Body,start_time:Time){
|
||||||
// let relative_body=crate::body::VirtualBody::relative(&Body::ZERO,body).body(time);
|
// let relative_body=body.relative_to(&Body::ZERO);
|
||||||
let relative_body=body;
|
let relative_body=body;
|
||||||
for contact in &self.contacts{
|
for contact in &self.contacts{
|
||||||
//detect face slide off
|
//detect face slide off
|
||||||
@ -1140,7 +1140,7 @@ impl PhysicsData{
|
|||||||
state.body.grow_aabb(&mut aabb,state.time,collector.time());
|
state.body.grow_aabb(&mut aabb,state.time,collector.time());
|
||||||
aabb.inflate(data.hitbox_mesh.halfsize);
|
aabb.inflate(data.hitbox_mesh.halfsize);
|
||||||
//relative to moving platforms
|
//relative to moving platforms
|
||||||
//let relative_body=&VirtualBody::relative(&Body::default(),&state.body).body(state.time);
|
//let relative_body=state.body.relative_to(&Body::ZERO);
|
||||||
let relative_body=&state.body;
|
let relative_body=&state.body;
|
||||||
data.bvh.the_tester(&aabb,&mut |&convex_mesh_id|{
|
data.bvh.the_tester(&aabb,&mut |&convex_mesh_id|{
|
||||||
//no checks are needed because of the time limits.
|
//no checks are needed because of the time limits.
|
||||||
@ -1203,7 +1203,7 @@ fn recalculate_touching(
|
|||||||
aabb.grow(body.position);
|
aabb.grow(body.position);
|
||||||
aabb.inflate(hitbox_mesh.halfsize);
|
aabb.inflate(hitbox_mesh.halfsize);
|
||||||
//relative to moving platforms
|
//relative to moving platforms
|
||||||
//let relative_body=&VirtualBody::relative(&Body::default(),&state.body).body(state.time);
|
//let relative_body=state.body.relative_to(&Body::ZERO);
|
||||||
bvh.the_tester(&aabb,&mut |&convex_mesh_id|{
|
bvh.the_tester(&aabb,&mut |&convex_mesh_id|{
|
||||||
//no checks are needed because of the time limits.
|
//no checks are needed because of the time limits.
|
||||||
let model_mesh=models.mesh(convex_mesh_id);
|
let model_mesh=models.mesh(convex_mesh_id);
|
||||||
@ -1954,111 +1954,111 @@ mod test{
|
|||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_east_from_west(){
|
fn test_collision_parabola_edge_east_from_west(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(3,3,0),
|
int3(3,3,0),
|
||||||
int3(100,-1,0),
|
int3(100,-1,0),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_south_from_north(){
|
fn test_collision_parabola_edge_south_from_north(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(0,3,3),
|
int3(0,3,3),
|
||||||
int3(0,-1,100),
|
int3(0,-1,100),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_west_from_east(){
|
fn test_collision_parabola_edge_west_from_east(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(-3,3,0),
|
int3(-3,3,0),
|
||||||
int3(-100,-1,0),
|
int3(-100,-1,0),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_north_from_south(){
|
fn test_collision_parabola_edge_north_from_south(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(0,3,-3),
|
int3(0,3,-3),
|
||||||
int3(0,-1,-100),
|
int3(0,-1,-100),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_north_from_ne(){
|
fn test_collision_parabola_edge_north_from_ne(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(0,6,-7)>>1,
|
int3(0,6,-7)>>1,
|
||||||
int3(-10,-1,1),
|
int3(-10,-1,1),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_north_from_nw(){
|
fn test_collision_parabola_edge_north_from_nw(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(0,6,-7)>>1,
|
int3(0,6,-7)>>1,
|
||||||
int3(10,-1,1),
|
int3(10,-1,1),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_east_from_se(){
|
fn test_collision_parabola_edge_east_from_se(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(7,6,0)>>1,
|
int3(7,6,0)>>1,
|
||||||
int3(-1,-1,-10),
|
int3(-1,-1,-10),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_east_from_ne(){
|
fn test_collision_parabola_edge_east_from_ne(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(7,6,0)>>1,
|
int3(7,6,0)>>1,
|
||||||
int3(-1,-1,10),
|
int3(-1,-1,10),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_south_from_se(){
|
fn test_collision_parabola_edge_south_from_se(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(0,6,7)>>1,
|
int3(0,6,7)>>1,
|
||||||
int3(-10,-1,-1),
|
int3(-10,-1,-1),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_south_from_sw(){
|
fn test_collision_parabola_edge_south_from_sw(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(0,6,7)>>1,
|
int3(0,6,7)>>1,
|
||||||
int3(10,-1,-1),
|
int3(10,-1,-1),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_west_from_se(){
|
fn test_collision_parabola_edge_west_from_se(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(-7,6,0)>>1,
|
int3(-7,6,0)>>1,
|
||||||
int3(1,-1,-10),
|
int3(1,-1,-10),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_parabola_edge_west_from_ne(){
|
fn test_collision_parabola_edge_west_from_ne(){
|
||||||
test_collision(VirtualBody::relative(&Body::ZERO,&Body::new(
|
test_collision(Body::new(
|
||||||
int3(-7,6,0)>>1,
|
int3(-7,6,0)>>1,
|
||||||
int3(1,-1,10),
|
int3(1,-1,10),
|
||||||
int3(0,-1,0),
|
int3(0,-1,0),
|
||||||
Time::ZERO
|
Time::ZERO
|
||||||
)).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
).relative_to(&Body::ZERO).body(Time::from_secs(-1)),Some(Time::from_secs(0)));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collision_oblique(){
|
fn test_collision_oblique(){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user