From d278cbf36b27979f5bd2f6b57c030c6c33c768f1 Mon Sep 17 00:00:00 2001 From: pommicket Date: Fri, 1 Oct 2021 20:06:46 -0400 Subject: color coding based on speed --- grainf.glsl | 5 --- grainv.glsl | 9 ----- main.c | 109 ++++++++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 77 insertions(+), 46 deletions(-) delete mode 100644 grainf.glsl delete mode 100644 grainv.glsl diff --git a/grainf.glsl b/grainf.glsl deleted file mode 100644 index 93b04d8..0000000 --- a/grainf.glsl +++ /dev/null @@ -1,5 +0,0 @@ -uniform vec4 u_color; - -void main() { - gl_FragColor = u_color; -} diff --git a/grainv.glsl b/grainv.glsl deleted file mode 100644 index 2584fd3..0000000 --- a/grainv.glsl +++ /dev/null @@ -1,9 +0,0 @@ -attribute vec3 v_pos; -uniform mat4 u_transform; -uniform sampler2D u_offset_tex; - -void main() { - ivec2 texel_pos = ivec2(gl_InstanceID & 1023, gl_InstanceID >> 10); - vec3 offset = texelFetch(u_offset_tex, texel_pos, 0).xyz; - gl_Position = u_transform * vec4(v_pos + offset, 1.0); -} diff --git a/main.c b/main.c index 9b43370..cc70405 100644 --- a/main.c +++ b/main.c @@ -5,7 +5,6 @@ #define V_WINDOWED 1 #include "vlib.h" -static GLProgram *program_grain; static mat4 g_camera; static bool g_wireframe; @@ -15,7 +14,8 @@ typedef struct { uint32_t ngrains; uint32_t new_grains_per_second; float grain_gen_radius; - vec4 color; + float color_speed_scale; + vec4 color1, color2; // color1 = color of still grain, color2 = color of grain moving at color_speed_scale m/s } Function; typedef struct { @@ -44,7 +44,6 @@ int main(int argc, char **argv) { Player player_data = {0}, *player = &player_data; Function f_data = {0}, *f = &f_data; - program_grain = gl_program_new("grainv.glsl", "grainf.glsl"); typedef struct { vec3 pos; } UnlitVertex; @@ -52,24 +51,8 @@ int main(int argc, char **argv) { vec2 pos; } UpdateVertex; - GLVBO grain_vbo = gl_vbo_new(UnlitVertex, "grain"); - GLVAO grain_vao = gl_vao_new(program_grain, "grain"); - { - float h = 0.005f; - float S3 = 0.57735026919f; // sqrt(1/3) - UnlitVertex vertices[] = { - {0,h*.5f,0}, - {-h*S3,-h*.5f,0}, - {+h*S3,-h*.5f,0}, - {0,h*.5f,0}, - {0,-h*.5f,-h*S3}, - {0,-h*.5f,+h*S3}, - }; - gl_vbo_set_static_data(&grain_vbo, vertices, static_arr_len(vertices)); - gl_vao_add_data3f(&grain_vao, grain_vbo, "v_pos", UnlitVertex, pos); - } - - GLProgram update_program = {0}; + GLProgram update_program = {0}, grain_program = {0}; + const char *wind_formula = "y * y * tan(z), z * z, -x * x"; { const char *vshader_code = "attribute vec2 v_pos;\n" @@ -77,7 +60,8 @@ int main(int argc, char **argv) { " gl_Position = vec4(v_pos, 0.0, 1.0);\n" "}\n"; - const char *fshader_code = + static char fshader_code[65536]; + strbuf_print(fshader_code, "uniform sampler2D u_tex;\n" "uniform float u_dt;\n" "uniform int u_new_grains_per_second;\n" @@ -102,16 +86,18 @@ int main(int argc, char **argv) { " ivec2 src_pixel = ivec2(src_pixel_idx & 1023, src_pixel_idx >> 10);\n" " vec3 prev_pos = texelFetch(u_tex, src_pixel, 0).xyz;\n" " float x = prev_pos.x, y = prev_pos.y, z = prev_pos.z;\n" - " vec3 wind = vec3(-tan(y)*x, cos(z)*y, sin(z)*x);\n" + " vec3 wind = vec3(%s);\n" " vec3 new_pos = prev_pos + wind * u_dt;\n" " gl_FragColor = vec4(new_pos, 0.0);\n" " }\n" - "}\n"; + "}\n", + wind_formula + ); GLuint vshader = V_gl_shader_compile_code("updatev.glsl", NULL, vshader_code, GL_VERTEX_SHADER); GLuint fshader = V_gl_shader_compile_code("updatef.glsl", NULL, fshader_code, GL_FRAGMENT_SHADER); GLint status = 0; - GLuint prog = V_gl_text_shader.id = gl.CreateProgram(); + GLuint prog = gl.CreateProgram(); gl.AttachShader(prog, vshader); gl.AttachShader(prog, fshader); gl.LinkProgram(prog); @@ -122,6 +108,45 @@ int main(int argc, char **argv) { update_program.id = prog; } + f->color_speed_scale = 10; + { + const char *vshader_code = + "attribute vec3 v_pos;\n" + "uniform mat4 u_transform;\n" + "uniform sampler2D u_offset_tex;\n" + "varying vec3 pos;\n" + "void main() {\n" + " ivec2 texel_pos = ivec2(gl_InstanceID & 1023, gl_InstanceID >> 10);\n" + " vec3 offset = texelFetch(u_offset_tex, texel_pos, 0).xyz;\n" + " gl_Position = u_transform * vec4(v_pos + offset, 1.0);\n" + " pos = v_pos + offset;\n" + "}\n"; + static char fshader_code[65536]; + strbuf_print(fshader_code, + "uniform vec4 u_color1, u_color2;\n" + "varying vec3 pos;\n" + "void main() {\n" + " float x = pos.x, y = pos.y, z = pos.z;\n" + " float wind_speed = length(vec3(%s));\n" + " gl_FragColor = mix(u_color1, u_color2, clamp(wind_speed * %f, 0.0, 1.0));\n" + "}\n", + wind_formula, + f->color_speed_scale == 0 ? 1 : 1.0f / f->color_speed_scale + ); + GLuint vshader = V_gl_shader_compile_code("grainv.glsl", NULL, vshader_code, GL_VERTEX_SHADER); + GLuint fshader = V_gl_shader_compile_code("grainf.glsl", NULL, fshader_code, GL_FRAGMENT_SHADER); + GLint status = 0; + GLuint prog = gl.CreateProgram(); + gl.AttachShader(prog, vshader); + gl.AttachShader(prog, fshader); + gl.LinkProgram(prog); + gl.GetProgramiv(prog, GL_LINK_STATUS, &status); + gl.DetachShader(prog, vshader); + gl.DetachShader(prog, fshader); + assert(status); + grain_program.id = prog; + } + GLVBO update_vbo = gl_vbo_new(UpdateVertex, "update"); GLVAO update_vao = gl_vao_new(&update_program, "update"); @@ -138,6 +163,24 @@ int main(int argc, char **argv) { gl_vao_add_data2f(&update_vao, update_vbo, "v_pos", UpdateVertex, pos); } + GLVBO grain_vbo = gl_vbo_new(UnlitVertex, "grain"); + GLVAO grain_vao = gl_vao_new(&grain_program, "grain"); + { + float h = 0.005f; + float S3 = 0.57735026919f; // sqrt(1/3) + UnlitVertex vertices[] = { + {0,h*.5f,0}, + {-h*S3,-h*.5f,0}, + {+h*S3,-h*.5f,0}, + {0,h*.5f,0}, + {0,-h*.5f,-h*S3}, + {0,-h*.5f,+h*S3}, + }; + gl_vbo_set_static_data(&grain_vbo, vertices, static_arr_len(vertices)); + gl_vao_add_data3f(&grain_vao, grain_vbo, "v_pos", UnlitVertex, pos); + } + + window_set_relative_mouse(1); { @@ -146,10 +189,11 @@ int main(int argc, char **argv) { f->grains_tex1 = tex[0]; f->grains_tex2 = tex[1]; } - f->ngrains = 100000; - f->new_grains_per_second = 10000; + f->ngrains = 1000000; + f->new_grains_per_second = 1000; f->grain_gen_radius = 2; - f->color = Vec4(1.0f,0.8f,.6f,1); + f->color1 = Vec4(1.0f,0.8f,.6f,1); + f->color2 = Vec4(1.0f,0,0,1); const uint32_t tex_width = 1024; uint32_t tex_chunk_size = tex_width * 4; // height must be a multiple of 4 @@ -265,13 +309,14 @@ int main(int argc, char **argv) { vec3 p = player->pos; g_camera = mat4_camera(p, player->yaw, player->pitch, degree2rad(45), 1, 50); } - gl_program_use(program_grain); - gl_uniformM4(program_grain, "u_transform", &g_camera); - gl_uniform4f(program_grain, "u_color", f->color); + gl_program_use(&grain_program); + gl_uniformM4(&grain_program, "u_transform", &g_camera); + gl_uniform4f(&grain_program, "u_color1", f->color1); + gl_uniform4f(&grain_program, "u_color2", f->color2); gl.BindTexture(GL_TEXTURE_2D, f->grains_tex2); gl.ActiveTexture(GL_TEXTURE0); - gl_uniform1i(program_grain, "u_offset_tex", 0); + gl_uniform1i(&grain_program, "u_offset_tex", 0); gl.BindVertexArray(grain_vao.id); -- cgit v1.2.3