X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=fishladder.c;h=ac1efcfc19045eec2175c81e72359e0385b43d3e;hb=75e990f8ee2499b86106a2634eb6f30db773cbc0;hp=eb86953ebe0d5ce3d90fb749d7ae99894d06477b;hpb=c27b61b1954588e9795ff046d76d8c888d05de15;p=fishladder.git diff --git a/fishladder.c b/fishladder.c index eb86953..ac1efcf 100644 --- a/fishladder.c +++ b/fishladder.c @@ -2,118 +2,7 @@ //#define VG_STEAM #include "vg/vg.h" - -SHADER_DEFINE( shader_tile_colour, - - // VERTEX - "layout (location=0) in vec2 a_co;" - "uniform mat3 uPv;" - "uniform vec3 uOffset;" - "" - "void main()" - "{" - "gl_Position = vec4( uPv * vec3( a_co * uOffset.z + uOffset.xy, 1.0 ), 1.0 );" - "}", - - // FRAGMENT - "out vec4 FragColor;" - "uniform vec4 uColour;" - "" - "void main()" - "{" - "FragColor = uColour;" - "}" - , - 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.5 - 0.25 + 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( uColour + glyph.rgb * 0.2, glyph.a );" - "}" - , - UNIFORMS({ "uTexMain", "uColour", "uOffset", "uPv" }) -) - -SHADER_DEFINE( shader_tile_main, - // VERTEX - "layout (location=0) in vec2 a_co;" - "uniform vec4 uOffset;" // Tile x/y, uv x/y - "uniform mat3 uPv;" - "uniform mat2 uSubTransform;" - "" - "out vec4 aTexCoords;" - "" - "vec2 hash22(vec2 p)" - "{" - "vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));" - "p3 += dot(p3, p3.yzx+33.33);" - "return fract((p3.xx+p3.yz)*p3.zy);" - "}" - "" - "void main()" - "{" - // Create texture coords - "vec2 random_offset = floor(hash22(uOffset.xy) * 4.0) * 0.25;" - "vec2 edge_safe_coords = a_co * 0.98 + 0.01;" - "aTexCoords = vec4((edge_safe_coords + uOffset.zw) * 0.25, edge_safe_coords * 0.25 + random_offset );" - - // Vertex transform - "vec2 subtransform = uSubTransform * (a_co-0.5) + 0.5;" - "vec3 worldpos = vec3( subtransform + uOffset.xy, 1.0 );" - "gl_Position = vec4( uPv * worldpos, 1.0 );" - "}", - - // FRAGMENT - "out vec4 FragColor;" - "" - "uniform sampler2D uTexGlyphs;" - "uniform sampler2D uTexWood;" - "" - "in vec4 aTexCoords;" - "" - "void main()" - "{" - "vec3 shadowing_colour = vec3( 0.93, 0.88536, 0.8184 );" - "vec4 glyph = texture( uTexGlyphs, aTexCoords.xy );" - "vec4 wood = texture( uTexWood, aTexCoords.zw );" - "vec4 wood_secondary = texture( uTexWood, aTexCoords.zw + 0.25 );" - "vec3 wood_comp = mix( wood_secondary.rgb * shadowing_colour, wood.rgb, clamp( glyph.b * 2.0 - 1.0, 0.0, 1.0 ) );" - - "vec3 shadows = mix( vec3( 0.85, 0.7344, 0.561 ), vec3(1.0,1.0,1.0), glyph.r );" - - "FragColor = vec4( wood_comp * shadows, glyph.b );" - "}" - , - UNIFORMS({ "uPv", "uOffset", "uTexGlyphs", "uTexWood", "uSubTransform" }) -) +#include "fishladder_resources.h" const char *level_pack[] = { @@ -173,35 +62,6 @@ const char *level_pack[] = "#############;\n" }; -GLuint tex_tile_data; -GLuint tex_tile_detail; -GLuint tex_wood; -GLuint tex_ball; - -sfx_system_t audio_system_sfx = -{ - .vol = 1.f, - .spd = 1.f, - .ch = 1, - .cur = 0, - .vol_src = &g_vol_sfx, - .flags = 0x00, - .fadeout = FADEOUT_LENGTH, - .name = "sfx" -}; - -sfx_set_t audio_tile_mod = -{ - .sources = "\ -sound/mod_01.ogg\0\ -sound/mod_02.ogg\0\ -sound/mod_03.ogg\0\ -sound/mod_04.ogg\0\ -sound/mod_05.ogg\0\ -sound/mod_06.ogg\0", - .flags = 0 -}; - m3x3f m_projection; m3x3f m_view; m3x3f m_mdl; @@ -326,7 +186,8 @@ struct world struct mesh tile, circle; - int selected; + int selected, tile_x, tile_y; + v2f tile_pos; struct fish { @@ -486,13 +347,6 @@ int main( int argc, char *argv[] ) vg_init( argc, argv, "Fish (Marbles Computer) Ladder Simulator 2022 | N,M: change level | SPACE: Test | LeftClick: Toggle tile" ); } -void vg_register(void) -{ - SHADER_INIT( shader_tile_colour ); - SHADER_INIT( shader_tile_main ); - SHADER_INIT( shader_ball ); -} - void vg_start(void) { // Quad mesh @@ -542,50 +396,19 @@ void vg_start(void) init_mesh( &world.circle, circle_mesh, vg_list_size( circle_mesh ) ); } - // Textures - { - tex_tile_detail = vg_tex2d_rgba( "textures/tile_overlays.png" ); - vg_tex2d_mipmap(); - vg_tex2d_linear_mipmap(); - vg_tex2d_repeat(); - - tex_tile_data = vg_tex2d_rgba( "textures/tileset.png" ); - vg_tex2d_mipmap(); - vg_tex2d_linear_mipmap(); - vg_tex2d_repeat(); - - tex_wood = vg_tex2d_rgba( "textures/wood.png" ); - vg_tex2d_mipmap(); - vg_tex2d_linear_mipmap(); - vg_tex2d_repeat(); - - tex_ball = vg_tex2d_rgba( "textures/ball.png" ); - vg_tex2d_mipmap(); - vg_tex2d_linear_mipmap(); - vg_tex2d_clamp(); - } - - // Audio - { - sfx_set_init( &audio_tile_mod, NULL ); - } + resource_load_main(); map_load( level_pack[ 0 ] ); } void vg_free(void) { + resource_free_main(); + free_mesh( &world.tile ); free_mesh( &world.circle ); map_free(); - - glDeleteTextures( 1, &tex_tile_data ); - glDeleteTextures( 1, &tex_tile_detail ); - glDeleteTextures( 1, &tex_wood ); - glDeleteTextures( 1, &tex_ball ); - - sfx_set_free( &audio_tile_mod ); } static int cell_interactive( v2i co ) @@ -746,19 +569,17 @@ void vg_update(void) vg_projection_update(); // Input stuff + v2_copy( vg_mouse_ws, world.tile_pos ); - v2f tile_pos; - v2_copy( vg_mouse_ws, tile_pos ); - - int tile_x = floorf( tile_pos[0] ); - int tile_y = floorf( tile_pos[1] ); + world.tile_x = floorf( world.tile_pos[0] ); + world.tile_y = floorf( world.tile_pos[1] ); // Tilemap editing if( !world.simulating ) { - if( cell_interactive( (v2i){ tile_x, tile_y } )) + if( cell_interactive( (v2i){ world.tile_x, world.tile_y } )) { - world.selected = tile_y * world.w + tile_x; + world.selected = world.tile_y * world.w + world.tile_x; if( vg_get_button_down("primary") ) { @@ -769,7 +590,8 @@ void vg_update(void) else sfx_set_playrnd( &audio_tile_mod, &audio_system_sfx, 0, 3 ); - map_reclassify( (v2i){ tile_x -2, tile_y -2 }, (v2i){ tile_x +2, tile_y +2 } ); + map_reclassify( (v2i){ world.tile_x -2, world.tile_y -2 }, + (v2i){ world.tile_x +2, world.tile_y +2 } ); } } else @@ -794,6 +616,8 @@ void vg_update(void) { vg_success( "Starting simulation!\n" ); + sfx_set_playrnd( &audio_rolls, &audio_system_balls_rolling, 0, 1 ); + world.simulating = 1; world.num_fishes = 0; world.sim_frame = 0; @@ -933,7 +757,10 @@ void vg_update(void) fish->alive = 0; else if( cell_entry->config == k_cell_type_split ) + { + sfx_set_playrnd( &audio_splitter, &audio_system_balls_important, 0, 1 ); cell_entry->state |= FLAG_FLIP_ROTATING; + } } world.sim_frame ++; @@ -941,11 +768,22 @@ void vg_update(void) } } -static void render_tiles(void) +static void render_tiles( v2i start, v2i end, v4f const regular_colour, v4f const selected_colour ) { - for( int y = 0; y < world.h; y ++ ) + v2i full_start = { 0,0 }; + v2i full_end = { world.w, world.h }; + + if( !start || !end ) { - for( int x = 0; x < world.w; x ++ ) + start = full_start; + end = full_end; + } + + glUniform4fv( SHADER_UNIFORM( shader_tile_main, "uColour" ), 1, regular_colour ); + + for( int y = start[1]; y < end[1]; y ++ ) + { + for( int x = start[0]; x < end[0]; x ++ ) { struct cell *cell = pcell((v2i){x,y}); int selected = world.selected == y*world.w + x; @@ -967,7 +805,14 @@ static void render_tiles(void) } glUniform4f( SHADER_UNIFORM( shader_tile_main, "uOffset" ), (float)x, (float)y, uv[0], uv[1] ); - draw_mesh( 0, 2 ); + if( selected ) + { + glUniform4fv( SHADER_UNIFORM( shader_tile_main, "uColour" ), 1, selected_colour ); + draw_mesh( 0, 2 ); + glUniform4fv( SHADER_UNIFORM( shader_tile_main, "uColour" ), 1, regular_colour ); + } + else + draw_mesh( 0, 2 ); } } } @@ -988,6 +833,9 @@ void vg_render(void) frame_lerp = scaled_time - (float)world.sim_frame; } + v4f const colour_default = {1.0f, 1.0f, 1.0f, 1.0f}; + v4f const colour_selected = {0.90f, 0.92f, 1.0f, 1.0f}; + v2f const curve_3[] = {{0.5f,1.0f},{0.5f,0.625f},{0.625f,0.5f},{1.0f,0.5f}}; v2f const curve_6[] = {{0.5f,1.0f},{0.5f,0.625f},{0.375f,0.5f},{0.0f,0.5f}}; v2f const curve_9[] = {{1.0f,0.5f},{0.625f,0.5f},{0.5f,0.375f},{0.5f,0.0f}}; @@ -1014,17 +862,16 @@ void vg_render(void) m2x2_identity( subtransform ); glUniformMatrix2fv( SHADER_UNIFORM( shader_tile_main, "uSubTransform" ), 1, GL_FALSE, (float *)subtransform ); glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_main, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); + glUniform1f( SHADER_UNIFORM( shader_tile_main, "uGhost" ), 0.0f ); // Bind textures - glActiveTexture( GL_TEXTURE0 ); - glBindTexture( GL_TEXTURE_2D, tex_tile_data ); + vg_tex2d_bind( &tex_tile_data, 0 ); glUniform1i( SHADER_UNIFORM( shader_tile_main, "uTexGlyphs" ), 0 ); - glActiveTexture( GL_TEXTURE1 ); - glBindTexture( GL_TEXTURE_2D, tex_wood ); + vg_tex2d_bind( &tex_wood, 1 ); glUniform1i( SHADER_UNIFORM( shader_tile_main, "uTexWood" ), 1 ); - render_tiles(); + render_tiles( NULL, NULL, colour_default, colour_default ); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -1033,8 +880,7 @@ void vg_render(void) 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 ); + vg_tex2d_bind( &tex_ball, 0 ); glUniform1i( SHADER_UNIFORM( shader_ball, "uTexMain" ), 0 ); // Draw 'fish' @@ -1117,15 +963,13 @@ void vg_render(void) SHADER_USE( shader_tile_main ); // Bind textures - glActiveTexture( GL_TEXTURE0 ); - glBindTexture( GL_TEXTURE_2D, tex_tile_data ); + vg_tex2d_bind( &tex_tile_data, 0 ); glUniform1i( SHADER_UNIFORM( shader_tile_main, "uTexGlyphs" ), 0 ); - glActiveTexture( GL_TEXTURE1 ); - glBindTexture( GL_TEXTURE_2D, tex_wood ); + vg_tex2d_bind( &tex_wood, 1 ); glUniform1i( SHADER_UNIFORM( shader_tile_main, "uTexWood" ), 1 ); - render_tiles(); + render_tiles( NULL, NULL, colour_default, colour_selected ); // Draw splitters @@ -1166,6 +1010,26 @@ void vg_render(void) } } + // Edit overlay + if( world.selected != -1 && !(world.data[ world.selected ].state & FLAG_CANAL) ) + { + v2i new_begin = { world.tile_x - 2, world.tile_y - 2 }; + v2i new_end = { world.tile_x + 2, world.tile_y + 2 }; + + world.data[ world.selected ].state ^= FLAG_CANAL; + map_reclassify( new_begin, new_end ); + + m2x2_identity( subtransform ); + glUniform1f( SHADER_UNIFORM( shader_tile_main, "uGhost" ), 1.0f ); + glUniformMatrix2fv( SHADER_UNIFORM( shader_tile_main, "uSubTransform" ), 1, GL_FALSE, (float *)subtransform ); + glUniform2fv( SHADER_UNIFORM( shader_tile_main, "uMousePos" ), 1, world.tile_pos ); + + render_tiles( new_begin, new_end, colour_default, colour_default ); + + world.data[ world.selected ].state ^= FLAG_CANAL; + map_reclassify( new_begin, new_end ); + } + //glDisable(GL_BLEND); glDisable(GL_BLEND);