use bytemuck::{Pod, Zeroable}; #[repr(C)] #[derive(Clone, Copy, Debug)] pub struct Vertex { _pos: [f32; 4], _normal: [f32; 4], } unsafe impl Pod for Vertex {} unsafe impl Zeroable for Vertex {} pub fn vertex(pos: [f32; 3], nor: [f32; 3]) -> Vertex { Vertex { _pos: [pos[0], pos[1], pos[2], 1.0], _normal: [nor[0], nor[1], nor[2], 0.0], } } pub fn import_mesh(mesh_path: &str) -> (Vec, Vec) { //let obj_file = "/home/mrh/source/3d-min-viable-eng/resources/Tree_01.obj"; //let mtl_file = "/home/mrh/source/3d-min-viable-eng/resources/Tree_01.mtl"; let (models, materials) = tobj::load_obj(mesh_path, false).expect("Failed to load file"); //let q = tobj::load_mtl(mtl_file).unwrap(); println!("# of models: {}", models.len()); println!("# of materials: {}", materials.len()); //let model = models.get(2).unwrap(); //let mesh = &model.mesh; let mut index_data : Vec = Vec::new(); let mut vertex_data = Vec::new(); for model in models { let mesh = &model.mesh; let mut next_face = 0; for f in 0..mesh.num_face_indices.len() { let end = next_face + mesh.num_face_indices[f] as usize; let face_indices: Vec<_> = mesh.indices[next_face..end].iter().collect(); for i in face_indices { index_data.push(*i); } //println!(" face[{}] = {:?}", f, face_indices); next_face = end; } // Normals and texture coordinates are also loaded, but not printed in this example //println!("model[{}].vertices: {}", i, mesh.positions.len() / 3); assert!(mesh.positions.len() % 3 == 0); for v in 0..mesh.positions.len() / 3 { vertex_data.push( vertex([ mesh.positions[3 * v], mesh.positions[3 * v + 1], mesh.positions[3 * v + 2] ], [ mesh.normals[3 * v], mesh.normals[3 * v + 1], mesh.normals[3 * v + 2] ], )); } } //println!("{:?}\n\n\n\n\n {:?}", vertex_data, index_data); (vertex_data.to_vec(), index_data.to_vec()) } pub fn create_plane(size: f32) -> (Vec, Vec) { let vertex_data = [ vertex([size, -size, 0.0], [0.0, 0.0, 1.0]), vertex([size, size, 0.0], [0.0, 0.0, 1.0]), vertex([-size, -size, 0.0], [0.0, 0.0, 1.0]), vertex([-size, size, 0.0], [0.0, 0.0, 1.0]), ]; let index_data: &[u32] = &[0, 1, 2, 2, 1, 3]; (vertex_data.to_vec(), index_data.to_vec()) }