From 6d04b6eb116567af3b63c1e5a1acbdf057004e0d Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 23 Sep 2021 19:29:47 +0100 Subject: [PATCH] split/merge working with water --- fishladder.c | 60 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/fishladder.c b/fishladder.c index 27bea90..287a1ea 100644 --- a/fishladder.c +++ b/fishladder.c @@ -35,8 +35,10 @@ m3x3f m_mdl; #define FLAG_OUTPUT 0x2 #define FLAG_CANAL 0x4 #define FLAG_WALL 0x8 -#define FLAG_DROP 0x10 +#define FLAG_DROP_L 0x10 #define FLAG_SPLIT 0x20 +#define FLAG_MERGER 0x40 +#define FLAG_DROP_R 0x80 struct world { @@ -45,6 +47,7 @@ struct world u32 state; u8 water[2]; u8 config; + u8 water_dir; } *data; @@ -219,7 +222,14 @@ void vg_start(void) float quad_mesh[] = { 0.05f, 0.05f, 0.05f, 0.95f, 0.95f, 0.95f, - 0.05f, 0.05f, 0.95f, 0.95f, 0.95f, 0.05f + 0.05f, 0.05f, 0.95f, 0.95f, 0.95f, 0.05f, + + 0.48f, 0.48f, 0.5f, 0.52f, 0.52f, 0.52f, // Static dot + 0.375f, 0.25f, 0.5f, 0.75f, 0.625f, 0.25f, // Downwards pointing arrow + 0.25f, 0.625f, 0.75f, 0.5f, 0.25f, 0.375f, // Left + 0.625f, 0.75f, 0.5f, 0.25f, 0.375f, 0.75f, // up + 0.75f, 0.375f, 0.25f, 0.5f, 0.75f, 0.625f + }; glBindVertexArray( world.tile_vao ); @@ -399,7 +409,7 @@ void vg_update(void) } else config = 0xF; world.data[ y*world.w+x ].config = config; - world.data[ y*world.w+x ].state &= ~(FLAG_DROP|FLAG_SPLIT); + world.data[ y*world.w+x ].state &= ~(FLAG_DROP_L|FLAG_DROP_R|FLAG_SPLIT|FLAG_MERGER); } } @@ -412,14 +422,15 @@ void vg_update(void) u8 config = world.data[y*world.w+x].config; - if( config == 0x7 ) + if( config == 0x7 ) // splitter { - world.data[y*world.w+x ].state |= (FLAG_SPLIT | FLAG_DROP); + world.data[y*world.w+x ].state |= (FLAG_SPLIT | FLAG_DROP_L | FLAG_DROP_R); } else if( config == 0xD ) { - world.data[y*world.w+x-1].state |= FLAG_DROP; - world.data[y*world.w+x+1].state |= FLAG_DROP; + world.data[y*world.w+x-1].state |= FLAG_DROP_R; + world.data[y*world.w+x+1].state |= FLAG_DROP_L; + world.data[y*world.w+x].state |= FLAG_MERGER; } } @@ -502,7 +513,7 @@ void vg_update(void) { struct cell *cell = &world.data[y*world.w+x]; - if( cell->state & (FLAG_OUTPUT|FLAG_DROP) ) + if( cell->state & FLAG_OUTPUT ) cell->water[ buffer_next ] = 16; else { @@ -511,12 +522,31 @@ void vg_update(void) if( cell->state & FLAG_CANAL ) { - v2i dirs[] = {{1,0},{0,1},{-1,0},{0,-1}}; + v2i dirs[] = {{1,0},{-1,0},{0,-1}}; for( int i = 0; i < vg_list_size( dirs ); i ++ ) { struct cell *neighbour = &world.data[(y+dirs[i][1])*world.w+x+dirs[i][0]]; + // Non canals will be ignored + if( !(neighbour->state & (FLAG_CANAL|FLAG_OUTPUT)) ) + continue; + + // Only vertical pulls allowed on neighbour splitters + if( (neighbour->state & FLAG_SPLIT) && i != 2 ) + continue; + + // Only vertical pulls allowed for mergers + if( (cell->state & FLAG_MERGER) && i != 2 ) + continue; + + // Test for renewall cases if we have drop L/R check if i matches direction. + if( (((cell->state & FLAG_DROP_L)&&i==1) || ((cell->state & FLAG_DROP_R)&&i==0)) && neighbour->water[ buffer_id ] ) + { + cell->water[ buffer_next ] = 16; + has_source = 1; + } + else if( neighbour->water[ buffer_id ] > cell->water[ buffer_next ]+1 ) { has_source = 1; @@ -569,12 +599,20 @@ void vg_render(void) if( world.selected == y*world.w + x ) v3_muls( colour, sinf( vg_time )*0.25f + 0.5f, colour ); - if( cell->state & (FLAG_DROP|FLAG_SPLIT) ) - v4_copy( (v4f){ 0.75f, 0.75f, 0.02f, 1.0f }, colour ); + //if( cell->state & (FLAG_SPLIT) ) + // v4_copy( (v4f){ 0.75f, 0.75f, 0.02f, 1.0f }, colour ); + //if( cell->state & (FLAG_MERGER) ) + // v4_copy( (v4f){ 0.75f, 0.02f, 0.75f, 1.0f }, colour ); glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, colour ); glDrawArrays( GL_TRIANGLES, 0, 6 ); + + if( cell->state & FLAG_CANAL ) + { + glUniform4f( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1.0f, 1.0f, 1.0f, 1.0f ); + glDrawArrays( GL_TRIANGLES, 6, 3 ); + } } } } -- 2.25.1