diff --git a/src/main.rs b/src/main.rs index 833ec1d..1fc52fa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,7 +50,7 @@ fn main () { let m = gltf_node_get_mat4 (&node); - for prim in mesh.primitives () { + for (i, prim) in mesh.primitives ().enumerate () { assert_eq! (prim.mode (), gltf::mesh::Mode::Triangles); let indices = prim.indices ().unwrap (); @@ -80,7 +80,7 @@ fn main () { num_triangles: u32::try_from (indices_slice.len () / 6).unwrap (), //num_triangles: u32::try_from (1).unwrap (), }; - texts.push_str ("\0"); + texts.push_str (&format! ("{}/{}\0", node.name ().unwrap (), i)); meshes.push (mesh); @@ -178,6 +178,17 @@ fn main () { }, ]; + let joints = [ + iqm::Joint { + name: u32::try_from (texts.len ()).unwrap (), + parent: -1, + translate: [0.0, 0.0, 0.0], + rotate: [1.0, 0.0, 0.0, 0.0], + scale: [1.0, 1.0, 1.0], + } + ]; + texts.push_str ("bogus_joint\0"); + let vertexes = vertexes; let triangles = triangles; let meshes = meshes; @@ -186,20 +197,25 @@ fn main () { let num_vertexes = u32::try_from (vertexes.len ()).unwrap (); let num_triangles = u32::try_from (triangles.len ()).unwrap (); + let num_joints = u32::try_from (joints.len ()).unwrap (); + let num_text = texts.len (); let num_text = u32::try_from (num_text).unwrap (); let num_meshes = u32::try_from (meshes.len ()).unwrap (); let num_vertexarrays = u32::try_from (vertexarrays_unplaced.len ()).unwrap (); + let mut offset = 0; + let header_len = 124u32; - let ofs_meshes = header_len; - let ofs_vertexarrays = ofs_meshes + num_meshes * 6 * 4; - // Not part of IQM spec, but I need it for self-care - let ofs_vertexes = ofs_vertexarrays + num_vertexarrays * 5 * 4; + + offset += header_len; + let ofs_meshes = offset; + offset += num_meshes * 6 * 4; + let ofs_vertexarrays = offset; + offset += num_vertexarrays * 5 * 4; let mut vertexarrays = Vec::default (); - let mut ofs_va = ofs_vertexes; for va_in in vertexarrays_unplaced { let stride = va_in.stride (); @@ -209,18 +225,23 @@ fn main () { flags: va_in.flags, format: va_in.format, size: va_in.size, - offset: ofs_va, + offset, }); - ofs_va += num_vertexes * stride; + offset += num_vertexes * stride; } let vertexarrays = vertexarrays; - let ofs_triangles = ofs_va; - let ofs_text = ofs_triangles + num_triangles * 3 * 4; + let ofs_triangles = offset; + offset += num_triangles * 3 * 4; + let ofs_text = offset; + offset += num_text; + let ofs_joints = offset; + // offset += num_joints * 48; - let filesize = ofs_text + num_text; + let filesize = offset; + let _ = offset; let mut f = File::create (output_path).unwrap (); @@ -386,6 +407,14 @@ mod iqm { vertex: [u32; 3], } + pub struct Joint { + pub name: u32, + pub parent: i32, + pub translate: [f32; 3], + pub rotate: [f32; 4], + pub scale: [f32; 3], + } + pub struct Vertex { pub position: [f32; 3], pub normal: [f32; 3],