use std::{ fs::File, io::Write, }; fn main () { let vertexes = [ [-1.0, -1.0, -1.0], [ 1.0, -1.0, -1.0], [ 1.0, 1.0, -1.0], [-1.0, 1.0, -1.0], [-1.0, -1.0, 1.0], [ 1.0, -1.0, 1.0], [ 1.0, 1.0, 1.0], [-1.0, 1.0, 1.0], ]; let triangles = [ [0, 2, 1], [0, 3, 2], [0, 5, 1], [1, 6, 2], [2, 7, 3], [3, 4, 0], [0, 4, 5], [1, 5, 6], [2, 6, 7], [3, 7, 4], [4, 6, 5], [4, 7, 6], ]; let num_vertexes = u32::try_from (vertexes.len ()).unwrap (); let num_triangles = u32::try_from (triangles.len ()).unwrap (); let mut texts = Vec::default (); let mesh = iqm::Mesh { name: u32::try_from (texts.len ()).unwrap (), material: 0, first_vertex: 0, num_vertexes, first_triangle: 0, num_triangles, }; texts.push ("Cube"); let meshes = vec! [ mesh, ]; let num_text: usize = texts.iter () .map (|s| s.len () + 1) .sum (); let num_text = u32::try_from (num_text).unwrap (); let num_meshes = u32::try_from (meshes.len ()).unwrap (); let num_vertexarrays = 1u32; let header_len = 124u32; let ofs_meshes = header_len; let ofs_vertexarrays = ofs_meshes + num_meshes * 6 * 4; let ofs_triangles = ofs_vertexarrays + num_vertexarrays * 5 * 4 + num_vertexes * 3 * 4; let ofs_text = ofs_triangles + num_triangles * 3 * 4; let filesize = ofs_text + num_text; let mut f = File::create ("cube.iqm").unwrap (); f.write_all (b"INTERQUAKEMODEL\0").unwrap (); f.write_all (&(2u32.to_le_bytes ())).unwrap (); // filesize f.write_all (&(filesize.to_le_bytes ())).unwrap (); // flags f.write_all (&(0u32.to_le_bytes ())).unwrap (); // num_text, ofs_text f.write_all (&(num_text.to_le_bytes ())).unwrap (); f.write_all (&(ofs_text.to_le_bytes ())).unwrap (); // num_meshes, ofs_meshes f.write_all (&(num_meshes.to_le_bytes ())).unwrap (); f.write_all (&(ofs_meshes.to_le_bytes ())).unwrap (); // num_vertexarrays, num_vertexes, ofs_vertexarrays f.write_all (&(num_vertexarrays.to_le_bytes ())).unwrap (); f.write_all (&(num_vertexes.to_le_bytes ())).unwrap (); f.write_all (&(ofs_vertexarrays.to_le_bytes ())).unwrap (); // num_triangles, ofs_triangles, ofs_adjacency f.write_all (&(num_triangles.to_le_bytes ())).unwrap (); f.write_all (&(ofs_triangles.to_le_bytes ())).unwrap (); f.write_all (&(0u32.to_le_bytes ())).unwrap (); // num_joints, ofs_joints f.write_all (&(0u32.to_le_bytes ())).unwrap (); f.write_all (&(0u32.to_le_bytes ())).unwrap (); // num_poses, ofs_poses f.write_all (&(0u32.to_le_bytes ())).unwrap (); f.write_all (&(0u32.to_le_bytes ())).unwrap (); // num_anims, ofs_anims f.write_all (&(0u32.to_le_bytes ())).unwrap (); f.write_all (&(0u32.to_le_bytes ())).unwrap (); // num_frames, num_framechannels, ofs_frames, ofs_bounds f.write_all (&(0u32.to_le_bytes ())).unwrap (); f.write_all (&(0u32.to_le_bytes ())).unwrap (); f.write_all (&(0u32.to_le_bytes ())).unwrap (); f.write_all (&(0u32.to_le_bytes ())).unwrap (); // num_comment, ofs_comment f.write_all (&(0u32.to_le_bytes ())).unwrap (); f.write_all (&(0u32.to_le_bytes ())).unwrap (); // num_extensions, ofs_extensions f.write_all (&(0u32.to_le_bytes ())).unwrap (); f.write_all (&(0u32.to_le_bytes ())).unwrap (); // Meshes for mesh in meshes { f.write_all (&(mesh.name.to_le_bytes ())).unwrap (); f.write_all (&(mesh.material.to_le_bytes ())).unwrap (); f.write_all (&(mesh.first_vertex.to_le_bytes ())).unwrap (); f.write_all (&(mesh.num_vertexes.to_le_bytes ())).unwrap (); f.write_all (&(mesh.first_triangle.to_le_bytes ())).unwrap (); f.write_all (&(mesh.num_triangles.to_le_bytes ())).unwrap (); } // Vertex arrays // type f.write_all (&(0u32.to_le_bytes ())).unwrap (); // flags f.write_all (&(0u32.to_le_bytes ())).unwrap (); // format f.write_all (&(7u32.to_le_bytes ())).unwrap (); // size f.write_all (&(3u32.to_le_bytes ())).unwrap (); // offset f.write_all (&(0xA8u32.to_le_bytes ())).unwrap (); // Vertexes for t in vertexes { for x in t { f.write_all (&(f32::to_le_bytes (x))).unwrap (); } } // Triangles for t in triangles { for x in t { f.write_all (&(u32::to_le_bytes (x))).unwrap (); } } // Text for s in texts { f.write_all (s.as_bytes ()).unwrap (); f.write_all (b"\0").unwrap (); } } /// IQM structures as written to disk mod iqm { pub struct Mesh { pub name: u32, pub material: u32, pub first_vertex: u32, pub num_vertexes: u32, pub first_triangle: u32, pub num_triangles: u32, } struct VertexArray { r#type: u32, flags: u32, format: u32, size: u32, offset: u32, } struct Triangle { vertex: [u32; 3], } struct Vertex { position: [f32; 3], } }