summaryrefslogtreecommitdiff
path: root/src/shader.c
diff options
context:
space:
mode:
authorsanine-a <sanine.not@pm.me>2020-05-20 18:10:16 -0500
committersanine-a <sanine.not@pm.me>2020-05-20 18:10:16 -0500
commit447c3de585cca51013b17017d968e3aee53f5c87 (patch)
treea728c4de651c4df82bc09ecc60672ab4798b4491 /src/shader.c
an initial commit
Diffstat (limited to 'src/shader.c')
-rw-r--r--src/shader.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/shader.c b/src/shader.c
new file mode 100644
index 0000000..496b9f9
--- /dev/null
+++ b/src/shader.c
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include "include/glad.h"
+#include "include/shader.h"
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+static char* read_file(char* file_path) {
+ FILE* f = fopen(file_path, "r");
+ if (f == NULL) {
+ return NULL;
+ }
+
+ fseek(f, 0, SEEK_END);
+ long fsize = ftell(f);
+ fseek(f, 0, SEEK_SET);
+
+ char* file_string = malloc(fsize + 1);
+ if (file_string == NULL) {
+ return NULL;
+ }
+ fread(file_string, 1, fsize, f);
+ fclose(f);
+
+ file_string[fsize] = 0;
+
+ return file_string;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+enum honey_shader_result honey_shader_load(honey_shader* shader,
+ char* vertex_shader_path,
+ char* fragment_shader_path) {
+ enum honey_shader_result result;
+
+ /* load vertex shader code */
+ char* vertex_shader_code = read_file(vertex_shader_path);
+
+ /* load fragment shader code */
+ char* fragment_shader_code = read_file(fragment_shader_path);
+
+ /* compile shaders */
+ int success;
+ char error[512];
+
+ int vertex_shader = glCreateShader(GL_VERTEX_SHADER);
+ glShaderSource(vertex_shader, 1, ((const char**)&vertex_shader_code), NULL);
+ glCompileShader(vertex_shader);
+ glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
+ if (!success) {
+ glGetShaderInfoLog(vertex_shader, 512, NULL, error);
+ printf("Failed to compile vertex shader: %s\n", error);
+ result = VERTEX_SHADER_FAILED;
+ return result;
+ }
+
+ int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
+ glShaderSource(fragment_shader, 1, ((const char**)&fragment_shader_code), NULL);
+ glCompileShader(fragment_shader);
+ glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
+ if (!success) {
+ glGetShaderInfoLog(fragment_shader, 512, NULL, error);
+ printf("Failed to compile fragment shader: %s\n", error);
+ result = FRAGMENT_SHADER_FAILED;
+ return result;
+ }
+
+ /* link shaders */
+ *shader = glCreateProgram();
+ glAttachShader(*shader, vertex_shader);
+ glAttachShader(*shader, fragment_shader);
+ glLinkProgram(*shader);
+ glGetShaderiv(*shader, GL_LINK_STATUS, &success);
+ if (!success) {
+ glGetProgramInfoLog(*shader, 512, NULL, error);
+ printf("Failed to link shaders: %s\n", error);
+ result = SHADER_LINK_FAILED;
+ return result;
+ }
+
+ glDeleteShader(vertex_shader);
+ glDeleteShader(fragment_shader);
+
+ free(vertex_shader_code);
+ free(fragment_shader_code);
+
+ result = SHADER_OK;
+
+ return result;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_shader_set_int(honey_shader shader,
+ char* int_name,
+ int number) {
+ honey_shader_use(shader);
+ unsigned int int_location = glGetUniformLocation(shader, int_name);
+ glUniform1i(int_location, number);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_shader_set_matrix_4fv(honey_shader shader,
+ char* matrix_name,
+ float* matrix) {
+ glUseProgram(shader);
+ unsigned int matrix_location = glGetUniformLocation(shader, matrix_name);
+ glUniformMatrix4fv(matrix_location, 1, GL_FALSE, matrix);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+