diff options
Diffstat (limited to 'prge_shader.c')
-rw-r--r-- | prge_shader.c | 97 |
1 files changed, 45 insertions, 52 deletions
diff --git a/prge_shader.c b/prge_shader.c index 96b50f1..3aee9b5 100644 --- a/prge_shader.c +++ b/prge_shader.c @@ -1,21 +1,18 @@ -U32 compile_shader(GLenum type, Str8 filename) +U32 compile_glsl_shader(U32 type, const char *fname) { - Arena *tmp; - Str8 src; + Arena *tmpa; + FLS src; + const char *csrc; U32 id; S32 status; - const char *csrc; - - tmp = arena_alloc(0); - src = str8_read_entire_file(tmp, filename); - if (!src.ptr || !src.length) { - str8print(str8pushf(tmp, "[ERROR] : Failed to read \"%.*s\"\n", str8expand(filename))); - arena_release(tmp); + tmpa = alloc_arena(0); + src = sys_read_entire_file_fls(tmpa, fname); + if (!src.p) { + sys_printf("[ERROR] : Failed to read \"%s\"\n", fname); return 0; } - - csrc = str8tocstr(tmp, src); + csrc = (const char *)src.p; id = glCreateShader(type); glShaderSource(id, 1, &csrc, 0); @@ -25,76 +22,72 @@ U32 compile_shader(GLenum type, Str8 filename) if (status == GL_FALSE) { char log[512]; glGetShaderInfoLog(id, 512, 0, log); - str8print(str8pushf(tmp, "[ERROR] : Failed to compile : \"%.*s\"\n%s", str8expand(filename), log)); + sys_printf("[ERROR] : Failed to compile : \"%s\"\n%s", fname, log); } else { - str8print(str8pushf(tmp, "[INFO] : \"%.*s\" compiled successfully.\n", str8expand(filename))); + sys_printf("[INFO] : \"%s\" compiled successfully.\n", fname); } - arena_release(tmp); + release_arena(tmpa); return id; } -U32 load_shader(char *vert_filename, char *geom_filename, char *frag_filename) +Shader load_shader(const char *vfname, const char *gfname, const char *ffname) { - U32 vert, geom, frag, id; - Arena *tmp; + Shader shader; + U32 vert, geom, frag; S32 success; - if (vert_filename) - vert = compile_shader(GL_VERTEX_SHADER, str8fromcstr(vert_filename)); - if (geom_filename) - geom = compile_shader(GL_GEOMETRY_SHADER, str8fromcstr(geom_filename)); - if (frag_filename) - frag = compile_shader(GL_FRAGMENT_SHADER, str8fromcstr(frag_filename)); + shader.id = glCreateProgram(); - tmp = arena_alloc(0); + if (vfname) { + vert = compile_glsl_shader(GL_VERTEX_SHADER, vfname); + glAttachShader(shader.id, vert); + } + if (gfname) { + geom = compile_glsl_shader(GL_GEOMETRY_SHADER, gfname); + glAttachShader(shader.id, geom); + } + if (ffname) { + frag = compile_glsl_shader(GL_FRAGMENT_SHADER, ffname); + glAttachShader(shader.id, frag); + } + + glLinkProgram(shader.id); + glGetProgramiv(shader.id, GL_LINK_STATUS, &success); - id = glCreateProgram(); - if (vert_filename) - glAttachShader(id, vert); - if (geom_filename) - glAttachShader(id, geom); - if (frag_filename) - glAttachShader(id, frag); - glLinkProgram(id); - glGetProgramiv(id, GL_LINK_STATUS, &success); if (success == GL_FALSE) { char log[512]; - glGetProgramInfoLog(id, 512, 0, log); - str8print(str8pushf(tmp, "[ERROR] : Failed to link shader program:\n%s", log)); + glGetProgramInfoLog(shader.id, 512, 0, log); + sys_printf("[ERROR] : Failed to link shader program:\n%s", log); } else { - str8print(str8pushf(tmp, "[INFO] : Shader linked successfuly.\n\n")); + sys_printf("[INFO] : Shader linked successfuly.\n\n"); } - if (vert_filename) + + if (vfname) glDeleteShader(vert); - if (geom_filename) + if (gfname) glDeleteShader(geom); - if (frag_filename) + if (ffname) glDeleteShader(frag); - arena_release(tmp); - - return id; + return shader; } -void shader_set_3fv(U32 id, char *name, V3 v) +void set3fv(U32 id, const char *name, V3 v) { - S32 loc; - loc = glGetUniformLocation(id, name); + S32 loc = glGetUniformLocation(id, name); glUniform3fv(loc, 1, (F32 *)&v); } -void shader_set_4fv(U32 id, char *name, V4 v) +void set4fv(U32 id, const char *name, V4 v) { - S32 loc; - loc = glGetUniformLocation(id, name); + S32 loc = glGetUniformLocation(id, name); glUniform4fv(loc, 1, (F32 *)&v); } -void shader_set_mat4fv(U32 id, char *name, MAT4 m) +void setmat4fv(U32 id, const char *name, MAT4 m) { - S32 loc; - loc = glGetUniformLocation(id, name); + S32 loc = glGetUniformLocation(id, name); glUniformMatrix4fv(loc, 1, 0, (F32 *)&m); } |