+static void sfx_internal_debug_overlay(void)
+{
+ // Grab values
+ struct sound_info
+ {
+ float signal;
+ const char *name;
+ u32 length, cursor, flags;
+ }
+ infos[ SFX_MAX_SYSTEMS ];
+ int num_systems;
+
+ MUTEX_LOCK( sfx_mux_t01 );
+
+ num_systems = sfx_sys_len;
+
+ for( int i = 0; i < sfx_sys_len; i ++ )
+ {
+ sfx_system *sys = sfx_sys + i;
+ struct sound_info *snd = &infos[ i ];
+
+ snd->signal = sys->signal_average;
+ snd->name = sys->name;
+ snd->length = sys->end;
+ snd->cursor = sys->cur;
+ snd->flags = sys->flags;
+ }
+
+ MUTEX_UNLOCK( sfx_mux_t01 );
+
+ // UI part
+ // ========
+
+ ui_begin( &ui_global_ctx, vg_window_x, vg_window_y );
+
+ // TODO: Find a more elegent form for this
+ int mouse_state = 0;
+ if( vg_get_button( "primary" ) ) mouse_state = 2;
+ if( vg_get_button_down( "primary" ) ) mouse_state = 1;
+ if( vg_get_button_up( "primary" ) ) mouse_state = 3;
+
+ ui_set_mouse( &ui_global_ctx, vg_mouse[0], vg_mouse[1], mouse_state );
+
+ // Draw audio stack
+ for( int i = 0; i < num_systems; i ++ )
+ {
+ ui_global_ctx.cursor[2] = 300;
+ ui_global_ctx.cursor[3] = 25;
+
+ u32 alpha = (infos[i].flags & SFX_FLAG_GHOST)? 0x44000000: 0xff000000;
+
+ ui_new_node( &ui_global_ctx );
+ {
+ ui_fill_rect( &ui_global_ctx, ui_global_ctx.cursor, 0x00333333 | alpha );
+
+ ui_global_ctx.cursor[2] = (int)(((float)infos[i].cursor / (float)infos[i].length) * 300.0f);
+ ui_fill_rect( &ui_global_ctx, ui_global_ctx.cursor, 0x77ffffff );
+
+ ui_text( &ui_global_ctx, infos[i].name, 2, 0 );
+ }
+ ui_end_down( &ui_global_ctx );
+ ui_global_ctx.cursor[1] += 1;
+ }
+
+ ui_resolve( &ui_global_ctx );
+
+ m3x3f view = M3X3_IDENTITY;
+ m3x3_translate( view, (v3f){ -1.0f, 1.0f, 0.0f } );
+ m3x3_scale( view, (v3f){ 1.0f/((float)vg_window_x*0.5f), -1.0f/((float)vg_window_y*0.5f), 1.0f } );
+ vg_lines_drawall( (float*)view );
+
+ ui_draw( &ui_global_ctx );
+}