#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
{
u32 state;
u8 water[2];
u8 config;
+ u8 water_dir;
}
*data;
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 );
} 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);
}
}
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;
}
}
{
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
{
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;
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 );
+ }
}
}
}