diff --git a/src/openmesh.rs b/src/openmesh.rs index 6d5d442..7e412c6 100644 --- a/src/openmesh.rs +++ b/src/openmesh.rs @@ -99,7 +99,7 @@ impl OpenMesh { /// Treat this mesh as a 'parent' mesh to connect with any number /// of 'child' meshes, all of them paired with their respective /// parent vertex mappings. This returns a new mesh. - pub fn connect(&self, children: &Vec<(OpenMesh, &Vec)>) -> OpenMesh { + pub fn connect(&self, children: &Vec<(OpenMesh, &Vec)>) -> (OpenMesh, Vec) { // TODO: Clean up this description a bit // TODO: Clean up Vec stuff @@ -107,6 +107,8 @@ impl OpenMesh { let mut verts: Vec = self.verts.clone(); let mut faces = self.faces.clone(); + let mut offsets: Vec = vec![]; + for (child,mapping) in children { // body_offset corresponds to the position in 'verts' at @@ -127,11 +129,14 @@ impl OpenMesh { Tag::Parent(n) => Tag::Body(mapping[*n]), } })); + + offsets.push(body_offset); } - OpenMesh { + let m = OpenMesh { verts: verts, faces: faces, - } + }; + (m, offsets) } } diff --git a/src/rule.rs b/src/rule.rs index 42693e0..a2fd9b5 100644 --- a/src/rule.rs +++ b/src/rule.rs @@ -114,7 +114,7 @@ impl Rule { }).collect(); // Connect geometry from this rule (not child rules): - return (rs.geom.connect(&subgeom), evals); + return (rs.geom.connect(&subgeom).0, evals); } Rule::EmptyRule => { return (prim::empty_mesh(), evals); @@ -193,15 +193,22 @@ impl Rule { match child.rule { Rule::Recurse(f) => { // Evaluate the rule: - let eval = f(arg); + let mut eval = f(arg); // Compose child transform to new world transform: let xf = s.xf * child.xf; // TODO: Check order on this let new_geom = eval.geom.transform(&xf); - println!("DEBUG: Connecting {} faces, faces={:?}", - new_geom.verts.len(), new_geom.faces); - geom = geom.connect(&vec![(new_geom, &child.vmap)]); + println!("DEBUG: Connecting {} faces, vmap={:?}, faces={:?}", + new_geom.verts.len(), child.vmap, new_geom.faces); + let (g, offsets) = geom.connect(&vec![(new_geom, &child.vmap)]); + geom = g; + + // Adjust vmap in all of eval.children: + for (i,offset) in offsets.iter().enumerate() { + eval.children[i].vmap = eval.children[i].vmap.iter().map(|n| n + offset).collect(); + } + // TODO: Explain this better // Recurse further (i.e. put more onto stack): let s2 = State {