diff --git a/Makefile.dev b/Makefile.dev index 2908b31..086c47a 100644 --- a/Makefile.dev +++ b/Makefile.dev @@ -1,6 +1,6 @@ TARGET ?= forge INSTALL_DIR ?= $(HOME)/.local/bin -TEST_ARGS ?= --frag=./shaders --monitor=1 --frag-config=./config/shaders.cfg --tempo=30 +TEST_ARGS ?= --frag=./shaders --frag-config=./config/shaders.cfg --tempo=30 SHELL := /bin/bash .PHONY: build diff --git a/shaders/frag0.glsl b/shaders/frag0.glsl index 731cfd5..fcbe205 100644 --- a/shaders/frag0.glsl +++ b/shaders/frag0.glsl @@ -1308,9 +1308,11 @@ subroutine(src_stage_sub) vec4 src_16(vec2 vUV, int seed) f += selected_fx == 4 ? h_rect(uv2, vec2(-2, -3.2), vec2(1, 0), 0.1) : 0; // show inputs / feedback - f += (selected_srca == 5 || selected_srca == 10) ? rect(uv2, vec2(-8, 2), vec2(2, 0.1)) : 0; + f += selected_srca == 5 ? rect(uv2, vec2(-8, 2), vec2(2, 0.1)) : 0; + f += selected_srca == 10 ? rect(uv2, vec2(-7, 2), vec2(1, 0.1)) + rect(uv2, vec2(-8, 0.5), vec2(0.1, 1.6)) + rect(uv2, vec2(-9, -1), vec2(1, 0.1)) : 0; f += (selected_srca == 0 || selected_srca % 5 != 0 && selected_srca >= 8) ? rect(uv2, vec2(-6.5, 2), vec2(0.5, 0.1)) + rect(uv2, vec2(0, 4), vec2(7, 0.1)) + rect(uv2, vec2(-7, 3), vec2(0.1, 1.1)) + rect(uv2, vec2(7, 2), vec2(0.1, 2.1)) : 0; - f += (selected_srcb == 5 || selected_srcb == 10) ? rect(uv2, vec2(-8, -2), vec2(2, 0.1)) : 0; + f += selected_srcb == 5 ? rect(uv2, vec2(-6.5, -2), vec2(0.5, 0.1)) + rect(uv2, vec2(-7, -0.5), vec2(0.1, 1.6)) + rect(uv2, vec2(-8.5, 1), vec2(1.5, 0.1)) : 0; + f += selected_srcb == 10 ? rect(uv2, vec2(-8, -2), vec2(2, 0.1)) : 0; f += (selected_srcb == 0 || selected_srcb % 5 != 0 && selected_srcb >= 8) ? rect(uv2, vec2(-6.5, -2), vec2(0.5, 0.1)) + rect(uv2, vec2(0, -4), vec2(7, 0.1)) + rect(uv2, vec2(-7, -3), vec2(0.1, 1.1)) + rect(uv2, vec2(7, -2), vec2(0.1, 2.1)) : 0; // show page diff --git a/src/shaders.c b/src/shaders.c index 1c893d3..c4f9bae 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -10,30 +11,10 @@ #include "shaders.h" #include "types.h" -static bool compile_shader(GLuint shader_id, char *name, char *source_code) { - GLint status_params; - char log[1024]; +#define GLAD_GL_IMPLEMENTATION +#include - log_info("Compiling '%s'...", name); - - // update shader source code - glShaderSource(shader_id, 1, (const GLchar **)&source_code, NULL); - - // compile shader - glCompileShader(shader_id); - - // get compilation status - glGetShaderiv(shader_id, GL_COMPILE_STATUS, &status_params); - glGetShaderInfoLog(shader_id, 1024, NULL, (GLchar *)&log); - - if (status_params == GL_FALSE) { - log_error("Failed to compile\n%s", log); - } else { - log_success("Compilation successful"); - } - - return status_params == GL_TRUE; -} +static void init_gl() { gladLoadGL(glfwGetProcAddress); } static void init_textures(ShaderProgram *program, Context context) { unsigned int i; @@ -62,6 +43,8 @@ static void init_textures(ShaderProgram *program, Context context) { // setup mipmap context glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + log_success("Texture %d initialized", i); } } @@ -111,24 +94,21 @@ static void init_framebuffers(ShaderProgram *program, return; } -static void init_vertices(ShaderProgram *program, bool rebind) { +static void init_vertices(ShaderProgram *program) { unsigned int i; - // create vertex buffer and setup vertices - if (!rebind) { - glGenBuffers(1, &program->vertex_buffer); - } + glGenBuffers(1, &program->vertex_buffer); glBindBuffer(GL_ARRAY_BUFFER, program->vertex_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); +} - // create vertex array - if (!rebind) { - glGenVertexArrays(1, &program->vertex_array[0]); - glBindVertexArray(program->vertex_array[0]); - } else { - glGenVertexArrays(1, &program->vertex_array[1]); - glBindVertexArray(program->vertex_array[1]); - } +static void bind_vertices(ShaderProgram *program, unsigned int index) { + unsigned int i; + + glBindBuffer(GL_ARRAY_BUFFER, program->vertex_buffer); + + glGenVertexArrays(1, &program->vertex_array[index]); + glBindVertexArray(program->vertex_array[index]); for (i = 0; i < program->frag_count; i++) { // enable attribute pointer @@ -140,6 +120,31 @@ static void init_vertices(ShaderProgram *program, bool rebind) { } } +static bool compile_shader(GLuint shader_id, char *name, char *source_code) { + GLint status_params; + char log[1024]; + + log_info("Compiling '%s'...", name); + + // update shader source code + glShaderSource(shader_id, 1, (const GLchar **)&source_code, NULL); + + // compile shader + glCompileShader(shader_id); + + // get compilation status + glGetShaderiv(shader_id, GL_COMPILE_STATUS, &status_params); + glGetShaderInfoLog(shader_id, 1024, NULL, (GLchar *)&log); + + if (status_params == GL_FALSE) { + log_error("Failed to compile\n%s", log); + } else { + log_success("Compilation successful"); + } + + return status_params == GL_TRUE; +} + static void init_shaders(ShaderProgram *program, File *fragment_shaders) { unsigned int i; @@ -285,6 +290,8 @@ ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config, program.sub_variant_count = config_file_get_int(shader_config, "SUB_VARIANT_COUNT", 1); + init_gl(); + init_shaders(&program, fragment_shaders); if (program.error) { @@ -297,11 +304,12 @@ ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config, init_programs(&program, shader_config); + init_vertices(&program); } else { program = *previous; } - init_vertices(&program, previous != NULL); + bind_vertices(&program, previous != NULL ? 1 : 0); return program; } diff --git a/src/window.c b/src/window.c index b69573f..f7a6325 100644 --- a/src/window.c +++ b/src/window.c @@ -7,9 +7,6 @@ #include "types.h" #include "window.h" -#define GLAD_GL_IMPLEMENTATION -#include - static void init_glfw(void (*error_callback)(int, const char *)) { log_info("[GLFW] Initializing..."); @@ -84,12 +81,7 @@ create_window(GLFWmonitor *monitor, char *title, Window *shared_context, return window; } -static void use_window(GLFWwindow *window) { - // use current window - glfwMakeContextCurrent(window); - // link GLAD and GLFW window - gladLoadGL(glfwGetProcAddress); -} +static void use_window(GLFWwindow *window) { glfwMakeContextCurrent(window); } void window_startup(void (*error_callback)(int, const char *)) { init_glfw(error_callback); @@ -125,7 +117,6 @@ double window_get_time() { return glfwGetTime(); } void window_use(Window *window, Context *context) { glfwMakeContextCurrent(window); - gladLoadGL(glfwGetProcAddress); glfwGetFramebufferSize(window, &context->width, &context->height); }