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