move stuff to model_physics

This commit is contained in:
Quaternions 2023-10-26 16:18:32 -07:00
parent 19c7a8924e
commit 7ce08b0bbe
3 changed files with 96 additions and 45 deletions

View File

@ -1,17 +1,7 @@
use crate::physics::Body; use crate::physics::Body;
use crate::model_physics::{VirtualMesh,FEV,FaceId};
use crate::integer::{Time,Planar64Vec3}; use crate::integer::{Time,Planar64Vec3};
struct VertexId(usize);
struct EdgeId(usize);
struct FaceId(usize);
//Vertex <-> Edge <-> Face -> Collide
enum FEV{
Face(FaceId),
Edge(EdgeId),
Vertex(VertexId),
}
struct State{ struct State{
time:Time, time:Time,
fev:FEV, fev:FEV,
@ -54,39 +44,17 @@ impl State{
} }
} }
//Note that a face on a minkowski mesh refers to a pair of fevs on the meshes it's summed from pub fn predict_collision(mesh:&VirtualMesh,relative_body:&Body,time_limit:Time)->Option<(FaceId,Time)>{
//(face,vertex)
//(edge,edge)
//(vertex,face)
struct VirtualMesh<'a>{
mesh0:&'a PhysicsMesh,
mesh1:&'a PhysicsMesh,
}
impl VirtualMesh<'_>{
pub fn minkowski_sum<'a>(mesh0:&PhysicsMesh,mesh1:&PhysicsMesh)->VirtualMesh<'a>{
Self{
mesh0,
mesh1,
}
}
fn closest_fev(&self,point:Planar64Vec3)->FEV{
//put some genius code right here
todo!()
}
pub fn predict_collision(&self,relative_body:&Body,time_limit:Time)->Option<(FaceId,Time)>{
let mut state=State{ let mut state=State{
time:relative_body.time, time:relative_body.time,
fev:self.closest_fev(relative_body.position), fev:mesh.closest_fev(relative_body.position),
}; };
//it would be possible to write down the point of closest approach... //it would be possible to write down the point of closest approach...
loop{ loop{
match state.next_transition(self,relative_body,time_limit){ match state.next_transition(mesh,relative_body,time_limit){
Transition::Miss=>return None, Transition::Miss=>return None,
Transition::NextState(next_state)=>state=next_state, Transition::NextState(next_state)=>state=next_state,
Transition::Hit(hit_face,hit_time)=>return Some((hit_face,hit_time)), Transition::Hit(hit_face,hit_time)=>return Some((hit_face,hit_time)),
} }
} }
}
} }

View File

@ -14,6 +14,7 @@ mod instruction;
mod load_roblox; mod load_roblox;
mod face_crawler; mod face_crawler;
mod compat_worker; mod compat_worker;
mod model_physics;
mod model_graphics; mod model_graphics;
mod physics_worker; mod physics_worker;
mod graphics_worker; mod graphics_worker;

View File

@ -1 +1,83 @@
// use crate::integer::{Planar64,Planar64Vec3};
pub struct VertId(usize);
pub struct EdgeId(usize);
pub struct FaceId(usize);
//Vertex <-> Edge <-> Face -> Collide
pub enum FEV{
Face(FaceId),
Edge(EdgeId),
Vertex(VertId),
}
//use Unit32 #[repr(C)] for map files
struct Face{
normal:Planar64Vec3,
dot:Planar64,
}
struct FaceRefs{
edges:Vec<EdgeId>,
verts:Vec<VertId>,
}
struct EdgeRefs{
f0:FaceId,//left
f1:FaceId,//right
v0:VertId,//bottom
v1:VertId,//top
v0f:FaceId,//bottom capping face
v1f:FaceId,//top capping face
}
struct VertRefs{
faces:Vec<FaceId>,
edges:Vec<EdgeId>,
}
pub struct PhysicsMesh{
faces:Vec<Face>,
face_topology:Vec<FaceRefs>,
edge_topology:Vec<EdgeRefs>,
vert_topology:Vec<VertRefs>,
}
impl PhysicsMesh{
pub fn face_edges(face_id:FaceId)->Vec<EdgeId>{
todo!()
}
pub fn edge_side_faces(edge_id:EdgeId)->[FaceId;2]{
todo!()
}
pub fn edge_end_faces(edge_id:EdgeId)->[FaceId;2]{
todo!()
}
pub fn edge_verts(edge_id:EdgeId)->[VertId;2]{
todo!()
}
pub fn vert_edges(vert_id:VertId)->Vec<EdgeId>{
todo!()
}
pub fn vert_faces(vert_id:VertId)->Vec<FaceId>{
todo!()
}
}
//Note that a face on a minkowski mesh refers to a pair of fevs on the meshes it's summed from
//(face,vertex)
//(edge,edge)
//(vertex,face)
pub struct VirtualMesh<'a>{
mesh0:&'a PhysicsMesh,
mesh1:&'a PhysicsMesh,
}
impl VirtualMesh<'_>{
pub fn minkowski_sum<'a>(mesh0:&'a PhysicsMesh,mesh1:&'a PhysicsMesh)->VirtualMesh<'a>{
VirtualMesh{
mesh0,
mesh1,
}
}
pub fn closest_fev(&self,point:Planar64Vec3)->FEV{
//put some genius code right here
todo!()
}
}