diff options
Diffstat (limited to 'engine/src/opengl')
| -rw-r--r-- | engine/src/opengl/shader.rs | 14 | ||||
| -rw-r--r-- | engine/src/opengl/texture.rs | 42 | 
2 files changed, 54 insertions, 2 deletions
| diff --git a/engine/src/opengl/shader.rs b/engine/src/opengl/shader.rs index 9bed09b..224a9bc 100644 --- a/engine/src/opengl/shader.rs +++ b/engine/src/opengl/shader.rs @@ -153,7 +153,7 @@ impl Program          Ok(())      } -    pub fn activate(&self, cb: impl FnOnce(CurrentlyBound<'_, Self>)) +    pub fn activate<Ret>(&self, cb: impl FnOnce(CurrentlyBound<'_, Self>) -> Ret) -> Ret      {          unsafe {              gl::UseProgram(self.program); @@ -162,7 +162,7 @@ impl Program          // SAFETY: The shader program object is bound above          let currently_bound = unsafe { CurrentlyBound::new() }; -        cb(currently_bound); +        cb(currently_bound)      }      pub fn set_uniform_matrix_4fv( @@ -205,6 +205,16 @@ impl Program          }      } +    pub fn set_uniform_1i(&self, _: &CurrentlyBound<Self>, name: &CStr, num: i32) +    { +        let uniform_location = +            unsafe { gl::GetUniformLocation(self.program, name.as_ptr().cast()) }; + +        unsafe { +            gl::Uniform1i(uniform_location, num); +        } +    } +      fn get_info_log(&self) -> String      {          let mut buf = vec![gl::types::GLchar::default(); 512]; diff --git a/engine/src/opengl/texture.rs b/engine/src/opengl/texture.rs index 4186479..56eb118 100644 --- a/engine/src/opengl/texture.rs +++ b/engine/src/opengl/texture.rs @@ -1,6 +1,7 @@  use std::ptr::null;  use crate::opengl::currently_bound::CurrentlyBound; +use crate::texture::Id;  use crate::vector::Vec2;  #[derive(Debug)] @@ -234,3 +235,44 @@ impl PixelDataFormat          }      }  } + +pub fn set_active_texture_unit(texture_unit: TextureUnit) +{ +    unsafe { +        gl::ActiveTexture(texture_unit.into_gl()); +    } +} + +macro_rules! texture_unit_enum { +    (cnt=$cnt: literal) => { +        seq_macro::seq!(N in 0..$cnt { +            #[derive(Debug, Clone, Copy)] +            pub enum TextureUnit { +                #( +                    No~N, +                )* +            } + +            impl TextureUnit { +                fn into_gl(self) -> gl::types::GLenum { +                    match self { +                        #( +                            Self::No~N => gl::TEXTURE~N, +                        )* +                    } +                } + +                pub fn from_texture_id(texture_id: Id) -> Option<Self> { +                    match texture_id.into_inner() { +                        #( +                            N => Some(Self::No~N), +                        )* +                        _ => None +                    } +                } +            } +        }); +    }; +} + +texture_unit_enum!(cnt = 31); | 
