summaryrefslogtreecommitdiff
path: root/shader.h
diff options
context:
space:
mode:
Diffstat (limited to 'shader.h')
-rw-r--r--shader.h113
1 files changed, 19 insertions, 94 deletions
diff --git a/shader.h b/shader.h
index 189225a..cde61b6 100644
--- a/shader.h
+++ b/shader.h
@@ -1,105 +1,30 @@
-shader_t compile_gl_shader(u32 type, char **src)
-{
- shader_t shader = {0};
- shader.id = glCreateShader(type);
- glShaderSource(shader.id, 1, (const char **)src, 0);
- glCompileShader(shader.id);
-
- i32 status;
- glGetShaderiv(shader.id, GL_COMPILE_STATUS, &status);
- if (status == GL_FALSE)
- glGetShaderInfoLog(shader.id, MAX_SHADER_LOG, 0, shader.log);
- else
- snprintf(shader.log, MAX_SHADER_LOG, "compiled successfully");
+#ifndef shader_h
+#define shader_h
- return shader;
-}
+u32 compile_shader(u32 type, const char *src);
+u32 create_shader(const char *vert_src, const char *frag_src);
+u32 load_shader(u32 type, struct string filename);
+u32 load_vfshader(struct string vert_filename, struct string frag_filename);
-shader_t compile_gl_shader_file(u32 type, const char *filename)
+void
+uniform_v3(u32 id, const char *name, v3 v)
{
- char *src;
- shader_t shader = {0};
-
- arena_t tmp = alloc_arena(0);
- if (!sys_read_file(&tmp, &src, filename)) {
- printf("error: failed to read: \"%s\"\n", filename);
- release_arena(&tmp);
- return shader;
- }
- shader = compile_gl_shader(type, &src);
- release_arena(&tmp);
-
- if (!shader.id)
- printf("error: \"%s\": ", filename);
- else
- printf("info: \"%s\": ", filename);
- printf("%s", shader.log);
- printf("\n");
-
- return shader;
+ i32 loc = gl_get_uniform_location(id, name);
+ gl_uniform_3fv(loc, 1, (f32 *)&v);
}
-shader_t load_gl_shader(const char *dir, const char *vert_filename, const char *geom_filename, const char *frag_filename)
+void
+uniform_v4(u32 id, const char *name, v4 v)
{
- shader_t shader = {0};
- shader.id = glCreateProgram();
-
- char full_path[MAX_PATH];
- shader_t vert;
- if (vert_filename) {
- snprintf(full_path, sizeof(full_path), "%s/%s", dir, vert_filename);
- vert = compile_gl_shader_file(GL_VERTEX_SHADER, full_path);
- glAttachShader(shader.id, vert.id);
- }
-
- shader_t geom;
- if (geom_filename) {
- snprintf(full_path, sizeof(full_path), "%s/%s", dir, geom_filename);
- geom = compile_gl_shader_file(GL_GEOMETRY_SHADER, full_path);
- glAttachShader(shader.id, geom.id);
- }
-
- shader_t frag;
- if (frag_filename) {
- snprintf(full_path, sizeof(full_path), "%s/%s", dir, frag_filename);
- frag = compile_gl_shader_file(GL_FRAGMENT_SHADER, full_path);
- glAttachShader(shader.id, frag.id);
- }
-
- i32 status;
- glLinkProgram(shader.id);
- glGetProgramiv(shader.id, GL_LINK_STATUS, &status);
- if (status == GL_FALSE) {
- glGetProgramInfoLog(shader.id, MAX_SHADER_LOG, 0, shader.log);
- printf("error: failed to link shader program:\n%s", shader.log);
- } else {
- printf("info: shader linked successfuly\n\n");
- }
-
- if (vert_filename)
- glDeleteShader(vert.id);
- if (geom_filename)
- glDeleteShader(geom.id);
- if (frag_filename)
- glDeleteShader(frag.id);
-
- return shader;
-}
-
-void shader_set_v3(shader_t shader, const char *name, v3 vec)
-{
- i32 location = glGetUniformLocation(shader.id, name);
- glUniform3fv(location, 1, (f32 *)&vec);
+ i32 loc = gl_get_uniform_location(id, name);
+ gl_uniform_4fv(loc, 1, (f32 *)&v);
}
-void shader_set_v4(shader_t shader, const char *name, v4 vec)
+void
+uniform_mat(u32 id, const char *name, mat4 mat)
{
- i32 location = glGetUniformLocation(shader.id, name);
- glUniform4fv(location, 1, (f32 *)&vec);
+ i32 loc = gl_get_uniform_location(id, name);
+ gl_uniform_matrix_4fv(loc, 1, 0, (f32 *)&mat);
}
-void shader_set_mat4(shader_t shader, const char *name, mat4 mat)
-{
- i32 location = glGetUniformLocation(shader.id, name);
- glUniformMatrix4fv(location, 1, 0, (f32 *)&mat);
-}
+#endif