1 module unecht.gl.shader;
2 
3 import derelict.opengl3.gl3;
4 
5 import gl3n.linalg;
6 
7 import unecht.meta.misc;
8 
9 ///
10 enum ShaderType
11 {
12 	vertex,
13 	fragment
14 }
15 
16 ///
17 final class GLShader
18 {
19 	GLuint shader;
20 	ShaderType shaderType;
21 	string errors;
22 	bool success;
23 
24 	void create(ShaderType _type, string _src)
25 	{
26 		shaderType = _type;
27 
28 		shader = glCreateShader(shaderType==ShaderType.vertex ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER);
29 
30         int stringLength = cast(int)_src.length;
31         const(char)* strPtr = _src.ptr;
32 		glShaderSource(shader, 1, &strPtr, &stringLength);
33 
34 		glCompileShader(shader);
35 
36 		GLint success;
37 		glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
38 		if (!success) {
39 			GLchar[1024] InfoLog;
40 			GLsizei logLen;
41 			glGetShaderInfoLog(shader, 1024, &logLen, InfoLog.ptr);
42 
43 			import std.conv:to;
44 			errors = to!string(InfoLog[0..logLen-1]);
45 
46             import unecht.core.logger;
47 			log.errorf("Error compiling shader: '%s'", errors);
48 		}
49 	}
50 
51 	///
52 	void destroy()
53 	{
54 		glDeleteShader(shader);
55 		success = false;
56 		errors = null;
57 	}
58 }