grafix_toolbox/kit/opengl/geom/
mesh.rs1use super::*;
2
3type BuffMem = Box<dyn ArrObjLease>;
4pub trait BuffArg {
5 fn set<I: IdxType>(self, _: u32, _: &mut Vao<I>) -> BuffMem;
6}
7impl<A: AttrType> BuffArg for (u32, &[A]) {
8 fn set<I: IdxType>(self, at: u32, v: &mut Vao<I>) -> BuffMem {
9 let (dim, arr) = self;
10 let arr = AttrArr::new((arr, 0));
11 v.AttribFmt(&arr, (at, dim));
12 Box(arr)
13 }
14}
15impl BuffArg for () {
16 fn set<I: IdxType>(self, _: u32, _: &mut Vao<I>) -> BuffMem {
17 Box(())
18 }
19}
20
21type VaoMem = Vec<BuffMem>;
22pub trait VaoArgs {
23 fn seta<I: IdxType>(self, _: &mut Vao<I>) -> VaoMem;
24}
25impl<A: BuffArg> VaoArgs for A {
26 fn seta<I: IdxType>(self, v: &mut Vao<I>) -> VaoMem {
27 let a = self.set(0, v);
28 vec![a]
29 }
30}
31impl<A1: BuffArg, A2: BuffArg> VaoArgs for (A1, A2) {
32 fn seta<I: IdxType>(self, v: &mut Vao<I>) -> VaoMem {
33 let (a1, a2) = self;
34 let (a1, a2) = (a1.set(0, v), a2.set(1, v));
35 vec![a1, a2]
36 }
37}
38impl<A1: BuffArg, A2: BuffArg, A3: BuffArg> VaoArgs for (A1, A2, A3) {
39 fn seta<I: IdxType>(self, v: &mut Vao<I>) -> VaoMem {
40 let (a1, a2, a3) = self;
41 let (a1, a2, a3) = (a1.set(0, v), a2.set(1, v), a3.set(2, v));
42 vec![a1, a2, a3]
43 }
44}
45
46pub struct Geometry<I> {
47 vao: Vao<I>,
48 _m: Box<[BuffMem]>,
49}
50impl<I: IdxType> Geometry<I> {
51 pub fn new(idx: &[I], args: impl VaoArgs) -> Self {
52 let mut vao = Vao::default();
53 let mut m = args.seta(&mut vao);
54
55 let idx = IdxArr::new(idx);
56 vao.BindIdxs(&idx);
57 m.push(Box(idx));
58
59 Self { vao, _m: m.into() }
60 }
61 pub fn Draw(&self, draw: impl DrawArgs) {
62 self.vao.Bind().Draw(draw);
63 }
64}
65
66pub trait AnyMeshT {
67 fn Draw(&self);
68}
69impl<I: IdxType> AnyMeshT for Mesh<I>
70where
71 (I, GLenum): DrawArgs,
72{
73 fn Draw(&self) {
74 self.geom.Draw(self.draw);
75 }
76}