Skip to main content

grafix_toolbox/kit/opengl/texture/
texbuff.rs

1use super::{format::*, *};
2
3pub struct TexBuffer<'a, S, F, B: State> {
4	t: Dummy<&'a (S, F, B)>,
5	tex: Obj<TextureT<GL_TEXTURE_BUFFER>>,
6	unit: Cell<u32>,
7}
8impl<S: TexSize, F: TexFmt, B: Buffer> TexBuffer<'_, S, F, B> {
9	pub fn new(buf: &ArrObj<B, F>) -> Self {
10		let tex = Obj::new();
11		let fmt = get_internal_fmt::<S, F>();
12		ASSERT!(
13			GL::MAX_TEXTURE_BUFFER_SIZE() >= i32(buf.len),
14			"Buffer {} for buffer texture {} exceeds maximum size",
15			buf.obj,
16			tex.obj
17		);
18		GL!(glTextureBuffer(GL_TEXTURE_BUFFER::TYPE, tex.obj, fmt, buf.obj));
19		Self { t: Dummy, tex, unit: 0.into() }
20	}
21	pub fn Bind(&self) -> TexBuffBind {
22		let unit = self.unit.take();
23		let (b, u) = TexBuffBind::new(&self.tex, unit);
24		self.unit.set(u);
25		b
26	}
27}
28
29pub struct TexBuffBind<'l> {
30	l: Dummy<&'l GL_TEXTURE_BUFFER>,
31	pub u: u32,
32}
33impl TexBuffBind<'_> {
34	fn new(o: &Obj<TextureT<GL_TEXTURE_BUFFER>>, hint: u32) -> (Self, u32) {
35		let u = TexState::BindAny::<GL_TEXTURE_BUFFER>(o.obj, hint);
36		(Self { l: Dummy, u }, u)
37	}
38}
39impl Drop for TexBuffBind<'_> {
40	fn drop(&mut self) {
41		TexState::Unbind(self.u);
42	}
43}