Mesh connection bug fixed! Just need to say why...

This commit is contained in:
Chris Hodapp 2020-03-05 21:44:32 -05:00
parent 313aa6203f
commit 2fe37fc569
2 changed files with 20 additions and 8 deletions

View File

@ -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<usize>)>) -> OpenMesh {
pub fn connect(&self, children: &Vec<(OpenMesh, &Vec<usize>)>) -> (OpenMesh, Vec<usize>) {
// TODO: Clean up this description a bit
// TODO: Clean up Vec<usize> stuff
@ -107,6 +107,8 @@ impl OpenMesh {
let mut verts: Vec<Vertex> = self.verts.clone();
let mut faces = self.faces.clone();
let mut offsets: Vec<usize> = 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)
}
}

View File

@ -114,7 +114,7 @@ impl<A> Rule<A> {
}).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<A> Rule<A> {
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 {