diff options
author | pryazha <pryadeiniv@mail.ru> | 2025-03-19 08:46:04 +0500 |
---|---|---|
committer | pryazha <pryadeiniv@mail.ru> | 2025-03-19 08:46:04 +0500 |
commit | b1389bad67cccd3da6815c2d5a436c177f09594b (patch) | |
tree | 393dee77b5faef3cfd6e78eda8ac07273cdcc85e /prge_shader.c | |
parent | 34821e9fefb0d7cbf9e72a2457b2901edbbe03bb (diff) |
window, texture, model, camera and gui (silly button)
Diffstat (limited to 'prge_shader.c')
-rw-r--r-- | prge_shader.c | 83 |
1 files changed, 59 insertions, 24 deletions
diff --git a/prge_shader.c b/prge_shader.c index 21a91f3..96b50f1 100644 --- a/prge_shader.c +++ b/prge_shader.c @@ -1,28 +1,33 @@ U32 compile_shader(GLenum type, Str8 filename) { - Arena *tmp = arena_alloc(0); + Arena *tmp; + Str8 src; + U32 id; + S32 status; + const char *csrc; - Str8 src = str8_read_entire_file(tmp, filename); + tmp = arena_alloc(0); + + src = str8_read_entire_file(tmp, filename); if (!src.ptr || !src.length) { - str8print(str8_pushf(tmp, "[ERROR] : Failed to read \"%.*s\"\n", str8expand(filename))); + str8print(str8pushf(tmp, "[ERROR] : Failed to read \"%.*s\"\n", str8expand(filename))); arena_release(tmp); return 0; } - const char *csrc = str8_to_cstr(tmp, src); + csrc = str8tocstr(tmp, src); - U32 id = glCreateShader(type); + id = glCreateShader(type); glShaderSource(id, 1, &csrc, 0); glCompileShader(id); - S32 status; glGetShaderiv(id, GL_COMPILE_STATUS, &status); if (status == GL_FALSE) { - char log[512]; + char log[512]; glGetShaderInfoLog(id, 512, 0, log); - str8print(str8_pushf(tmp, "[ERROR] : Failed to compile : \"%.*s\"\n%s", str8expand(filename), log)); + str8print(str8pushf(tmp, "[ERROR] : Failed to compile : \"%.*s\"\n%s", str8expand(filename), log)); } else { - str8print(str8_pushf(tmp, "[INFO] : \"%.*s\" compiled successfully.\n", str8expand(filename))); + str8print(str8pushf(tmp, "[INFO] : \"%.*s\" compiled successfully.\n", str8expand(filename))); } arena_release(tmp); @@ -30,36 +35,66 @@ U32 compile_shader(GLenum type, Str8 filename) return id; } -U32 create_shader_program(Str8 vert_filename, Str8 frag_filename) +U32 load_shader(char *vert_filename, char *geom_filename, char *frag_filename) { - U32 vert = compile_shader(GL_VERTEX_SHADER, vert_filename); - U32 frag = compile_shader(GL_FRAGMENT_SHADER, frag_filename); + U32 vert, geom, frag, id; + Arena *tmp; + 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)); - Arena *tmp = arena_alloc(0); + tmp = arena_alloc(0); - U32 id = glCreateProgram(); - glAttachShader(id, vert); - glAttachShader(id, frag); + id = glCreateProgram(); + if (vert_filename) + glAttachShader(id, vert); + if (geom_filename) + glAttachShader(id, geom); + if (frag_filename) + glAttachShader(id, frag); glLinkProgram(id); - S32 success; glGetProgramiv(id, GL_LINK_STATUS, &success); if (success == GL_FALSE) { - char log[512]; + char log[512]; glGetProgramInfoLog(id, 512, 0, log); - str8print(str8_pushf(tmp, "[ERROR]: Failed to link shader program:\n%s", log)); + str8print(str8pushf(tmp, "[ERROR] : Failed to link shader program:\n%s", log)); } else { - str8print(str8_pushf(tmp, "[INFO]: Shader program linked successfuly.\n\n")); + str8print(str8pushf(tmp, "[INFO] : Shader linked successfuly.\n\n")); } - glDeleteShader(vert); - glDeleteShader(frag); + if (vert_filename) + glDeleteShader(vert); + if (geom_filename) + glDeleteShader(geom); + if (frag_filename) + glDeleteShader(frag); arena_release(tmp); return id; } -void shader_set_mat4fv(U32 id, char *name, Mat4 m) +void shader_set_3fv(U32 id, char *name, V3 v) +{ + S32 loc; + loc = glGetUniformLocation(id, name); + glUniform3fv(loc, 1, (F32 *)&v); +} + +void shader_set_4fv(U32 id, char *name, V4 v) +{ + S32 loc; + loc = glGetUniformLocation(id, name); + glUniform4fv(loc, 1, (F32 *)&v); +} + +void shader_set_mat4fv(U32 id, char *name, MAT4 m) { - S32 loc = glGetUniformLocation(id, name); + S32 loc; + loc = glGetUniformLocation(id, name); glUniformMatrix4fv(loc, 1, 0, (F32 *)&m); } |