From: hgn Date: Sat, 11 Dec 2021 22:28:00 +0000 (+0000) Subject: cleaned up wires X-Git-Url: https://harrygodden.com/git/?p=fishladder.git;a=commitdiff_plain;h=8916069446ede6f8dc2d198d88be851b8ba1baeb cleaned up wires --- diff --git a/fishladder.c b/fishladder.c index 71b714b..808a588 100644 --- a/fishladder.c +++ b/fishladder.c @@ -27,7 +27,7 @@ Particle system thing for ball collision Level descriptions / titles HALF Row Gridlines for I/O DONE - Play button / Speed controller ( play buttern, pause, speed control, step button ) + Play button / Speed controller PLAY/PAUSED.. todo: speed, wire connecty After release: @@ -107,27 +107,29 @@ static struct cell_description int is_special; int is_linear; + + v2f trigger_pos; } cell_descriptions[] = { // 0-3 {}, - { .start = { 1, 0 }, .end = { -1, 0 } }, - { .start = { 0, 1 }, .end = { 0, -1 } }, - { .start = { 0, 1 }, .end = { 1, 0 } }, + { .start = { 1, 0 }, .end = { -1, 0 }, .trigger_pos = { 0.5f, 0.25f } }, + { .start = { 0, 1 }, .end = { 0, -1 }, .trigger_pos = { 0.25f, 0.5f } }, + { .start = { 0, 1 }, .end = { 1, 0 }, .trigger_pos = { 0.25f, 0.25f } }, // 4-7 - { .start = { -1, 0 }, .end = { 1, 0 } }, - { .start = { -1, 0 }, .end = { 1, 0 }, .is_linear = 1 }, - { .start = { 0, 1 }, .end = { -1, 0 } }, + { .start = { -1, 0 }, .end = { 1, 0 }, .trigger_pos = { 0.5f, 0.25f } }, + { .start = { -1, 0 }, .end = { 1, 0 }, .trigger_pos = { 0.5f, 0.25f }, .is_linear = 1 }, + { .start = { 0, 1 }, .end = { -1, 0 }, .trigger_pos = { 0.5f, 0.25f } }, { .start = { 0, 1 }, .is_special = 1 }, // 8-11 - { .start = { 0, -1 }, .end = { 0, 1 } }, - { .start = { 1, 0 }, .end = { 0, -1 } }, - { .start = { 0, 1 }, .end = { 0, -1 }, .is_linear = 1 }, + { .start = { 0, -1 }, .end = { 0, 1 }, .trigger_pos = { 0.25f, 0.5f } }, + { .start = { 1, 0 }, .end = { 0, -1 }, .trigger_pos = { 0.25f, 0.75f } }, + { .start = { 0, 1 }, .end = { 0, -1 }, .trigger_pos = { 0.25f, 0.5f }, .is_linear = 1 }, { }, // 12-15 - { .start = { -1, 0 }, .end = { 0, -1 } }, - { .end = { 0, -1 }, .is_special = 1 }, + { .start = { -1, 0 }, .end = { 0, -1 }, .trigger_pos = { 0.75f, 0.75f } }, + { .end = { 0, -1 }, .is_special = 1, .trigger_pos = { 0.5f, 0.75f } }, { }, { } }; @@ -1188,7 +1190,7 @@ void vg_update(void) if( !is_simulation_running() && !gui_want_mouse() ) { v2_copy( vg_mouse_ws, world.drag_to_co ); - + if( cell_interactive( (v2i){ world.tile_x, world.tile_y } )) { world.selected = world.tile_y * world.w + world.tile_x; @@ -1223,16 +1225,38 @@ void vg_update(void) (v2i){ world.tile_x +2, world.tile_y +2 }, 1 ); } - if( vg_get_button_down("secondary") && !(cell_ptr->config == k_cell_type_split) ) + if( vg_get_button_down("secondary") && (cell_ptr->state & FLAG_CANAL) && !(cell_ptr->config == k_cell_type_split) ) { world.id_drag_from = world.selected; - world.drag_from_co[0] = world.tile_x + 0.5f; - world.drag_from_co[1] = world.tile_y + 0.5f; + + struct cell_description *desc = &cell_descriptions[ world.data[world.id_drag_from].config ]; + v2_add( desc->trigger_pos, (v2f){ world.tile_x, world.tile_y }, world.drag_from_co ); } - if( world.id_drag_from && (cell_ptr->config == k_cell_type_split) ) + float local_x = vg_mouse_ws[0] - (float)world.tile_x; + + if( vg_get_button_up("secondary") && world.id_drag_from == world.selected ) + { + u32 link_id = local_x > 0.5f? 1: 0; + + // break existing connection off + if( cell_ptr->links[ link_id ] ) + { + struct cell *current_connection = &world.data[ cell_ptr->links[ link_id ]]; + + if( !current_connection->links[ link_id ^ 0x1 ] ) + current_connection->state &= ~FLAG_TARGETED; + + current_connection->links[ link_id ] = 0; + cell_ptr->links[ link_id ] = 0; + } + + cell_ptr->state &= ~FLAG_IS_TRIGGER; + world.id_drag_from = 0; + } + + if( world.id_drag_from && (cell_ptr->state & FLAG_CANAL) && (cell_ptr->config == k_cell_type_split) ) { - float local_x = vg_mouse_ws[0] - (float)world.tile_x; world.drag_to_co[0] = (float)world.tile_x + (local_x > 0.5f? 0.75f: 0.25f); world.drag_to_co[1] = (float)world.tile_y + 0.25f; @@ -1848,6 +1872,7 @@ static void simulation_start(void) world.sim_delta_speed = 2.5f; world.sim_delta_ref = vg_time; world.sim_internal_ref = 0.0f; + world.sim_internal_time = 0.0f; world.pause_offset_target = 0.0f; world.sim_target = 0; @@ -1860,6 +1885,13 @@ static void simulation_start(void) static void wbutton_run( enum e_world_button btn_name ) { + static v3f button_colours[] = { + {0.204f, 0.345f, 0.553f}, + {0.204f, 0.345f, 0.553f}, + {0.741f, 0.513f, 0.078f}, + {1.0f, 0.0f, 0.0f} + }; + struct cell_button *btn = &world.buttons[btn_name]; // Interaction @@ -1876,9 +1908,11 @@ static void wbutton_run( enum e_world_button btn_name ) { btn->pressed = 1; simulation_start(); + + world.pause_offset_target = 0.5f; } - - world.pause_offset_target += 1.0f; + else + world.pause_offset_target += 1.0f; } else { @@ -1905,6 +1939,10 @@ static void wbutton_run( enum e_world_button btn_name ) else world.pause_offset_target = 0.0f; } + else + { + btn->pressed ^= 0x1; + } } // Drawing @@ -1932,13 +1970,19 @@ static void wbutton_run( enum e_world_button btn_name ) btn->light = vg_lerpf( btn->light, btn->light_target, vg_time_delta*26.0f ); + // Draw + + v4f final_colour; + v3_copy( button_colours[ btn_name ], final_colour ); + final_colour[3] = btn->light; + glUniform4f( SHADER_UNIFORM( shader_buttons, "uOffset" ), world.w-1, world.h-btn_name-2, (float)btn_name, 3.0f ); - glUniform4f( SHADER_UNIFORM( shader_buttons, "uColour" ), 0.204f, 0.345f, 0.553f, btn->light ); + glUniform4fv( SHADER_UNIFORM( shader_buttons, "uColour" ), 1, final_colour ); draw_mesh( 0, 2 ); } @@ -2121,6 +2165,7 @@ void vg_render(void) wbutton_run( k_world_button_sim ); wbutton_run( k_world_button_pause ); + //wbutton_run( k_world_button_wire_mode ); // WIRES // ======================================================================================================== @@ -2133,7 +2178,7 @@ void vg_render(void) glUniform4f( SHADER_UNIFORM( shader_wire, "uColour" ), 0.2f, 0.2f, 0.2f, 1.0f ); if( world.id_drag_from ) - { + { glUniform1f( SHADER_UNIFORM( shader_wire, "uCurve" ), 0.4f ); glUniform3f( SHADER_UNIFORM( shader_wire, "uStart" ), world.drag_from_co[0], world.drag_from_co[1], 0.06f ); glUniform3f( SHADER_UNIFORM( shader_wire, "uEnd" ), world.drag_to_co[0], world.drag_to_co[1], 0.06f ); @@ -2154,6 +2199,8 @@ void vg_render(void) { if( cell->state & FLAG_IS_TRIGGER ) { + struct cell_description *desc = &cell_descriptions[ cell->config ]; + int trigger_id = cell->links[0]?0:1; int x2 = cell->links[trigger_id] % world.w; @@ -2165,8 +2212,10 @@ void vg_render(void) startpoint[0] = (float)x2 + (trigger_id? 0.75f: 0.25f); startpoint[1] = (float)y2 + 0.25f; - endpoint[0] = x+0.5f; - endpoint[1] = y+0.5f; + endpoint[0] = x; + endpoint[1] = y; + + v2_add( desc->trigger_pos, endpoint, endpoint ); glUniform1f( SHADER_UNIFORM( shader_wire, "uCurve" ), cell->state & FLAG_TRIGGERED? rp_x2 * 0.4f: 0.4f ); glUniform3f( SHADER_UNIFORM( shader_wire, "uStart" ), startpoint[0], startpoint[1], 0.04f );