Beat my head into a wall some more on twisty_torus
This commit is contained in:
parent
e0baea62cc
commit
270435c4d6
@ -139,17 +139,17 @@ pub fn twist(f: f32, subdiv: usize) -> Rule<()> {
|
|||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct TorusCtxt {
|
pub struct TorusCtxt {
|
||||||
xform1: Transform,
|
init: bool,
|
||||||
xform2: Transform,
|
stack: [Transform; 3],
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn twisty_torus() -> Rule<TorusCtxt> {
|
pub fn twisty_torus() -> Rule<TorusCtxt> {
|
||||||
let subdiv = 8;
|
let subdiv = 8;
|
||||||
let seed = vec![
|
let seed = vec![
|
||||||
vertex(-0.5, -0.5, 1.0),
|
vertex(-0.5, -0.5, 0.0),
|
||||||
vertex(-0.5, 0.5, 1.0),
|
vertex(-0.5, 0.5, 0.0),
|
||||||
vertex( 0.5, 0.5, 1.0),
|
vertex( 0.5, 0.5, 0.0),
|
||||||
vertex( 0.5, -0.5, 1.0),
|
vertex( 0.5, -0.5, 0.0),
|
||||||
];
|
];
|
||||||
let seed = util::subdivide_cycle(&seed, subdiv);
|
let seed = util::subdivide_cycle(&seed, subdiv);
|
||||||
|
|
||||||
@ -161,23 +161,45 @@ pub fn twisty_torus() -> Rule<TorusCtxt> {
|
|||||||
faces: faces,
|
faces: faces,
|
||||||
});
|
});
|
||||||
|
|
||||||
let rad = 4.0;
|
let rad = 1.0;
|
||||||
|
let rad2 = 5.0;
|
||||||
let dx0 = 2.0;
|
let dx0 = 2.0;
|
||||||
let ang = 0.1;
|
let ang = 0.1;
|
||||||
|
|
||||||
let recur = move |self_: Rc<Rule<TorusCtxt>>| -> RuleEval<TorusCtxt> {
|
let recur = move |self_: Rc<Rule<TorusCtxt>>| -> RuleEval<TorusCtxt> {
|
||||||
let y = &Vector3::y_axis();
|
//let y = &Vector3::y_axis();
|
||||||
let z = &Vector3::z_axis();
|
let z = &Vector3::z_axis();
|
||||||
let xf1 = self_.ctxt.xform1;
|
let stack = self_.ctxt.stack;
|
||||||
let xf2 = self_.ctxt.xform2;
|
|
||||||
let next_rule = Rule {
|
let next_rule = Rule {
|
||||||
eval: self_.eval.clone(),
|
eval: self_.eval.clone(),
|
||||||
ctxt: TorusCtxt {
|
ctxt: TorusCtxt {
|
||||||
xform1: xf1.rotate(y, 0.1),
|
init: false,
|
||||||
xform2: xf2.rotate(z, ang),
|
stack: [
|
||||||
|
stack[0],
|
||||||
|
Transform::new().rotate(z, 0.05) * stack[1],
|
||||||
|
Transform::new().translate(0.0, 0.0, 0.1) * stack[2],
|
||||||
|
],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
let xf = xf1 * xf2;
|
let xf = stack.iter().fold(Transform::new(), |acc,m| acc * (*m));
|
||||||
|
if self_.ctxt.init {
|
||||||
|
let mut s2 = seed.clone();
|
||||||
|
let (centroid, f) = util::connect_convex(&s2, false);
|
||||||
|
s2.push(centroid);
|
||||||
|
let n2 = s2.len();
|
||||||
|
let g = OpenMesh { verts: s2, faces: f };
|
||||||
|
RuleEval {
|
||||||
|
geom: Rc::new(g.transform(&xf)),
|
||||||
|
final_geom: Rc::new(prim::empty_mesh()),
|
||||||
|
children: vec![
|
||||||
|
Child {
|
||||||
|
rule: Rc::new(next_rule),
|
||||||
|
xf: Transform::new(),
|
||||||
|
vmap: (0..n2).collect(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
} else {
|
||||||
RuleEval {
|
RuleEval {
|
||||||
geom: Rc::new(geom.transform(&xf)),
|
geom: Rc::new(geom.transform(&xf)),
|
||||||
final_geom: Rc::new(final_geom.transform(&xf)),
|
final_geom: Rc::new(final_geom.transform(&xf)),
|
||||||
@ -189,40 +211,18 @@ pub fn twisty_torus() -> Rule<TorusCtxt> {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
let start = move |self_: Rc<Rule<TorusCtxt>>| -> RuleEval<TorusCtxt> {
|
|
||||||
let xf1 = self_.ctxt.xform1;
|
|
||||||
let xf2 = self_.ctxt.xform2;
|
|
||||||
let xf = xf1 * xf2;
|
|
||||||
|
|
||||||
let mut s2 = seed.clone();
|
|
||||||
let (centroid, f) = util::connect_convex(&s2, false);
|
|
||||||
s2.push(centroid);
|
|
||||||
let n2 = s2.len();
|
|
||||||
let g = OpenMesh { verts: s2, faces: f };
|
|
||||||
let fg = prim::empty_mesh();
|
|
||||||
RuleEval {
|
|
||||||
geom: Rc::new(g.transform(&xf)),
|
|
||||||
final_geom: Rc::new(fg),
|
|
||||||
children: vec![
|
|
||||||
Child {
|
|
||||||
rule: Rc::new(Rule {
|
|
||||||
eval: Rc::new(recur.clone()),
|
|
||||||
ctxt: self_.ctxt,
|
|
||||||
}),
|
|
||||||
xf: Transform::new(),
|
|
||||||
vmap: (0..n2).collect(),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Rule {
|
Rule {
|
||||||
eval: Rc::new(start),
|
eval: Rc::new(recur),
|
||||||
ctxt: TorusCtxt {
|
ctxt: TorusCtxt {
|
||||||
xform1: Transform::new().translate(rad, 0.0, 0.0),
|
init: true,
|
||||||
xform2: Transform::new().translate(dx0, 0.0, 0.0),
|
stack: [
|
||||||
|
Transform::new().translate(0.0, rad2, 0.0),
|
||||||
|
Transform::new().translate(rad, 0.0, 0.0),
|
||||||
|
Transform::new(), // .translate(dx0, 0.0, 0.0),
|
||||||
|
],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user