use crate::{app::gl, models::{Mat4, Vec3}}; pub struct Shader { pub program: gl::types::GLuint, pub gl: std::rc::Rc, } impl Shader { pub fn use_program(&self) { unsafe { self.gl.UseProgram(self.program) }; } pub fn set_uniform_mat4(&self, name: &str, mat: &Mat4) { unsafe { let loc = self.gl.GetUniformLocation( self.program, name.as_ptr() as *const i8 ); self.gl.UniformMatrix4fv(loc, 1, gl::FALSE, mat.as_ptr()); } } pub fn set_uniform_vec3(&self, name: &str, v: &Vec3) { unsafe { let loc = self.gl.GetUniformLocation(self.program, name.as_ptr() as *const i8); self.gl.Uniform3f(loc, v.x, v.y, v.z); } } pub fn set_uniform_f32(&self, name: &str, v: f32) { unsafe { let loc = self.gl.GetUniformLocation(self.program, name.as_ptr() as *const i8); self.gl.Uniform1f(loc, v); } } pub fn set_uniform_i32(&self, name: &str, v: i32) { unsafe { let loc = self.gl.GetUniformLocation(self.program, name.as_ptr() as *const i8); self.gl.Uniform1i(loc, v); // used for texture slots } } }