1pub mod tetra;
5pub mod cube; pub mod octa;
7pub mod sphere; pub mod cylinder; pub mod capsule; pub mod cone; pub mod torus;
12pub mod pipe;
13pub mod pin;
14pub mod revolution;
15
16use crate::{calc_cg_with_volume, translate};
17
18use num::Float;
19
20#[derive(Debug, Clone)]
22pub struct FTVI<F: Float> {
23 pub fi: usize,
25 pub ti: usize,
27 pub vi: usize,
29 pub p: [F; 3],
31 pub uv: [F; 2],
33 pub idx: usize
35}
36
37impl<F: Float> FTVI<F> {
39 pub fn puv(&self) -> (&[F; 3], &[F; 2]) {
41 (&self.p, &self.uv)
42 }
43}
44
45pub type PHF<F> = Vec<Vec<Vec<FTVI<F>>>>;
47
48pub trait TUV<F: Float> {
50 fn get_uv_f(&self, n: usize, i: usize, k: usize, c: bool,
52 r: f64, s: f64, o: [f64; 2]) -> [F; 2] { if c && k == 0 { [<F>::from(o[0] + 0.5).unwrap(), <F>::from(o[1] + 0.5).unwrap()]
55 } else {
56 let (m, j) = match c {
57 true => (n, (i + k - 1) % n), false => (n + 2, if k == 0 { 0 } else { i + k }) };
60 let t = 2.0 * std::f64::consts::PI * j as f64 / m as f64 + r;
61 let uv = [(1.0 + s * t.cos()) / 2.0, 1.0 - (1.0 + s * t.sin()) / 2.0];
62 [<F>::from(o[0] + uv[0]).unwrap(), <F>::from(o[1] + uv[1]).unwrap()]
63 }
64 }
65 fn get_uv_t(&self, fi: usize, ti: usize, vi: usize,
67 r: f64, s: f64, o: [f64; 2]) -> [F; 2]; fn ref_vtx(&self) -> &Vec<[F; 3]>;
70 fn ref_tri(&self) -> &Vec<Vec<[u16; 3]>>;
72 fn ref_uv(&self) -> &Vec<Vec<[[F; 2]; 3]>>;
74 fn ref_vtx_mut(&mut self) -> &mut Vec<[F; 3]>;
76 fn ref_tri_mut(&mut self) -> &mut Vec<Vec<[u16; 3]>>;
78 fn ref_uv_mut(&mut self) -> &mut Vec<Vec<[[F; 2]; 3]>>;
80 fn centered(&self) -> bool;
82 fn with_uv(&self, tf: bool) -> PHF<F> { self.phf(tf, self.centered()) }
84 fn phf(&self, tf: bool, c: bool) -> PHF<F> {
86 if tf && self.ref_uv().len() == 0 { println!("-- TODO: gen_uv with true expected uv but it is enpty --");
88 }
89 self.ref_tri().iter().enumerate().map(|(fi, f)|
90 f.iter().enumerate().map(|(ti, t)|
91 t.iter().enumerate().map(|(vi, &i)| {
92 self.gen_uv(i as usize, tf, fi, f.len(), ti, vi, c)
93 }).collect()
94 ).collect()
95 ).collect()
96 }
97 fn gen_uv(&self, i: usize, tf: bool,
99 fi: usize, n: usize, ti: usize, vi: usize, c: bool) -> FTVI<F> {
100 let r = std::f64::consts::PI / 2.0; let s = 1.0f64; let o = [0.0f64, 0.0f64]; let p = self.ref_vtx()[i];
104 let uv = match tf {
105 true => self.get_uv_t(fi, ti, vi, 0.0f64, s, o), false => self.get_uv_f(n, ti, vi, c, r, s, o) };
108 FTVI::<F>{fi, ti, vi, p, uv, idx: i}
109 }
110 fn calc_cg_with_volume(&self, p: F) -> (Vec<F>, F)
112 where F: std::fmt::Debug + std::iter::Sum {
113 calc_cg_with_volume(self.ref_tri(), self.ref_vtx(), p)
114 }
115 fn calc_cg(&self, p: F) -> Vec<F>
117 where F: std::fmt::Debug + std::iter::Sum {
118let (cg, _vol) = self.calc_cg_with_volume(p);
120 cg
121 }
122 fn adjust_cg_with_volume(&mut self, p: F) -> (Vec<F>, F)
124 where F: std::fmt::Debug + std::iter::Sum {
125let (cg, vol) = calc_cg_with_volume(self.ref_tri(), self.ref_vtx(), p);
128 translate(self.ref_vtx_mut(), &[-cg[0], -cg[1], -cg[2]]);
129 (cg, vol)
130 }
131 fn adjust_cg(&mut self, p: F) -> Vec<F>
133 where F: std::fmt::Debug + std::iter::Sum {
134let (cg, _vol) = self.adjust_cg_with_volume(p);
137 cg
138 }
139 fn translate(&mut self, o: &[F]) where F: std::fmt::Debug {
141 translate(self.ref_vtx_mut(), o)
142 }
143}
144
145#[derive(Debug)]
147pub struct Polyhedron<F: Float> {
148 pub vtx: Vec<[F; 3]>,
150 pub tri: Vec<Vec<[u16; 3]>>,
152 pub uv: Vec<Vec<[[F; 2]; 3]>>,
154 pub vol: F,
156 pub center: bool
158}
159
160impl<F: Float> TUV<F> for Polyhedron<F> {
162 fn get_uv_t(&self, fi: usize, ti: usize, vi: usize,
164 _r: f64, _s: f64, o: [f64; 2]) -> [F; 2] { if self.uv.len() == 0 {
166 return [<F>::from(o[0]).unwrap(), <F>::from(o[1]).unwrap()];
167 }
168 let uv = self.uv[fi][ti][vi];
169 [<F>::from(o[0]).unwrap() + uv[0], <F>::from(o[1]).unwrap() + uv[1]]
170 }
171 fn ref_vtx(&self) -> &Vec<[F; 3]> { &self.vtx }
173 fn ref_tri(&self) -> &Vec<Vec<[u16; 3]>> { &self.tri }
175 fn ref_uv(&self) -> &Vec<Vec<[[F; 2]; 3]>> { &self.uv }
177 fn ref_vtx_mut(&mut self) -> &mut Vec<[F; 3]> { &mut self.vtx }
179 fn ref_tri_mut(&mut self) -> &mut Vec<Vec<[u16; 3]>> { &mut self.tri }
181 fn ref_uv_mut(&mut self) -> &mut Vec<Vec<[[F; 2]; 3]>> { &mut self.uv }
183 fn centered(&self) -> bool { self.center }
185}