From: hgn Date: Wed, 20 Oct 2021 20:32:15 +0000 (+0100) Subject: switch to textured render X-Git-Url: https://harrygodden.com/git/?p=fishladder.git;a=commitdiff_plain;h=1a837016d9060eb0c2ed05a93b9d2a69d0005808 switch to textured render --- diff --git a/fishladder.c b/fishladder.c index 9e02a95..4e41b5a 100644 --- a/fishladder.c +++ b/fishladder.c @@ -27,6 +27,41 @@ SHADER_DEFINE( shader_tile_colour, UNIFORMS({ "uPv", "uOffset", "uColour" }) ) +SHADER_DEFINE( shader_ball, + // VERTEX + "layout (location=0) in vec2 a_co;" + "uniform vec2 uOffset;" + "uniform mat3 uPv;" + "" + "out vec2 aTexCoords;" + "" + "void main()" + "{" + // Create texture coords + "aTexCoords = a_co;" + + // Vertex transform + "vec3 worldpos = vec3( a_co * 0.25 - 0.125 + uOffset, 1.0 );" + "gl_Position = vec4( uPv * worldpos, 1.0 );" + "}", + + // FRAGMENT + "out vec4 FragColor;" + "" + "uniform sampler2D uTexMain;" + "uniform vec3 uColour;" + "" + "in vec2 aTexCoords;" + "" + "void main()" + "{" + "vec4 glyph = texture( uTexMain, aTexCoords );" + "FragColor = vec4( glyph.rgb * uColour, glyph.a );" + "}" + , + UNIFORMS({ "uTexMain", "uColour", "uOffset", "uPv" }) +) + SHADER_DEFINE( shader_tile_main, // VERTEX "layout (location=0) in vec2 a_co;" @@ -34,7 +69,7 @@ SHADER_DEFINE( shader_tile_main, "uniform mat3 uPv;" "uniform mat2 uSubTransform;" "" - "out vec4 aTexCoords;" + "out vec4 aTexCoords;" "" "vec2 hash22(vec2 p)" "{" @@ -141,6 +176,7 @@ const char *level_pack[] = GLuint tex_tile_data; GLuint tex_tile_detail; GLuint tex_wood; +GLuint tex_ball; m3x3f m_projection; m3x3f m_view; @@ -432,6 +468,7 @@ void vg_register(void) { SHADER_INIT( shader_tile_colour ); SHADER_INIT( shader_tile_main ); + SHADER_INIT( shader_ball ); } void vg_start(void) @@ -499,6 +536,11 @@ void vg_start(void) vg_tex2d_mipmap(); vg_tex2d_linear_mipmap(); vg_tex2d_repeat(); + + tex_ball = vg_tex2d_rgba( "textures/ball_metallic.png" ); + vg_tex2d_mipmap(); + vg_tex2d_linear_mipmap(); + vg_tex2d_clamp(); } map_load( level_pack[ 0 ] ); @@ -514,6 +556,7 @@ void vg_free(void) glDeleteTextures( 1, &tex_tile_data ); glDeleteTextures( 1, &tex_tile_detail ); glDeleteTextures( 1, &tex_wood ); + glDeleteTextures( 1, &tex_ball ); } static int cell_interactive( v2i co ) @@ -995,76 +1038,25 @@ void vg_render(void) } } - glDisable(GL_BLEND); - - SHADER_USE( shader_tile_colour ); - glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_colour, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); - use_mesh( &world.circle ); + //glDisable(GL_BLEND); - // Draw i/o arrays - for( int i = 0; i < arrlen( world.io ); i ++ ) - { - struct cell_terminal *term = &world.io[ i ]; - int posx = term->id % world.w; - int posy = (term->id - posx)/world.w; - int is_input = world.data[ term->id ].state & FLAG_INPUT; - - int const filled_start = 0; - int const filled_count = 32; - int const empty_start = 32; - int const empty_count = 32*2; - - v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f }; - - for( int j = 0; j < arrlen( term->conditions ); j ++ ) - { - glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), (float)posx + 0.2f + 0.2f * (float)j, (float)posy + 0.2f, 0.1f ); - - if( is_input ) - { - colour_code_v3( term->conditions[j], dot_colour ); - glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); - - // Draw filled if tick not passed, draw empty if empty - if( world.sim_frame > j ) - draw_mesh( empty_start, empty_count ); - else - draw_mesh( filled_start, filled_count ); - } - else - { - if( term->recv_count > j ) - { - colour_code_v3( term->recv[j], dot_colour ); - v3_muls( dot_colour, 0.8f, dot_colour ); - glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); - - draw_mesh( filled_start, filled_count ); - } - - colour_code_v3( term->conditions[j], dot_colour ); - glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); - - draw_mesh( empty_start, empty_count ); - } - } - } + SHADER_USE( shader_ball ); + glUniformMatrix3fv( SHADER_UNIFORM( shader_ball, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); + + glActiveTexture( GL_TEXTURE0 ); + glBindTexture( GL_TEXTURE_2D, tex_ball ); + glUniform1i( SHADER_UNIFORM( shader_ball, "uTexMain" ), 0 ); // Draw 'fish' if( world.simulating ) { - v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f }; - for( int i = 0; i < world.num_fishes; i ++ ) { struct fish *fish = &world.fishes[i]; if( !fish->alive ) continue; - - colour_code_v3( fish->payload, dot_colour ); - glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); - + // Evaluate position struct cell *cell = pcell(fish->pos); v2f fish_pos; @@ -1122,14 +1114,70 @@ void vg_render(void) fish_pos[1] = origin[1] + (float)fish->dir[1]*t; } - //vg_line_box( (v2f){fish->pos[0],fish->pos[1]}, - //(v2f){ (float)fish->pos[0]+1.0f, (float)fish->pos[1]+1.0f }, 0xffffffff ); + v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f }; + colour_code_v3( fish->payload, dot_colour ); - glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), fish_pos[0], fish_pos[1], 0.125f ); + glUniform3fv( SHADER_UNIFORM( shader_ball, "uColour" ), 1, dot_colour ); + glUniform2f( SHADER_UNIFORM( shader_ball, "uOffset" ), fish_pos[0], fish_pos[1] ); draw_mesh( 0, 32 ); } } + glDisable(GL_BLEND); + + SHADER_USE( shader_tile_colour ); + glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_colour, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); + use_mesh( &world.circle ); + + // Draw i/o arrays + for( int i = 0; i < arrlen( world.io ); i ++ ) + { + struct cell_terminal *term = &world.io[ i ]; + int posx = term->id % world.w; + int posy = (term->id - posx)/world.w; + int is_input = world.data[ term->id ].state & FLAG_INPUT; + + int const filled_start = 0; + int const filled_count = 32; + int const empty_start = 32; + int const empty_count = 32*2; + + v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f }; + + for( int j = 0; j < arrlen( term->conditions ); j ++ ) + { + glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), (float)posx + 0.2f + 0.2f * (float)j, (float)posy + 0.2f, 0.1f ); + + if( is_input ) + { + colour_code_v3( term->conditions[j], dot_colour ); + glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); + + // Draw filled if tick not passed, draw empty if empty + if( world.sim_frame > j ) + draw_mesh( empty_start, empty_count ); + else + draw_mesh( filled_start, filled_count ); + } + else + { + if( term->recv_count > j ) + { + colour_code_v3( term->recv[j], dot_colour ); + v3_muls( dot_colour, 0.8f, dot_colour ); + glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); + + draw_mesh( filled_start, filled_count ); + } + + colour_code_v3( term->conditions[j], dot_colour ); + glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); + + draw_mesh( empty_start, empty_count ); + } + } + } + if( world.simulating ) { glUniform4f( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 0.0f, 0.0f, 0.0f, 1.0f ); diff --git a/textures/ball_metallic.png b/textures/ball_metallic.png new file mode 100644 index 0000000..09fe6ec Binary files /dev/null and b/textures/ball_metallic.png differ diff --git a/textures/tileset.png b/textures/tileset.png index 1d905ab..973ebd7 100644 Binary files a/textures/tileset.png and b/textures/tileset.png differ