grafix-toolbox 0.8.33

Personal collection of opengl and rust tools, also serving as an functional gui crate. See ./gui/elements for premade gui elements
Documentation
use super::{format::*, *};

pub struct TexBuffer<'a, S, F, B: State> {
	t: Dummy<&'a (S, F, B)>,
	tex: Obj<TextureT<GL_TEXTURE_BUFFER>>,
	unit: Cell<u32>,
}
impl<S: TexSize, F: TexFmt, B: Buffer> TexBuffer<'_, S, F, B> {
	pub fn new(buf: &ArrObj<B, F>) -> Self {
		let tex = Obj::new();
		let fmt = get_internal_fmt::<S, F>();
		ASSERT!(
			GL::MAX_TEXTURE_BUFFER_SIZE() >= i32(buf.len),
			"Buffer {} for buffer texture {} exceeds maximum size",
			buf.obj,
			tex.obj
		);
		GL!(glTextureBuffer(GL_TEXTURE_BUFFER::TYPE, tex.obj, fmt, buf.obj));
		Self { t: Dummy, tex, unit: 0.into() }
	}
	pub fn Bind(&self) -> TexBuffBind {
		let unit = self.unit.take();
		let (b, u) = TexBuffBind::new(&self.tex, unit);
		self.unit.set(u);
		b
	}
}

pub struct TexBuffBind<'l> {
	l: Dummy<&'l GL_TEXTURE_BUFFER>,
	pub u: u32,
}
impl TexBuffBind<'_> {
	fn new(o: &Obj<TextureT<GL_TEXTURE_BUFFER>>, hint: u32) -> (Self, u32) {
		let u = TexState::BindAny::<GL_TEXTURE_BUFFER>(o.obj, hint);
		(Self { l: Dummy, u }, u)
	}
}
impl Drop for TexBuffBind<'_> {
	fn drop(&mut self) {
		TexState::Unbind(self.u);
	}
}