diff options
| author | HampusM <hampus@hampusmat.com> | 2023-10-13 23:32:00 +0200 | 
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2023-10-13 23:32:00 +0200 | 
| commit | 12f48046b2606fc77a1312a6d5e5fc7ff9feff88 (patch) | |
| tree | 644f4abd6785a5f0c066c7fbadcfc5e820a41ebf /engine/src/shader.rs | |
| parent | cfa73b1ea42fa491ff9e00bb5efb5e5a5d860578 (diff) | |
refactor(engine): move uses of OpenGL to OpenGL module
Diffstat (limited to 'engine/src/shader.rs')
| -rw-r--r-- | engine/src/shader.rs | 198 | 
1 files changed, 0 insertions, 198 deletions
| diff --git a/engine/src/shader.rs b/engine/src/shader.rs deleted file mode 100644 index 0bbca77..0000000 --- a/engine/src/shader.rs +++ /dev/null @@ -1,198 +0,0 @@ -use std::ffi::CStr; -use std::ptr::null_mut; - -#[derive(Debug)] -pub struct Shader -{ -    shader: gl::types::GLuint, -} - -impl Shader -{ -    pub fn new(kind: Kind) -> Self -    { -        let shader = unsafe { gl::CreateShader(kind.into_gl()) }; - -        Self { shader } -    } - -    pub fn set_source(&self, source: &str) -> Result<(), Error> -    { -        if !source.is_ascii() { -            return Err(Error::SourceNotAscii); -        } - -        unsafe { -            #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] -            gl::ShaderSource( -                self.shader, -                1, -                &source.as_ptr().cast(), -                &(source.len() as gl::types::GLint), -            ); -        } - -        Ok(()) -    } - -    pub fn compile(&self) -> Result<(), Error> -    { -        unsafe { -            gl::CompileShader(self.shader); -        } - -        let mut compile_success = gl::types::GLint::default(); - -        unsafe { -            gl::GetShaderiv(self.shader, gl::COMPILE_STATUS, &mut compile_success); -        } - -        if compile_success == 0 { -            let info_log = self.get_info_log(); - -            return Err(Error::CompileFailed(info_log)); -        } - -        Ok(()) -    } - -    fn get_info_log(&self) -> String -    { -        let mut buf = vec![gl::types::GLchar::default(); 512]; - -        unsafe { -            #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] -            gl::GetShaderInfoLog( -                self.shader, -                buf.len() as gl::types::GLsizei, -                null_mut(), -                buf.as_mut_ptr(), -            ); -        } - -        let info_log = unsafe { CStr::from_ptr(buf.as_ptr()) }; - -        unsafe { String::from_utf8_unchecked(info_log.to_bytes().to_vec()) } -    } -} - -impl Drop for Shader -{ -    fn drop(&mut self) -    { -        unsafe { -            gl::DeleteShader(self.shader); -        } -    } -} - -/// Shader kind. -#[derive(Debug, Clone, Copy)] -pub enum Kind -{ -    Vertex, -    Fragment, -} - -impl Kind -{ -    fn into_gl(self) -> gl::types::GLenum -    { -        match self { -            Self::Vertex => gl::VERTEX_SHADER, -            Self::Fragment => gl::FRAGMENT_SHADER, -        } -    } -} - -/// Shader program -#[derive(Debug)] -pub struct Program -{ -    program: gl::types::GLuint, -} - -impl Program -{ -    pub fn new() -> Self -    { -        let program = unsafe { gl::CreateProgram() }; - -        Self { program } -    } - -    pub fn attach(&self, shader: &Shader) -    { -        unsafe { -            gl::AttachShader(self.program, shader.shader); -        } -    } - -    pub fn link(&self) -> Result<(), Error> -    { -        unsafe { -            gl::LinkProgram(self.program); -        } - -        let mut link_success = gl::types::GLint::default(); - -        unsafe { -            gl::GetProgramiv(self.program, gl::LINK_STATUS, &mut link_success); -        } - -        if link_success == 0 { -            let info_log = self.get_info_log(); - -            return Err(Error::CompileFailed(info_log)); -        } - -        Ok(()) -    } - -    pub fn activate(&self) -    { -        unsafe { -            gl::UseProgram(self.program); -        } -    } - -    fn get_info_log(&self) -> String -    { -        let mut buf = vec![gl::types::GLchar::default(); 512]; - -        unsafe { -            #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] -            gl::GetProgramInfoLog( -                self.program, -                buf.len() as gl::types::GLsizei, -                null_mut(), -                buf.as_mut_ptr(), -            ); -        } - -        let info_log = unsafe { CStr::from_ptr(buf.as_ptr()) }; - -        unsafe { String::from_utf8_unchecked(info_log.to_bytes().to_vec()) } -    } -} - -impl Drop for Program -{ -    fn drop(&mut self) -    { -        unsafe { -            gl::DeleteProgram(self.program); -        } -    } -} - -/// Shader error. -#[derive(Debug, thiserror::Error)] -pub enum Error -{ -    #[error("All characters in source are not within the ASCII range")] -    SourceNotAscii, - -    #[error("Failed to compile: {0}")] -    CompileFailed(String), -} | 
