grafix_toolbox/kit/opengl/shader/
object.rs

1use super::*;
2
3#[derive(Debug)]
4pub enum ShaderObj {
5	Vertex(Object<ShaderVert>),
6	Fragment(Object<ShaderPix>),
7	Geometry(Object<ShaderGeom>),
8	Compute(Object<ShaderComp>),
9	TessCtrl(Object<ShaderTCtrl>),
10	TessEval(Object<ShaderTEval>),
11}
12impl ShaderObj {
13	pub fn new(name: &str, src: &CString) -> Res<Self> {
14		let obj = match slice((name, 2)) {
15			"vs" => Vertex(Def()),
16			"ps" => Fragment(Def()),
17			"gs" => Geometry(Def()),
18			"cs" => Compute(Def()),
19			"tc" => TessCtrl(Def()),
20			"te" => TessEval(Def()),
21			_ => Err(format!("Shader name {name:?} should start with vs|ps|gs|cs|tc|te according to type"))?,
22		};
23
24		let o = obj.obj();
25		GL!(gl::ShaderSource(o, 1, &src.as_ptr(), ptr::null()));
26		GL!(gl::CompileShader(o));
27		let mut status: i32 = 0;
28		GL!(gl::GetShaderiv(o, gl::COMPILE_STATUS, &mut status));
29		if GLbool::to(status) != gl::TRUE {
30			Err(format!("Error compiling {} shader {name:?}\n\n{}", obj.name(), parsing::print_shader_log(o)))?
31		}
32
33		Ok(obj)
34	}
35	pub fn obj(&self) -> u32 {
36		match self {
37			Vertex(o) => o.obj,
38			Fragment(o) => o.obj,
39			Geometry(o) => o.obj,
40			Compute(o) => o.obj,
41			TessCtrl(o) => o.obj,
42			TessEval(o) => o.obj,
43		}
44	}
45	pub fn valid(name: &str) -> Res<()> {
46		match slice((name, 2)) {
47			"vs" | "ps" | "gs" | "cs" | "tc" | "te" => Ok(()),
48			_ => Err(format!("Shader name '{name}' should start with vs|ps|gs|cs|tc|te according to type")),
49		}
50	}
51	fn name(&self) -> &str {
52		match self {
53			Vertex(_) => "vertex",
54			Fragment(_) => "pixel",
55			Geometry(_) => "geometry",
56			Compute(_) => "compute",
57			TessCtrl(_) => "tess. control",
58			TessEval(_) => "tess. eval",
59		}
60	}
61}
62use ShaderObj::*;