1use geom3d::{
2 surface::{BezierSurface, SurfacePatch},
3 Float, Grid, Model, Point3,
4};
5
6fn load_teapot(
7 division: (usize, usize),
8) -> std::io::Result<Model<SurfacePatch<BezierSurface<Point3>>>> {
9 use std::fs::File;
10 use std::io::{BufRead, BufReader};
11 use std::path::Path;
12 use std::str::FromStr;
13
14 let file = Path::new(&std::env::var("CARGO_MANIFEST_DIR").unwrap()).join("assets/teapot.bpt");
15 let reader = BufReader::new(File::open(file)?);
16
17 let mut model = Model::new();
18 let mut points = Vec::new();
19 let mut current_cols = 0;
20
21 for line in reader.lines() {
22 let numbers = line?;
23 let items = numbers.split_whitespace().collect::<Vec<_>>();
24 if items.len() == 1 {
25 model
26 .faces
27 .reserve_exact(usize::from_str(items[0]).unwrap());
28 } else if items.len() == 2 {
29 if points.len() > 0 {
30 let surface = SurfacePatch {
31 surface: BezierSurface::new(Grid::from_vec(points, current_cols)),
32 parameter_range: ((0.0, 1.0), (0.0, 1.0)),
33 parameter_division: division,
34 };
35 model.add_face(surface);
36 }
37 let m = usize::from_str(items[0]).unwrap();
38 let n = usize::from_str(items[1]).unwrap();
39 points = Vec::with_capacity((m + 1) * (n + 1));
40 current_cols = n + 1;
41 } else if items.len() == 3 {
42 let point = Point3::new(
43 Float::from_str(items[0]).unwrap(),
44 Float::from_str(items[1]).unwrap(),
45 Float::from_str(items[2]).unwrap(),
46 );
47 points.push(point);
48 }
49 }
50 let surface = SurfacePatch {
52 surface: BezierSurface::new(Grid::from_vec(points, current_cols)),
53 parameter_range: ((0.0, 1.0), (0.0, 1.0)),
54 parameter_division: division,
55 };
56 model.add_face(surface);
57 Ok(model)
58}
59
60fn main() {
61 let teapot = load_teapot((16, 16)).unwrap();
62 teapot.save_as_stl("teapot.stl").unwrap();
63 teapot.save_as_obj("teapot.obj").unwrap();
64}