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); |