physics: cylinder hitbox

This commit is contained in:
Quaternions 2025-03-19 16:13:07 -07:00
parent 02615af1fd
commit 9e0c1b3c12

@ -215,7 +215,42 @@ impl PhysicsMesh{
}
}
pub fn unit_cylinder()->Self{
Self::unit_cube()
const N:usize=24;
let mut mb=model::MeshBuilder::new();
let color=mb.acquire_color_id(model::Color4::ONE);
let tex=mb.acquire_tex_id(model::TextureCoordinate::ZERO);
let normal=mb.acquire_normal_id(vec3::ZERO);
let mut verts=Vec::with_capacity(2*N);
for i in 0..N{
let (x,z)=integer::Angle32::raw((integer::Angle32::PI.get() as usize*i/N) as i32).cos_sin();
//top
let pos=mb.acquire_pos_id(Planar64Vec3::new([x,Planar64::ONE,z]));
verts.push(mb.acquire_vertex_id(model::IndexedVertex{pos,color,tex,normal}));
//bottom
let pos=mb.acquire_pos_id(Planar64Vec3::new([x,Planar64::NEG_ONE,z]));
verts.push(mb.acquire_vertex_id(model::IndexedVertex{pos,color,tex,normal}));
}
let mut polygon_list=Vec::with_capacity(N+2);
// side faces
for i in 0..N{
polygon_list.push(vec![
verts[i*2],
verts[(i*2+2)%N],
verts[(i*2+3)%N],
verts[(i*2+1)%N],
]);
}
// top face
polygon_list.push((0..N).map(|i|verts[2*i]).collect());
// bottom face
polygon_list.push((0..N).map(|i|verts[2*i+1]).collect());
let polygon_groups=vec![model::PolygonGroup::PolygonList(model::PolygonList::new(polygon_list))];
let graphics_groups=vec![];
let physics_groups=vec![model::IndexedPhysicsGroup{
groups:vec![model::PolygonGroupId::new(0)],
}];
let mesh=&mb.build(polygon_groups,graphics_groups,physics_groups);
mesh.try_into().unwrap()
}
#[inline]
pub const fn complete_mesh(&self)->&PhysicsMeshTopology{