Compare commits
8 Commits
min-diff
...
rewrite-ph
| Author | SHA1 | Date | |
|---|---|---|---|
|
16c5524f34
|
|||
|
b09ec62db7
|
|||
|
e7171b583c
|
|||
|
bf456e891c
|
|||
|
99eb26e9a8
|
|||
|
a301cf7ad9
|
|||
|
3b5edae0d9
|
|||
|
f95144cab1
|
@@ -1,7 +1,9 @@
|
||||
mod body;
|
||||
mod push_solve;
|
||||
mod face_crawler;
|
||||
mod mesh_query;
|
||||
mod minkowski;
|
||||
mod model;
|
||||
mod push_solve;
|
||||
|
||||
pub mod physics;
|
||||
|
||||
|
||||
36
engine/physics/src/mesh_query.rs
Normal file
36
engine/physics/src/mesh_query.rs
Normal file
@@ -0,0 +1,36 @@
|
||||
pub struct Vert<VertId>(pub VertId);
|
||||
pub struct Edge<VertId>(pub VertId,pub VertId);
|
||||
pub struct Face<VertId>(pub VertId,pub VertId,pub VertId);
|
||||
|
||||
pub enum FEV<VertId>{
|
||||
Vert(Vert<VertId>),
|
||||
Edge(Edge<VertId>),
|
||||
Face(Face<VertId>),
|
||||
}
|
||||
|
||||
pub trait MeshTopology{
|
||||
type VertId;
|
||||
fn for_each_vert_edge(&self,vert_id:Vert<Self::VertId>,f:impl FnMut(Edge<Self::VertId>));
|
||||
fn for_each_vert_face(&self,vert_id:Vert<Self::VertId>,f:impl FnMut(Face<Self::VertId>));
|
||||
fn edge_faces(&self,edge_id:Edge<Self::VertId>)->impl AsRef<[Face<Self::VertId>;2]>;
|
||||
fn edge_verts(&self,edge_id:Edge<Self::VertId>)->impl AsRef<[Vert<Self::VertId>;2]>;
|
||||
fn for_each_face_vert(&self,face_id:Face<Self::VertId>,f:impl FnMut(Vert<Self::VertId>));
|
||||
fn for_each_face_edge(&self,face_id:Face<Self::VertId>,f:impl FnMut(Edge<Self::VertId>));
|
||||
}
|
||||
|
||||
// Make face_nd d value relative
|
||||
// euclidean point?
|
||||
// Simplex physics
|
||||
// Directed edge nucessary?
|
||||
// recursive for_each function calls
|
||||
// define faces from vertices (Fixed<2> vs Fixed<3>)
|
||||
pub trait MeshQuery:MeshTopology{
|
||||
type Position;
|
||||
type Normal;
|
||||
type Offset;
|
||||
fn vert(&self,vert_id:Vert<Self::VertId>)->Self::Position;
|
||||
/// This must return a point inside the mesh.
|
||||
fn hint_point(&self)->Self::Position;
|
||||
fn face_nd(&self,face_id:Face<Self::VertId>)->(Self::Normal,Self::Offset);
|
||||
fn edge_n(&self,edge_id:Edge<Self::VertId>)->Self::Position;
|
||||
}
|
||||
75
engine/physics/src/minkowski.rs
Normal file
75
engine/physics/src/minkowski.rs
Normal file
@@ -0,0 +1,75 @@
|
||||
use crate::mesh_query::{MeshQuery,MeshTopology};
|
||||
use crate::mesh_query::{Face,Edge,Vert};
|
||||
|
||||
struct AsRefHelper<T>(T);
|
||||
impl<T> AsRef<T> for AsRefHelper<T>{
|
||||
fn as_ref(&self)->&T{
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
pub struct MinkowskiVert<V>{
|
||||
vert0:V,
|
||||
vert1:V,
|
||||
}
|
||||
|
||||
pub struct Minkowski<M>{
|
||||
mesh0:M,
|
||||
mesh1:M,
|
||||
}
|
||||
|
||||
impl<M> Minkowski<M>{
|
||||
pub fn sum(mesh0:M,mesh1:M)->Self{
|
||||
Self{mesh0,mesh1}
|
||||
}
|
||||
}
|
||||
|
||||
impl<M:MeshTopology> MeshTopology for Minkowski<M>{
|
||||
type VertId=MinkowskiVert<M::VertId>;
|
||||
fn for_each_vert_edge(&self,vert_id:Vert<Self::VertId>,f:impl FnMut(Edge<Self::VertId>)){
|
||||
todo!()
|
||||
}
|
||||
fn for_each_vert_face(&self,vert_id:Vert<Self::VertId>,f:impl FnMut(Face<Self::VertId>)){
|
||||
todo!()
|
||||
}
|
||||
fn edge_faces(&self,edge_id:Edge<Self::VertId>)->impl AsRef<[Face<Self::VertId>;2]>{
|
||||
AsRefHelper(todo!())
|
||||
}
|
||||
fn edge_verts(&self,edge_id:Edge<Self::VertId>)->impl AsRef<[Vert<Self::VertId>;2]>{
|
||||
AsRefHelper(todo!())
|
||||
}
|
||||
fn for_each_face_vert(&self,face_id:Face<Self::VertId>,f:impl FnMut(Vert<Self::VertId>)){
|
||||
todo!()
|
||||
}
|
||||
fn for_each_face_edge(&self,face_id:Face<Self::VertId>,f:impl FnMut(Edge<Self::VertId>)){
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
use strafesnet_common::integer::vec3::Vector3;
|
||||
use strafesnet_common::integer::Fixed;
|
||||
impl<M> MeshQuery for Minkowski<M>
|
||||
where
|
||||
M:MeshQuery<
|
||||
Position=Vector3<Fixed<1,32>>,
|
||||
Normal=Vector3<Fixed<3,96>>,
|
||||
Offset=Fixed<4,128>,
|
||||
>
|
||||
{
|
||||
type Position=M::Position;
|
||||
type Normal=M::Normal;
|
||||
type Offset=M::Offset;
|
||||
fn vert(&self,vert_id:Vert<Self::VertId>)->Self::Position{
|
||||
let Vert(MinkowskiVert{vert0,vert1})=vert_id;
|
||||
self.mesh1.vert(Vert(vert1))-self.mesh0.vert(Vert(vert0))
|
||||
}
|
||||
fn hint_point(&self)->Self::Position{
|
||||
self.mesh1.hint_point()-self.mesh0.hint_point()
|
||||
}
|
||||
fn face_nd(&self,face_id:Face<Self::VertId>)->(Self::Normal,Self::Offset){
|
||||
todo!()
|
||||
}
|
||||
fn edge_n(&self,edge_id:Edge<Self::VertId>)->Self::Position{
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
2
engine/physics/src/physics_mesh.rs
Normal file
2
engine/physics/src/physics_mesh.rs
Normal file
@@ -0,0 +1,2 @@
|
||||
// PhysicsMesh
|
||||
// TransformedMesh?
|
||||
Reference in New Issue
Block a user