+static int world_button_exec( struct world_button *btn, v2f texture, v3f colour, enum world_button_status *status )
+{
+ static v2i click_grab = { -9999, -9999 };
+
+ // Reset click_grab
+ if( !btn )
+ {
+ click_grab[0] = -9999;
+ click_grab[1] = -9999;
+ return 0;
+ }
+
+ v2i click_tile = { world.tile_x, world.tile_y };
+
+ int triggered = 0;
+ int is_hovering = v2i_eq( click_tile, btn->position );
+
+ // Set up light targets before logic runs
+ if( btn->state )
+ btn->light_target = is_hovering? 0.9f: 0.8f;
+ else
+ btn->light_target = is_hovering? 0.2f: 0.0f;
+
+ if( vg_get_button( "primary" ) && is_hovering )
+ btn->light_target = 1.0f;
+
+ // Process click action
+ if( is_hovering )
+ {
+ if( vg_get_button_down( "primary" ) && is_hovering )
+ v2i_copy( click_tile, click_grab );
+ else if( v2i_eq( click_grab, click_tile ) && vg_get_button_up( "primary" ) )
+ {
+ // Click event
+ *status = btn->state? k_world_button_on_disable: k_world_button_on_enable;
+
+ if( btn->mode == k_world_button_mode_toggle )
+ btn->state ^= 0x1;
+
+ sfx_set_play( &audio_clicks, &audio_system_ui, btn->state? 1:0 );
+ triggered = 1;
+ }
+ }
+
+ // Drawing stage
+ v4f final_colour;
+
+ btn->light = vg_lerpf( btn->light, btn->light_target + btn->extra_light, vg_time_delta*26.0f );
+
+ v3_copy( colour, final_colour );
+ final_colour[3] = btn->light;
+
+ glUniform4f( SHADER_UNIFORM( shader_buttons, "uOffset" ),
+ btn->position[0],
+ btn->position[1],
+ texture[0],
+ texture[1]
+ );
+ glUniform4fv( SHADER_UNIFORM( shader_buttons, "uColour" ), 1, final_colour );
+ draw_mesh( 0, 2 );
+
+ return triggered;
+}
+
+/*