2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
12 static float audio_occlusion_current
= 0.0f
,
13 k_audio_occlusion_rate
= 1.0f
;
15 static int k_audio_debug_soundscape
= 0;
17 audio_clip audio_board
[] =
19 {.path
="sound/skate.ogg", .source_mode
=k_audio_source_compressed
},
20 {.path
="sound/wheel.ogg", .source_mode
=k_audio_source_compressed
},
21 {.path
="sound/slide.ogg", .source_mode
=k_audio_source_compressed
},
22 {.path
="sound/reverb.ogg",.source_mode
=k_audio_source_compressed
}
25 audio_clip audio_splash
=
26 { .path
= "sound/splash.ogg", .source_mode
=k_audio_source_compressed
};
28 audio_clip audio_jumps
[] = {
29 { .path
= "sound/jump0.ogg", .source_mode
=k_audio_source_compressed
, },
30 { .path
= "sound/jump1.ogg", .source_mode
=k_audio_source_compressed
, },
33 audio_clip audio_footsteps
[] = {
34 {.path
= "sound/step_concrete0.ogg", .source_mode
=k_audio_source_compressed
,},
35 {.path
= "sound/step_concrete1.ogg", .source_mode
=k_audio_source_compressed
,},
36 {.path
= "sound/step_concrete2.ogg", .source_mode
=k_audio_source_compressed
,},
37 {.path
= "sound/step_concrete3.ogg", .source_mode
=k_audio_source_compressed
,}
40 audio_clip audio_lands
[] = {
41 { .path
= "sound/land0.ogg", .source_mode
=k_audio_source_compressed
},
42 { .path
= "sound/land1.ogg", .source_mode
=k_audio_source_compressed
},
43 { .path
= "sound/land2.ogg", .source_mode
=k_audio_source_compressed
},
44 { .path
= "sound/landsk0.ogg", .source_mode
=k_audio_source_compressed
},
45 { .path
= "sound/landsk1.ogg", .source_mode
=k_audio_source_compressed
},
46 { .path
= "sound/onto.ogg", .source_mode
=k_audio_source_compressed
},
47 { .path
= "sound/outo.ogg", .source_mode
=k_audio_source_compressed
},
50 audio_clip audio_water
[] = {
51 { .path
= "sound/wave0.ogg", .source_mode
=k_audio_source_compressed
},
52 { .path
= "sound/wave1.ogg", .source_mode
=k_audio_source_compressed
},
53 { .path
= "sound/wave2.ogg", .source_mode
=k_audio_source_compressed
},
54 { .path
= "sound/wave3.ogg", .source_mode
=k_audio_source_compressed
},
55 { .path
= "sound/wave4.ogg", .source_mode
=k_audio_source_compressed
},
56 { .path
= "sound/wave5.ogg", .source_mode
=k_audio_source_compressed
}
59 audio_clip audio_grass
[] = {
60 { .path
= "sound/grass0.ogg", .source_mode
=k_audio_source_compressed
},
61 { .path
= "sound/grass1.ogg", .source_mode
=k_audio_source_compressed
},
62 { .path
= "sound/grass2.ogg", .source_mode
=k_audio_source_compressed
},
63 { .path
= "sound/grass3.ogg", .source_mode
=k_audio_source_compressed
},
66 audio_clip audio_ambience
[] =
68 {.path
="sound/town_generic.ogg",
69 .source_mode
=k_audio_source_compressed
}
72 audio_clip audio_gate_pass
= {
73 .path
= "sound/gate_pass.ogg", .source_mode
=k_audio_source_compressed
76 audio_clip audio_gate_lap
= {
77 .path
= "sound/gate_lap.ogg", .source_mode
=k_audio_source_compressed
80 audio_clip audio_gate_ambient
= {
81 .path
= "sound/gate_ambient.ogg", .source_mode
=k_audio_source_compressed
84 audio_player ambient_player
=
89 audio_player audio_rewind_player
=
94 audio_clip audio_rewind
[] = {
95 { .path
= "sound/rewind_start.ogg", .source_mode
=k_audio_source_compressed
},
96 { .path
= "sound/rewind_end_1.5.ogg", .source_mode
=k_audio_source_compressed
},
97 { .path
= "sound/rewind_end_2.5.ogg", .source_mode
=k_audio_source_compressed
},
98 { .path
= "sound/rewind_end_6.5.ogg", .source_mode
=k_audio_source_compressed
},
99 { .path
= "sound/rewind_clack.ogg", .source_mode
=k_audio_source_compressed
},
102 audio_clip audio_ui
[] = {
103 { .path
= "sound/ui_click.ogg", .source_mode
=k_audio_source_compressed
},
104 { .path
= "sound/ui_ding.ogg", .source_mode
=k_audio_source_compressed
},
107 audio_player ambient_sprites
[4] =
109 { .name
= "Ambient Sprites 0" },
110 { .name
= "Ambient Sprites 1" },
111 { .name
= "Ambient Sprites 2" },
112 { .name
= "Ambient Sprites 3" },
115 audio_player audio_player0
=
120 audio_player audio_player1
=
125 audio_player audio_player2
=
130 audio_player audio_player3
=
135 audio_player audio_player_extra
=
140 audio_player audio_player_gate
=
145 static void audio_init(void)
147 audio_player_init( &audio_player0
);
148 audio_player_init( &audio_player1
);
149 audio_player_init( &audio_player2
);
150 audio_player_init( &audio_player3
);
151 audio_player_init( &audio_player_gate
);
152 audio_player_init( &ambient_player
);
153 audio_player_init( &ambient_sprites
[0] );
154 audio_player_init( &ambient_sprites
[1] );
155 audio_player_init( &ambient_sprites
[2] );
156 audio_player_init( &ambient_sprites
[3] );
157 audio_player_init( &audio_player_extra
);
158 audio_player_init( &audio_rewind_player
);
160 audio_clip_loadn( audio_board
, vg_list_size(audio_board
) );
161 audio_clip_loadn( audio_ambience
, vg_list_size(audio_ambience
) );
162 audio_clip_loadn( &audio_splash
, 1 );
163 audio_clip_loadn( &audio_gate_pass
, 1 );
164 audio_clip_loadn( &audio_gate_lap
, 1 );
165 audio_clip_loadn( &audio_gate_ambient
, 1 );
166 audio_clip_loadn( audio_jumps
, vg_list_size(audio_jumps
) );
167 audio_clip_loadn( audio_lands
, vg_list_size(audio_lands
) );
168 audio_clip_loadn( audio_water
, vg_list_size(audio_water
) );
169 audio_clip_loadn( audio_grass
, vg_list_size(audio_grass
) );
170 audio_clip_loadn( audio_footsteps
, vg_list_size(audio_footsteps
) );
171 audio_clip_loadn( audio_rewind
, vg_list_size(audio_rewind
) );
172 audio_clip_loadn( audio_ui
, vg_list_size(audio_ui
) );
175 u32 flags
= AUDIO_FLAG_LOOP
|AUDIO_FLAG_SPACIAL_3D
;
177 audio_player_set_flags( &audio_player0
, flags
);
178 audio_player_set_flags( &audio_player1
, flags
);
179 audio_player_set_flags( &audio_player2
, flags
);
180 audio_player_set_flags( &audio_player_gate
, flags
);
181 audio_player_set_flags( &audio_player3
, AUDIO_FLAG_LOOP
);
182 audio_player_set_flags( &ambient_player
, AUDIO_FLAG_LOOP
);
183 audio_player_set_flags( &ambient_sprites
[0], AUDIO_FLAG_SPACIAL_3D
);
184 audio_player_set_flags( &ambient_sprites
[1], AUDIO_FLAG_SPACIAL_3D
);
185 audio_player_set_flags( &ambient_sprites
[2], AUDIO_FLAG_SPACIAL_3D
);
186 audio_player_set_flags( &ambient_sprites
[3], AUDIO_FLAG_SPACIAL_3D
);
187 audio_player_set_vol( &ambient_player
, 1.0f
);
188 audio_player_set_vol( &audio_player_gate
, 0.0f
);
189 audio_player_set_vol( &audio_player_extra
, 1.0f
);
190 audio_player_set_vol( &audio_rewind_player
, 0.2f
);
191 audio_player_set_flags( &audio_rewind_player
, 0x00 );
193 audio_player_playclip( &audio_player0
, &audio_board
[0] );
194 audio_player_playclip( &audio_player1
, &audio_board
[1] );
195 audio_player_playclip( &audio_player2
, &audio_board
[2] );
196 audio_player_playclip( &audio_player3
, &audio_board
[3] );
197 audio_player_playclip( &ambient_player
, &audio_ambience
[0] );
198 audio_player_playclip( &audio_player_gate
, &audio_gate_ambient
);
202 vg_convar_push( (struct vg_convar
){
203 .name
= "aud_debug_soundscape",
204 .data
= &k_audio_debug_soundscape
,
205 .data_type
= k_convar_dtype_i32
,
206 .opt_i32
= { .min
=0, .max
=1, .clamp
=0 },
210 vg_convar_push( (struct vg_convar
){
211 .name
= "aud_occlusion_rate",
212 .data
= &k_audio_occlusion_rate
,
213 .data_type
= k_convar_dtype_f32
,
214 .opt_f32
= { .clamp
= 0 },
219 static void audio_free(void*_
)
222 vg_warn( "UNIMPLEMENTED: audio_free()\n" );
225 static void audio_sample_occlusion( v3f origin
)
228 sample_dist
= 880.0f
;
230 int sample_count
= 8;
236 for( int i
=0; i
<sample_count
; i
++ )
242 contact
.dist
= 15.0f
;
244 if( ray_world( origin
, dir
, &contact
) )
248 vg_line( origin
, contact
.pos
, 0xff0000ff );
249 vg_line_pt3( contact
.pos
, 0.1f
, 0xff0000ff );
252 vg_line( contact
.pos
, last
, 0xffffffff );
253 v3_copy( contact
.pos
, last
);
259 v3_muladds( origin
, dir
, sample_dist
, p1
);
260 vg_line( origin
, p1
, 0xffcccccc );
268 float occlusion
= 1.0f
- (d
* (1.0f
/(sample_dist
*(float)sample_count
))),
269 rate
= VG_TIMESTEP_FIXED
* k_audio_occlusion_rate
,
270 target
= powf( occlusion
, 6.0f
);
271 audio_occlusion_current
= vg_lerpf( audio_occlusion_current
, target
, rate
);
274 enum audio_sprite_type
276 k_audio_sprite_type_none
,
277 k_audio_sprite_type_grass
,
278 k_audio_sprite_type_water
282 * Trace out a random point, near the player to try and determine water areas
284 static enum audio_sprite_type
audio_sample_sprite_random( v3f origin
,
287 v3f chance
= { (vg_randf()-0.5f
) * 30.0f
,
289 (vg_randf()-0.5f
) * 30.0f
};
292 v3_add( chance
, origin
, pos
);
295 contact
.dist
= vg_minf( 16.0f
, pos
[1] );
298 if( ray_world( pos
, (v3f
){0.0f
,-1.0f
,0.0f
}, &contact
) )
300 if( ray_hit_is_ramp( &contact
) )
302 vg_line( pos
, contact
.pos
, 0xff0000ff );
303 vg_line_pt3( contact
.pos
, 0.3f
, 0xff0000ff );
304 return k_audio_sprite_type_none
;
307 v3_copy( contact
.pos
, output
);
308 return k_audio_sprite_type_grass
;
315 return k_audio_sprite_type_water
;
318 static void audio_debug_soundscapes(void)
320 if( !k_audio_debug_soundscape
) return;
323 snprintf( buf
, 31, "occlusion: %.5f", audio_occlusion_current
);
325 ui_global_ctx
.cursor
[0] = 450;
326 ui_global_ctx
.cursor
[1] = 10;
327 ui_global_ctx
.cursor
[2] = audio_occlusion_current
* 200.0f
;
328 ui_global_ctx
.cursor
[3] = 20;
330 gui_fill_rect( ui_global_ctx
.cursor
, 0x55cccccc );
331 gui_text( ui_global_ctx
.cursor
, buf
, 1, 0 );