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
, },
31 { .path
= "sound/jump2.ogg", .source_mode
=k_audio_source_compressed
, },
32 { .path
= "sound/jump3.ogg", .source_mode
=k_audio_source_compressed
, }
35 audio_clip audio_footsteps
[] = {
36 {.path
= "sound/step_concrete0.ogg", .source_mode
=k_audio_source_compressed
,},
37 {.path
= "sound/step_concrete1.ogg", .source_mode
=k_audio_source_compressed
,},
38 {.path
= "sound/step_concrete2.ogg", .source_mode
=k_audio_source_compressed
,},
39 {.path
= "sound/step_concrete3.ogg", .source_mode
=k_audio_source_compressed
,}
42 audio_clip audio_lands
[] = {
43 { .path
= "sound/revert0.ogg", .source_mode
=k_audio_source_compressed
},
44 { .path
= "sound/revert1.ogg", .source_mode
=k_audio_source_compressed
},
45 { .path
= "sound/revert2.ogg", .source_mode
=k_audio_source_compressed
},
46 { .path
= "sound/revert3.ogg", .source_mode
=k_audio_source_compressed
},
47 { .path
= "sound/revert4.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 ambient_sprites
[4] =
91 { .name
= "Ambient Sprites 0" },
92 { .name
= "Ambient Sprites 1" },
93 { .name
= "Ambient Sprites 2" },
94 { .name
= "Ambient Sprites 3" },
97 audio_player audio_player0
=
102 audio_player audio_player1
=
107 audio_player audio_player2
=
112 audio_player audio_player3
=
117 audio_player audio_player_extra
=
122 audio_player audio_player_gate
=
127 static void audio_init(void)
129 audio_player_init( &audio_player0
);
130 audio_player_init( &audio_player1
);
131 audio_player_init( &audio_player2
);
132 audio_player_init( &audio_player3
);
133 audio_player_init( &audio_player_gate
);
134 audio_player_init( &ambient_player
);
135 audio_player_init( &ambient_sprites
[0] );
136 audio_player_init( &ambient_sprites
[1] );
137 audio_player_init( &ambient_sprites
[2] );
138 audio_player_init( &ambient_sprites
[3] );
139 audio_player_init( &audio_player_extra
);
141 audio_clip_loadn( audio_board
, vg_list_size(audio_board
) );
142 audio_clip_loadn( audio_ambience
, vg_list_size(audio_ambience
) );
143 audio_clip_loadn( &audio_splash
, 1 );
144 audio_clip_loadn( &audio_gate_pass
, 1 );
145 audio_clip_loadn( &audio_gate_lap
, 1 );
146 audio_clip_loadn( &audio_gate_ambient
, 1 );
147 audio_clip_loadn( audio_jumps
, vg_list_size(audio_jumps
) );
148 audio_clip_loadn( audio_lands
, vg_list_size(audio_lands
) );
149 audio_clip_loadn( audio_water
, vg_list_size(audio_water
) );
150 audio_clip_loadn( audio_grass
, vg_list_size(audio_grass
) );
151 audio_clip_loadn( audio_footsteps
, vg_list_size(audio_footsteps
) );
154 u32 flags
= AUDIO_FLAG_LOOP
|AUDIO_FLAG_SPACIAL_3D
;
156 audio_player_set_flags( &audio_player0
, flags
);
157 audio_player_set_flags( &audio_player1
, flags
);
158 audio_player_set_flags( &audio_player2
, flags
);
159 audio_player_set_flags( &audio_player_gate
, flags
);
160 audio_player_set_flags( &audio_player3
, AUDIO_FLAG_LOOP
);
161 audio_player_set_flags( &ambient_player
, AUDIO_FLAG_LOOP
);
162 audio_player_set_flags( &ambient_sprites
[0], AUDIO_FLAG_SPACIAL_3D
);
163 audio_player_set_flags( &ambient_sprites
[1], AUDIO_FLAG_SPACIAL_3D
);
164 audio_player_set_flags( &ambient_sprites
[2], AUDIO_FLAG_SPACIAL_3D
);
165 audio_player_set_flags( &ambient_sprites
[3], AUDIO_FLAG_SPACIAL_3D
);
166 audio_player_set_vol( &ambient_player
, 1.0f
);
167 audio_player_set_vol( &audio_player_gate
, 0.0f
);
168 audio_player_set_vol( &audio_player_extra
, 1.0f
);
170 audio_player_playclip( &audio_player0
, &audio_board
[0] );
171 audio_player_playclip( &audio_player1
, &audio_board
[1] );
172 audio_player_playclip( &audio_player2
, &audio_board
[2] );
173 audio_player_playclip( &audio_player3
, &audio_board
[3] );
174 audio_player_playclip( &ambient_player
, &audio_ambience
[0] );
175 audio_player_playclip( &audio_player_gate
, &audio_gate_ambient
);
179 vg_convar_push( (struct vg_convar
){
180 .name
= "aud_debug_soundscape",
181 .data
= &k_audio_debug_soundscape
,
182 .data_type
= k_convar_dtype_i32
,
183 .opt_i32
= { .min
=0, .max
=1, .clamp
=0 },
187 vg_convar_push( (struct vg_convar
){
188 .name
= "aud_occlusion_rate",
189 .data
= &k_audio_occlusion_rate
,
190 .data_type
= k_convar_dtype_f32
,
191 .opt_f32
= { .clamp
= 0 },
196 static void audio_free(void*_
)
199 vg_warn( "UNIMPLEMENTED: audio_free()\n" );
202 static void audio_sample_occlusion( v3f origin
)
205 sample_dist
= 880.0f
;
207 int sample_count
= 8;
213 for( int i
=0; i
<sample_count
; i
++ )
219 contact
.dist
= 15.0f
;
221 if( ray_world( origin
, dir
, &contact
) )
225 vg_line( origin
, contact
.pos
, 0xff0000ff );
226 vg_line_pt3( contact
.pos
, 0.1f
, 0xff0000ff );
229 vg_line( contact
.pos
, last
, 0xffffffff );
230 v3_copy( contact
.pos
, last
);
236 v3_muladds( origin
, dir
, sample_dist
, p1
);
237 vg_line( origin
, p1
, 0xffcccccc );
245 float occlusion
= 1.0f
- (d
* (1.0f
/(sample_dist
*(float)sample_count
))),
246 rate
= ktimestep
* k_audio_occlusion_rate
,
247 target
= powf( occlusion
, 6.0f
);
248 audio_occlusion_current
= vg_lerpf( audio_occlusion_current
, target
, rate
);
251 enum audio_sprite_type
253 k_audio_sprite_type_none
,
254 k_audio_sprite_type_grass
,
255 k_audio_sprite_type_water
259 * Trace out a random point, near the player to try and determine water areas
261 static enum audio_sprite_type
audio_sample_sprite_random( v3f origin
,
264 v3f chance
= { (vg_randf()-0.5f
) * 30.0f
,
266 (vg_randf()-0.5f
) * 30.0f
};
269 v3_add( chance
, origin
, pos
);
272 contact
.dist
= vg_minf( 16.0f
, pos
[1] );
275 if( ray_world( pos
, (v3f
){0.0f
,-1.0f
,0.0f
}, &contact
) )
277 if( ray_hit_is_ramp( &contact
) )
279 vg_line( pos
, contact
.pos
, 0xff0000ff );
280 vg_line_pt3( contact
.pos
, 0.3f
, 0xff0000ff );
281 return k_audio_sprite_type_none
;
284 v3_copy( contact
.pos
, output
);
285 return k_audio_sprite_type_grass
;
292 return k_audio_sprite_type_water
;
295 static void audio_debug_soundscapes(void)
297 if( !k_audio_debug_soundscape
) return;
300 snprintf( buf
, 31, "occlusion: %.5f", audio_occlusion_current
);
302 ui_global_ctx
.cursor
[0] = 450;
303 ui_global_ctx
.cursor
[1] = 10;
304 ui_global_ctx
.cursor
[2] = audio_occlusion_current
* 200.0f
;
305 ui_global_ctx
.cursor
[3] = 20;
307 gui_fill_rect( ui_global_ctx
.cursor
, 0x55cccccc );
308 gui_text( ui_global_ctx
.cursor
, buf
, 1, 0 );