move stuff to model_physics
This commit is contained in:
parent
19c7a8924e
commit
7ce08b0bbe
@ -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)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user