Made test_rule more complex (and broken)

This commit is contained in:
Chris Hodapp 2019-12-27 12:24:29 -05:00
parent 1b125b2f53
commit 726b7f5307

View File

@ -21,25 +21,41 @@ struct RuleStep {
fn test_rule(_v: Vec<Mesh>) -> Vec<RuleStep> { fn test_rule(_v: Vec<Mesh>) -> Vec<RuleStep> {
let r = Rule::Recurse(test_rule);
let mesh = MeshBuilder::new().cube().build().unwrap(); let mesh = MeshBuilder::new().cube().build().unwrap();
//let mtx = Matrix4::identity();
let m: Mat4 = // Quarter-turn in radians:
Matrix4::from_translation(vec3(1.0, 0.0, 0.0)) * let qtr = Rad::turn_div_4();
Matrix4::from_angle_z(Rad(0.1)) *
Matrix4::from_scale(0.9);
let ret: Vec<RuleStep> = vec![ // Each element of this turns to a branch for the recursion:
RuleStep { geom: mesh, rule: Box::new(r), xform: m }, let turns: Vec<Mat4> = vec![
Matrix4::identity(),
Matrix4::from_angle_y(qtr),
Matrix4::from_angle_y(qtr * 2.0),
Matrix4::from_angle_y(qtr * 3.0),
]; ];
ret let gen_rulestep = |rot: &Mat4| -> RuleStep {
let m: Mat4 = rot *
Matrix4::from_translation(vec3(1.5, 0.0, 0.0)) *
Matrix4::from_scale(0.6);
let r = Rule::Recurse(test_rule);
RuleStep { geom: mesh.clone(), rule: Box::new(r), xform: m }
};
turns.iter().map(gen_rulestep).collect()
} }
// TODO: Do I want to make 'geom' shared somehow, maybe with Rc? I
// could end up having a lot of identical geometry that need not be
// duplicated until it is transformed into the global space
// Bigger TODO: either rule_to_mesh or test_rule is doing something
// totally wrong here (look at the generated mesh). I suspect it is
// appending geometry multiple times because my semantics are vague.
fn rule_to_mesh(rule: &Rule, xform: Mat4, iter_num: u32) -> Mesh { fn rule_to_mesh(rule: &Rule, xform: Mat4, iter_num: u32) -> Mesh {
let max_iters: u32 = 50; let max_iters: u32 = 4;
let mut mesh = MeshBuilder::new().with_indices(vec![]).with_positions(vec![]).build().unwrap(); let mut mesh = MeshBuilder::new().with_indices(vec![]).with_positions(vec![]).build().unwrap();
if iter_num >= max_iters { if iter_num >= max_iters {