Added some really badly-written mapping... fix it later

This commit is contained in:
Chris Hodapp 2020-02-21 22:34:07 -05:00
parent 751f772897
commit 436cb0bbc4
3 changed files with 21 additions and 20 deletions

View File

@ -22,8 +22,8 @@ fn curve_horn_start() -> RuleStep {
},
final_geom: prim::empty_mesh(),
children: vec![
(Rule::Recurse(curve_horn_thing_rule), id),
(Rule::Recurse(curve_horn_thing_rule), flip180),
(Rule::Recurse(curve_horn_thing_rule), id, vec![0,1,2,3]),
(Rule::Recurse(curve_horn_thing_rule), flip180, vec![3,2,1,0]),
],
}
// TODO: Fix the consequences of the 180 flip
@ -77,7 +77,7 @@ fn curve_horn_thing_rule() -> RuleStep {
geom: geom,
final_geom: final_geom,
children: vec![
(Rule::Recurse(curve_horn_thing_rule), m),
(Rule::Recurse(curve_horn_thing_rule), m, vec![0,1,2,3]),
],
}
}
@ -102,11 +102,11 @@ fn cube_thing_rule() -> RuleStep {
geometry::Rotation3::from_axis_angle(z, -qtr).to_homogeneous(),
];
let gen_rulestep = |rot: &Mat4| -> (Rule, Mat4) {
let gen_rulestep = |rot: &Mat4| -> (Rule, Mat4, Vec<usize>) {
let m: Mat4 = rot *
Matrix4::new_scaling(0.5) *
geometry::Translation3::new(6.0, 0.0, 0.0).to_homogeneous();
(Rule::Recurse(cube_thing_rule), m)
(Rule::Recurse(cube_thing_rule), m, vec![])
};
RuleStep {
@ -171,10 +171,10 @@ fn ram_horn_start() -> RuleStep {
},
final_geom: prim::empty_mesh(),
children: vec![
(Rule::Recurse(ram_horn), opening_xform(0.0)),
(Rule::Recurse(ram_horn), opening_xform(std::f32::consts::FRAC_PI_2)),
(Rule::Recurse(ram_horn), opening_xform(std::f32::consts::FRAC_PI_2*2.0)),
(Rule::Recurse(ram_horn), opening_xform(std::f32::consts::FRAC_PI_2*3.0)),
(Rule::Recurse(ram_horn), opening_xform(0.0), vec![0,4,8,7]),
(Rule::Recurse(ram_horn), opening_xform(std::f32::consts::FRAC_PI_2), vec![1,5,8,4]),
(Rule::Recurse(ram_horn), opening_xform(std::f32::consts::FRAC_PI_2*2.0), vec![2,6,8,5]),
(Rule::Recurse(ram_horn), opening_xform(std::f32::consts::FRAC_PI_2*3.0), vec![3,7,8,6]),
],
}
}
@ -221,7 +221,7 @@ fn ram_horn() -> RuleStep {
geom: geom,
final_geom: final_geom,
children: vec![
(Rule::Recurse(ram_horn), incr),
(Rule::Recurse(ram_horn), incr, vec![0,1,2,3]),
],
}
}

View File

@ -84,13 +84,13 @@ impl OpenMesh {
stl_io::write_stl(writer, triangles.iter())
}
pub fn connect(&self, others: &Vec<OpenMesh>) -> OpenMesh {
pub fn connect(&self, others: &Vec<(OpenMesh, Vec<usize>)>) -> OpenMesh {
// Copy body vertices & faces:
let mut verts: Vec<Vertex> = self.verts.clone();
let mut faces = self.faces.clone();
for other in others {
for (other,mapping) in others {
// body_offset corresponds to the position in 'verts' at
// which we're appending everything in 'other.verts' -
@ -107,7 +107,7 @@ impl OpenMesh {
Tag::Body(n) => Tag::Body(n + body_offset),
// Since 'self' vertices are in the same order,
// parent vertex references retain same index:
Tag::Parent(n) => Tag::Body(*n),
Tag::Parent(n) => Tag::Body(mapping[*n]),
}
}));
}

View File

@ -24,8 +24,8 @@ pub struct RuleStep {
pub final_geom: OpenMesh,
// Child rules, paired with the transform that will be applied to
// all of their geometry
pub children: Vec<(Rule, Mat4)>,
// all of their geometry and parent vertex mappings
pub children: Vec<(Rule, Mat4, Vec<usize>)>,
}
impl Rule {
@ -59,15 +59,16 @@ impl Rule {
let rs: RuleStep = f();
// Get sub-geometry (from child rules) and transform it:
let subgeom: Vec<(OpenMesh, Mat4, u32)> = rs.children.iter().map(|(subrule, subxform)| {
let subgeom: Vec<(OpenMesh, Mat4, u32, Vec<usize>)> = rs.children.iter().map(|(subrule, subxform, mapping)| {
let (m,n) = subrule.to_mesh(iters_left - 1);
(m, *subxform, n)
(m, *subxform, n, mapping.clone())
}).collect();
// Tally up node count:
subgeom.iter().for_each(|(_,_,n)| nodes += n);
subgeom.iter().for_each(|(_,_,n,_)| nodes += n);
let g: Vec<OpenMesh> = subgeom.iter().map(|(m,x,_)| m.transform(*x)).collect();
let g: Vec<(OpenMesh, Vec<usize>)> = subgeom.iter().map(|(m,x,_,mv)| (m.transform(*x), mv.clone())).collect();
// TODO: Not clone twice
// Connect geometry from this rule (not child rules):
return (rs.geom.connect(&g), nodes);