Semi-working Rust example (very very rudimentary)
This commit is contained in:
commit
1b125b2f53
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/target
|
||||||
|
**/*.rs.bk
|
||||||
|
*~
|
||||||
|
#*#
|
||||||
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "mesh_scratch"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Chris Hodapp <hodapp87@gmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
tri-mesh = "0.4.0"
|
||||||
|
euclid = "0.20.7"
|
||||||
162
src/main.rs
Normal file
162
src/main.rs
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
//use std::io;
|
||||||
|
use tri_mesh::prelude::*;
|
||||||
|
|
||||||
|
enum Rule {
|
||||||
|
// Recurse further:
|
||||||
|
Recurse(fn (Vec<Mesh>) -> Vec<RuleStep>),
|
||||||
|
// Stop recursing here:
|
||||||
|
EmptyRule,
|
||||||
|
}
|
||||||
|
// TODO: Rename rules?
|
||||||
|
|
||||||
|
struct RuleStep {
|
||||||
|
// The geometry generated at this step
|
||||||
|
geom: Mesh,
|
||||||
|
// The next rule to run on this geometry
|
||||||
|
rule: Box<Rule>,
|
||||||
|
// The transformation to apply to any results of 'rule' (if
|
||||||
|
// applicable)
|
||||||
|
xform: Mat4,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_rule(_v: Vec<Mesh>) -> Vec<RuleStep> {
|
||||||
|
|
||||||
|
let r = Rule::Recurse(test_rule);
|
||||||
|
|
||||||
|
let mesh = MeshBuilder::new().cube().build().unwrap();
|
||||||
|
//let mtx = Matrix4::identity();
|
||||||
|
let m: Mat4 =
|
||||||
|
Matrix4::from_translation(vec3(1.0, 0.0, 0.0)) *
|
||||||
|
Matrix4::from_angle_z(Rad(0.1)) *
|
||||||
|
Matrix4::from_scale(0.9);
|
||||||
|
|
||||||
|
let ret: Vec<RuleStep> = vec![
|
||||||
|
RuleStep { geom: mesh, rule: Box::new(r), xform: m },
|
||||||
|
];
|
||||||
|
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rule_to_mesh(rule: &Rule, xform: Mat4, iter_num: u32) -> Mesh {
|
||||||
|
|
||||||
|
let max_iters: u32 = 50;
|
||||||
|
let mut mesh = MeshBuilder::new().with_indices(vec![]).with_positions(vec![]).build().unwrap();
|
||||||
|
|
||||||
|
if iter_num >= max_iters {
|
||||||
|
return mesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
match rule {
|
||||||
|
Rule::Recurse(func) => {
|
||||||
|
for step in func(vec![]) {
|
||||||
|
let subrule: Rule = *step.rule;
|
||||||
|
let subxform: Mat4 = step.xform;
|
||||||
|
let geom: Mesh = step.geom;
|
||||||
|
|
||||||
|
mesh.append(&geom);
|
||||||
|
|
||||||
|
let mut submesh: Mesh = rule_to_mesh(&subrule, subxform, iter_num + 1);
|
||||||
|
submesh.apply_transformation(xform);
|
||||||
|
|
||||||
|
mesh.append(&submesh);
|
||||||
|
}
|
||||||
|
mesh
|
||||||
|
}
|
||||||
|
Rule::EmptyRule => {
|
||||||
|
mesh
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This isn't kosher:
|
||||||
|
//type Rule = fn (Vec<Mesh>) -> (Mesh, Vec<(Mesh, Box<Rule>)>);
|
||||||
|
|
||||||
|
fn mesh_builder_example() -> Result<Mesh, tri_mesh::mesh_builder::Error> {
|
||||||
|
let indices: Vec<u32> = vec![0, 1, 2,
|
||||||
|
0, 2, 3,
|
||||||
|
0, 3, 1];
|
||||||
|
let positions: Vec<f64> = vec![0.0, 0.0, 0.0,
|
||||||
|
1.0, 0.0, -0.5,
|
||||||
|
-1.0, 0.0, -0.5,
|
||||||
|
0.0, 0.0, 1.0];
|
||||||
|
let mesh = MeshBuilder::new().
|
||||||
|
with_indices(indices).
|
||||||
|
with_positions(positions).
|
||||||
|
build()?;
|
||||||
|
|
||||||
|
assert_eq!(mesh.no_faces(), 3);
|
||||||
|
assert_eq!(mesh.no_vertices(), 4);
|
||||||
|
|
||||||
|
Ok(mesh)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_vector(v: &Vec4) -> String {
|
||||||
|
return format!("{},{},{},{}", v.x, v.y, v.z, v.w);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_matrix(m: &Mat4) {
|
||||||
|
let mt = m.transpose();
|
||||||
|
println!("[{}]\n[{}]\n[{}]\n[{}]",
|
||||||
|
print_vector(&mt.x), print_vector(&mt.y),
|
||||||
|
print_vector(&mt.z), print_vector(&mt.w));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// Construct any mesh, this time, we will construct a simple icosahedron
|
||||||
|
let mesh = MeshBuilder::new().icosahedron().build().unwrap();
|
||||||
|
|
||||||
|
// Is there a better way to do this?
|
||||||
|
let _empty_mesh = MeshBuilder::new().with_indices(vec![]).with_positions(vec![]).build().unwrap();
|
||||||
|
|
||||||
|
// Compute the extreme coordinates which defines the axis aligned bounding box..
|
||||||
|
let (_min_coordinates, _max_coordinates) = mesh.extreme_coordinates();
|
||||||
|
|
||||||
|
// .. or construct an actual mesh representing the axis aligned bounding box
|
||||||
|
let _aabb = mesh.axis_aligned_bounding_box();
|
||||||
|
|
||||||
|
// Export the bounding box to an obj file
|
||||||
|
std::fs::write("foo.obj", mesh.parse_as_obj()).unwrap();
|
||||||
|
|
||||||
|
// Try some vector stuff:
|
||||||
|
|
||||||
|
let m: Mat4 = Matrix4::from_translation(vec3(5.0, 0.0, 0.0));
|
||||||
|
println!("translation: ");
|
||||||
|
print_matrix(&m);
|
||||||
|
/*print_vector(&m.x);
|
||||||
|
print_vector(&m.y);
|
||||||
|
print_vector(&m.z);
|
||||||
|
print_vector(&m.w);*/
|
||||||
|
|
||||||
|
let m2: Mat4 = Matrix4::from_scale(2.0);
|
||||||
|
println!("scale: ");
|
||||||
|
print_matrix(&m2);
|
||||||
|
let m3 = m * m2;
|
||||||
|
println!("translation * scale: ");
|
||||||
|
print_matrix(&m3);
|
||||||
|
let m4 = m2 * m;
|
||||||
|
println!("scale * translation: ");
|
||||||
|
print_matrix(&m4);
|
||||||
|
|
||||||
|
let mut mesh2 = mesh_builder_example().unwrap();
|
||||||
|
std::fs::write("foo2.obj", mesh2.parse_as_obj()).unwrap();
|
||||||
|
|
||||||
|
mesh2.apply_transformation(m);
|
||||||
|
|
||||||
|
mesh2.append(&mesh);
|
||||||
|
|
||||||
|
std::fs::write("foo3.obj", mesh2.parse_as_obj()).unwrap();
|
||||||
|
|
||||||
|
let r = Rule::Recurse(test_rule);
|
||||||
|
|
||||||
|
match r {
|
||||||
|
Rule::Recurse(f) => {
|
||||||
|
let _v = f(vec![]);
|
||||||
|
}
|
||||||
|
Rule::EmptyRule => {
|
||||||
|
println!("Empty");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let cubemesh: Mesh = rule_to_mesh(&r, Matrix4::identity(), 0);
|
||||||
|
std::fs::write("cubemesh.obj", cubemesh.parse_as_obj()).unwrap();
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user