more comprehensive audio visualizer
[fishladder.git] / vg / vg_debug.h
1 static void sfx_internal_debug_overlay(void)
2 {
3 // Grab values
4 struct sound_info
5 {
6 float signal;
7 const char *name;
8 u32 cursor, flags;
9
10 u32 buffer_length, clip_start, clip_end;
11 }
12 infos[ SFX_MAX_SYSTEMS ];
13 int num_systems;
14
15 MUTEX_LOCK( sfx_mux_t01 );
16
17 num_systems = sfx_sys_len;
18
19 for( int i = 0; i < sfx_sys_len; i ++ )
20 {
21 sfx_system *sys = sfx_sys + i;
22 struct sound_info *snd = &infos[ i ];
23
24 snd->signal = sys->signal_average;
25 snd->name = sys->name;
26 snd->cursor = sys->cur;
27 snd->flags = sys->flags;
28
29 if( sys->thread_clone )
30 {
31 snd->clip_start = sys->thread_clone->clip_start;
32 snd->clip_end = sys->thread_clone->clip_end;
33 snd->buffer_length = sys->thread_clone->buffer_length;
34 }
35 else
36 {
37 snd->clip_start = 0;
38 snd->clip_end = sys->end;
39 snd->buffer_length = sys->end;
40 }
41 }
42
43 MUTEX_UNLOCK( sfx_mux_t01 );
44
45 // UI part
46 // ========
47
48 ui_begin( &ui_global_ctx, vg_window_x, vg_window_y );
49
50 // TODO: Find a more elegent form for this
51 int mouse_state = 0;
52 if( vg_get_button( "primary" ) ) mouse_state = 2;
53 if( vg_get_button_down( "primary" ) ) mouse_state = 1;
54 if( vg_get_button_up( "primary" ) ) mouse_state = 3;
55
56 ui_set_mouse( &ui_global_ctx, vg_mouse[0], vg_mouse[1], mouse_state );
57
58 // Draw audio stack
59 for( int i = 0; i < num_systems; i ++ )
60 {
61 ui_global_ctx.cursor[2] = 150;
62 ui_global_ctx.cursor[3] = 12;
63
64 u32 alpha = (infos[i].flags & SFX_FLAG_GHOST)? 0x44000000: 0xff000000;
65
66 ui_new_node( &ui_global_ctx );
67 {
68 ui_fill_rect( &ui_global_ctx, ui_global_ctx.cursor, 0x00333333 | alpha );
69
70 ui_px baseline = ui_global_ctx.cursor[0];
71 ui_px width_block_1 = (ui_px)(((float)infos[i].clip_start / (float)infos[i].buffer_length) * 150.0f);
72 ui_px width_block_2 = (ui_px)(((float)(infos[i].buffer_length-infos[i].clip_end) / (float)infos[i].buffer_length) * 150.0f );
73
74 ui_global_ctx.cursor[2] = width_block_1;
75 ui_fill_rect( &ui_global_ctx, ui_global_ctx.cursor, 0x77ffffff );
76
77 ui_global_ctx.cursor[2] = width_block_2;
78 ui_align_right( &ui_global_ctx );
79 ui_fill_rect( &ui_global_ctx, ui_global_ctx.cursor, 0x77ffffff );
80
81 // Cursor
82
83 ui_global_ctx.cursor[2] = 2;
84 ui_global_ctx.cursor[0] = baseline + (ui_px)(((float)infos[i].cursor / (float)infos[i].buffer_length) * 150.0f);
85 ui_fill_rect( &ui_global_ctx, ui_global_ctx.cursor, 0xffffffff );
86
87 ui_global_ctx.cursor[0] = baseline + 2;
88 ui_global_ctx.cursor[1] += 2;
89 ui_text( &ui_global_ctx, infos[i].name, 1, 0 );
90 }
91 ui_end_down( &ui_global_ctx );
92 ui_global_ctx.cursor[1] += 1;
93 }
94
95 ui_resolve( &ui_global_ctx );
96
97 m3x3f view = M3X3_IDENTITY;
98 m3x3_translate( view, (v3f){ -1.0f, 1.0f, 0.0f } );
99 m3x3_scale( view, (v3f){ 1.0f/((float)vg_window_x*0.5f), -1.0f/((float)vg_window_y*0.5f), 1.0f } );
100 vg_lines_drawall( (float*)view );
101
102 ui_draw( &ui_global_ctx );
103 }