From 10ca30db2e71d293930220ae5639f57514ea835b Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Thu, 6 Feb 2025 15:04:41 -0800 Subject: [PATCH] bsp_loader: split brush functions so I can be lazy --- lib/bsp_loader/src/brush.rs | 68 ++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/lib/bsp_loader/src/brush.rs b/lib/bsp_loader/src/brush.rs index 8e53182..5219028 100644 --- a/lib/bsp_loader/src/brush.rs +++ b/lib/bsp_loader/src/brush.rs @@ -212,6 +212,35 @@ impl std::fmt::Display for BrushToMeshError{ } impl core::error::Error for BrushToMeshError{} +pub fn faces_to_mesh(faces:Vec<Vec<integer::Planar64Vec3>>)->model::Mesh{ + // generate the mesh + let mut mb=model::MeshBuilder::new(); + let color=mb.acquire_color_id(glam::Vec4::ONE); + let tex=mb.acquire_tex_id(glam::Vec2::ZERO); + // normals are ignored by physics + let normal=mb.acquire_normal_id(integer::vec3::ZERO); + + let polygon_list=faces.into_iter().map(|face|{ + face.into_iter().map(|pos|{ + let pos=mb.acquire_pos_id(pos); + mb.acquire_vertex_id(model::IndexedVertex{ + pos, + tex, + normal, + color, + }) + }).collect() + }).collect(); + + let polygon_groups=vec![model::PolygonGroup::PolygonList(model::PolygonList::new(polygon_list))]; + let physics_groups=vec![model::IndexedPhysicsGroup{ + groups:vec![model::PolygonGroupId::new(0)], + }]; + let graphics_groups=vec![]; + + mb.build(polygon_groups,graphics_groups,physics_groups) +} + pub fn brush_to_mesh(bsp:&vbsp::Bsp,brush:&vbsp::Brush)->Result<model::Mesh,BrushToMeshError>{ let brush_start_idx=brush.brush_side as usize; let sides_range=brush_start_idx..brush_start_idx+brush.num_brush_sides as usize; @@ -230,32 +259,23 @@ pub fn brush_to_mesh(bsp:&vbsp::Bsp,brush:&vbsp::Brush)->Result<model::Mesh,Brus let faces=planes_to_faces(face_list).map_err(BrushToMeshError::InvalidPlanes)?; - // generate the mesh - let mut mb=model::MeshBuilder::new(); - let color=mb.acquire_color_id(glam::Vec4::ONE); - let tex=mb.acquire_tex_id(glam::Vec2::ZERO); - // normals are ignored by physics - let normal=mb.acquire_normal_id(integer::vec3::ZERO); + let mesh=faces_to_mesh(faces.faces); - let polygon_list=faces.faces.into_iter().map(|face|{ - face.into_iter().map(|pos|{ - let pos=mb.acquire_pos_id(pos); - mb.acquire_vertex_id(model::IndexedVertex{ - pos, - tex, - normal, - color, - }) - }).collect() - }).collect(); + Ok(mesh) +} - let polygon_groups=vec![model::PolygonGroup::PolygonList(model::PolygonList::new(polygon_list))]; - let physics_groups=vec![model::IndexedPhysicsGroup{ - groups:vec![model::PolygonGroupId::new(0)], - }]; - let graphics_groups=vec![]; - - Ok(mb.build(polygon_groups,graphics_groups,physics_groups)) +pub fn unit_cube()->model::Mesh{ + let face_list=[ + Face{normal:integer::vec3::X,dot:Planar64::ONE}, + Face{normal:integer::vec3::Y,dot:Planar64::ONE}, + Face{normal:integer::vec3::Z,dot:Planar64::ONE}, + Face{normal:integer::vec3::NEG_X,dot:Planar64::ONE}, + Face{normal:integer::vec3::NEG_Y,dot:Planar64::ONE}, + Face{normal:integer::vec3::NEG_Z,dot:Planar64::ONE}, + ].into_iter().collect(); + let faces=planes_to_faces(face_list).unwrap(); + let mesh=faces_to_mesh(faces.faces); + mesh } #[cfg(test)]