grafix_toolbox/kit/opengl/texture/
texbuff.rs1use 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}