1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
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 { 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 { 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); } } }