use crate::{dx::*, ext::*};
use fullerene::c60::{C60, C60Center};
use fullerene::dodecahedron::{Dodecahedron, DodecahedronCenter};
use fullerene::icosahedron::Icosahedron;
use fullerene::{PHF, TUV, f_to_f32}; use ph_faces::FTVI; use num::Float;
pub mod dum;
pub mod typ;
pub fn gen_vert() -> Vec<VERTEX3DSHADER> {
let mut vert: Vec<VERTEX3DSHADER> = [ ([-128.0, -256.0, 128.0], [255, 255, 255, 255], [0.0, 0.0]),
([128.0, -384.0, 128.0], [128, 128, 128, 255], [1.0, 0.0]),
([-128.0, -384.0, -128.0], [255, 128, 255, 255], [0.0, 1.0]),
([128.0, -256.0, -128.0], [255, 255, 255, 255], [1.0, 1.0])
].iter().map(|t| {
let pos = VECTOR::get(&t.0); let spos = FLOAT4::zeros();
let norm = VECTOR::get(&t.0); let tan = VECTOR::zeros();
let binorm = VECTOR::zeros();
let dif = COLOR_U8::get(&t.1); let spc = COLOR_U8::zeros(); let uv = FLOAT2::get(&t.2); let suv = FLOAT2::zeros();
VERTEX3DSHADER{pos, spos, norm, tan, binorm, dif, spc, uv, suv}
}).collect();
vert.push(vert[2].clone()); vert.push(vert[1].clone()); calc_norm(&mut vert, false);
vert
}
pub fn gen_vert_gl() -> Vec<VT> {
let vert_gl: Vec<VT> = [ ([-1.0, -1.5, 0.0, 1.0], [0.0, 1.0]),
([-1.0, -2.0, 1.0, 1.0], [1.0, 1.0]),
([1.0, -2.0, 0.0, 1.0], [1.0, 0.0]),
([1.0, -1.5, -0.5, 1.0], [0.0, 0.0])
].iter().map(|t| VT::get(&t.0, &t.1)).collect();
vert_gl
}
pub fn gen_poly_gl(n: usize) -> Vec<VT> {
let poly_gl: Vec<VT> = (0..n).into_iter().map(|i| {
let t = 2.0 * std::f32::consts::PI * i as f32 / n as f32;
let p = [t.cos(), t.sin() - 1.0, t.sin(), 1.0];
let uv = [(1.0 + t.cos()) / 2.0, 1.0 - (1.0 + t.sin()) / 2.0];
VT::get(&p, &uv)
}).collect();
poly_gl
}
pub fn gen_vec_vts_gl() -> Vec<Vec<VT>> {
let vts_gl = [ ([1.0, -1.0, 1.0, 1.0], [0.0, 1.0]),
([1.0, -1.0, -1.0, 1.0], [1.0, 1.0]),
([1.0, 1.0, -1.0, 1.0], [1.0, 0.0]),
([1.0, 1.0, 1.0, 1.0], [0.0, 0.0]),
([-1.0, -1.0, 1.0, 1.0], [0.0, 1.0]),
([-1.0, 1.0, 1.0, 1.0], [1.0, 1.0]),
([-1.0, 1.0, -1.0, 1.0], [1.0, 0.0]),
([-1.0, -1.0, -1.0, 1.0], [0.0, 0.0]),
([1.0, 1.0, -1.0, 1.0], [0.0, 1.0]),
([-1.0, 1.0, -1.0, 1.0], [1.0, 1.0]),
([-1.0, 1.0, 1.0, 1.0], [1.0, 0.0]),
([1.0, 1.0, 1.0, 1.0], [0.0, 0.0]),
([1.0, -1.0, -1.0, 1.0], [0.0, 1.0]),
([1.0, -1.0, 1.0, 1.0], [1.0, 1.0]),
([-1.0, -1.0, 1.0, 1.0], [1.0, 0.0]),
([-1.0, -1.0, -1.0, 1.0], [0.0, 0.0]),
([-1.0, 1.0, 1.0, 1.0], [0.0, 1.0]),
([-1.0, -1.0, 1.0, 1.0], [1.0, 1.0]),
([1.0, -1.0, 1.0, 1.0], [1.0, 0.0]),
([1.0, 1.0, 1.0, 1.0], [0.0, 0.0]),
([-1.0, 1.0, -1.0, 1.0], [0.0, 1.0]),
([1.0, 1.0, -1.0, 1.0], [1.0, 1.0]),
([1.0, -1.0, -1.0, 1.0], [1.0, 0.0]),
([-1.0, -1.0, -1.0, 1.0], [0.0, 0.0])
];
(0..6).into_iter().map(|f|
(0..4).into_iter().map(|i| {
let t = vts_gl[f * 4 + i];
VT::get(&t.0, &t.1)
}).collect::<Vec<_>>()).collect::<Vec<_>>()
}
pub fn gen_c6f_gl() -> Vec<Vec<VT>> {
let uvs = [
[[0.25, 0.50], [0.50, 0.50], [0.50, 0.25], [0.25, 0.25]], [[0.25, 0.75], [0.25, 1.00], [0.50, 1.00], [0.50, 0.75]], [[0.50, 0.25], [0.50, 0.00], [0.25, 0.00], [0.25, 0.25]], [[0.50, 0.50], [0.25, 0.50], [0.25, 0.75], [0.50, 0.75]], [[0.00, 0.25], [0.00, 0.50], [0.25, 0.50], [0.25, 0.25]], [[0.75, 0.75], [0.75, 0.50], [0.50, 0.50], [0.50, 0.75]]]; let mut vec_vts = gen_vec_vts_gl();
for (j, f) in uvs.iter().enumerate() {
for (i, uv) in f.iter().enumerate() {
vec_vts[j][i].uv = UV::get(uv);
}
}
vec_vts
}
pub fn gen_any_face() -> Vec<Vec<VT>> {
[
vec![
([-1.0, -1.0, 2.0, 1.0], [1.0, 1.0]),
([0.0, 0.0, 1.0 - 0.707, 1.0], [0.5, 1.0 - 0.866]),
([1.0, -1.0, 2.0, 1.0], [0.0, 1.0])],
vec![
([1.0, -1.0, 2.0, 1.0], [1.0, 1.0]),
([0.0, 0.0, 1.0 - 0.707, 1.0], [0.5, 1.0 - 0.866]),
([1.0, 1.0, 2.0, 1.0], [0.0, 1.0])],
vec![
([1.0, 1.0, 2.0, 1.0], [1.0, 1.0]),
([0.0, 0.0, 1.0 - 0.707, 1.0], [0.5, 1.0 - 0.866]),
([-1.0, 1.0, 2.0, 1.0], [0.0, 1.0])],
vec![
([-1.0, 1.0, 2.0, 1.0], [1.0, 1.0]),
([0.0, 0.0, 1.0 - 0.707, 1.0], [0.5, 1.0 - 0.866]),
([-1.0, -1.0, 2.0, 1.0], [0.0, 1.0])],
vec![
([-1.0, -1.0, 2.0, 1.0], [0.0, 1.0]),
([1.0, -1.0, 2.0, 1.0], [1.0, 1.0]),
([1.0, 1.0, 2.0, 1.0], [1.0, 0.0]),
([-1.0, 1.0, 2.0, 1.0], [0.0, 0.0])]
].iter().map(|f|
f.iter().map(|t|
VT::get(&t.0, &t.1)).collect::<Vec<_>>()).collect::<Vec<_>>()
}
pub fn gen_vt<F: Float>(phf: PHF<F>) -> Vec<Vec<Vec<VT>>> {
phf.iter().map(|f|
f.iter().map(|v|
v.iter().map(|FTVI::<F>{fi: _, ti: _, vi: _, idx: _, p, uv}| {
let p = f_to_f32(p);
let uv = f_to_f32(uv);
VT::get(&[p[0], p[1], p[2], 1.0], &[uv[0], uv[1]])
}).collect()
).collect()
).collect()
}
pub fn gen_icosahedron(tf: bool) -> Vec<Vec<Vec<VT>>> {
gen_vt(Icosahedron::new(1.0f32).ph.with_uv(tf))
}
pub fn gen_dodecahedron(tf: bool) -> Vec<Vec<Vec<VT>>> {
gen_vt(Dodecahedron::new(1.0f32).ph.with_uv(tf))
}
pub fn gen_dodecahedron_center(tf: bool) -> Vec<Vec<Vec<VT>>> {
gen_vt(DodecahedronCenter::new(1.0f32).ph.with_uv(tf))
}
pub fn gen_c60(tf: bool) -> Vec<Vec<Vec<VT>>> {
gen_vt(C60::new(1.0f32).ph.with_uv(tf))
}
pub fn gen_c60_center(tf: bool) -> Vec<Vec<Vec<VT>>> {
gen_vt(C60Center::new(1.0f32).ph.with_uv(tf))
}