Skip to main content

grafix_toolbox/kit/opengl/geom/
mesh.rs

1use 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}