ugli-raw 0.14.0

Universal OpenGL Interface (Raw)
Documentation
use super::*;

pub type Program = gl::types::GLuint;
pub type Shader = gl::types::GLuint;

impl Context {
    pub fn attach_shader(&self, program: &Program, shader: &Shader) {
        unsafe {
            gl::AttachShader(*program, *shader);
        }
    }

    pub fn compile_shader(&self, shader: &Shader) {
        unsafe {
            gl::CompileShader(*shader);
        }
    }

    pub fn create_program(&self) -> Option<Program> {
        let handle = unsafe { gl::CreateProgram() };
        if handle == 0 {
            None
        } else {
            Some(handle)
        }
    }

    pub fn create_shader(&self, typ: Enum) -> Option<Shader> {
        let handle = unsafe { gl::CreateShader(typ) };
        if handle == 0 {
            None
        } else {
            Some(handle)
        }
    }

    pub fn delete_program(&self, program: &Program) {
        unsafe {
            gl::DeleteProgram(*program);
        }
    }

    pub fn delete_shader(&self, shader: &Shader) {
        unsafe {
            gl::DeleteShader(*shader);
        }
    }

    pub fn detach_shader(&self, program: &Program, shader: &Shader) {
        unsafe {
            gl::DetachShader(*program, *shader);
        }
    }

    pub fn get_program_info_log(&self, program: &Program) -> String {
        let mut info_log_length = std::mem::MaybeUninit::uninit();
        unsafe {
            gl::GetProgramiv(*program, gl::INFO_LOG_LENGTH, info_log_length.as_mut_ptr());
        }
        let info_log_length = unsafe { info_log_length.assume_init() };
        let mut info_log_bytes =
            vec![std::mem::MaybeUninit::<u8>::uninit(); info_log_length as usize];
        unsafe {
            gl::GetProgramInfoLog(
                *program,
                info_log_bytes.len() as SizeI,
                std::ptr::null_mut(),
                info_log_bytes.as_mut_ptr() as *mut _,
            );
        }
        String::from_utf8(unsafe {
            #[allow(clippy::unsound_collection_transmute)]
            std::mem::transmute(info_log_bytes)
        })
        .unwrap()
    }

    pub fn get_program_parameter_bool(&self, program: &Program, pname: Enum) -> Bool {
        self.get_program_parameter_int(program, pname) as Bool
    }

    pub fn get_program_parameter_int(&self, program: &Program, pname: Enum) -> Int {
        let mut result = std::mem::MaybeUninit::uninit();
        unsafe {
            gl::GetProgramiv(*program, pname, result.as_mut_ptr());
        }
        unsafe { result.assume_init() }
    }

    pub fn get_shader_info_log(&self, shader: &Shader) -> String {
        let mut info_log_length = std::mem::MaybeUninit::uninit();
        unsafe {
            gl::GetShaderiv(*shader, gl::INFO_LOG_LENGTH, info_log_length.as_mut_ptr());
        }
        let info_log_length = unsafe { info_log_length.assume_init() };
        let mut info_log_bytes =
            vec![std::mem::MaybeUninit::<u8>::uninit(); info_log_length as usize];
        unsafe {
            gl::GetShaderInfoLog(
                *shader,
                info_log_bytes.len() as SizeI,
                std::ptr::null_mut(),
                info_log_bytes.as_mut_ptr() as *mut _,
            )
        };
        String::from_utf8(unsafe {
            #[allow(clippy::unsound_collection_transmute)]
            std::mem::transmute(info_log_bytes)
        })
        .unwrap()
    }

    pub fn get_shader_parameter_bool(&self, shader: &Shader, pname: Enum) -> Bool {
        self.get_shader_parameter_int(shader, pname) as Bool
    }

    pub fn get_shader_parameter_int(&self, shader: &Shader, pname: Enum) -> Int {
        let mut result = std::mem::MaybeUninit::uninit();
        unsafe {
            gl::GetShaderiv(*shader, pname, result.as_mut_ptr());
        }
        unsafe { result.assume_init() }
    }

    pub fn link_program(&self, program: &Program) {
        unsafe {
            gl::LinkProgram(*program);
        }
    }

    pub fn shader_source(&self, shader: &Shader, source: &str) {
        unsafe {
            gl::ShaderSource(
                *shader,
                1,
                [source.as_ptr() as *const Char].as_ptr() as _,
                [source.len() as *const Int].as_ptr() as _,
            );
        }
    }

    pub fn use_program(&self, program: &Program) {
        unsafe {
            gl::UseProgram(*program);
        }
    }
}