From: hgn Date: Sat, 24 Sep 2022 00:31:21 +0000 (+0100) Subject: stuff X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;ds=inline;h=5f4eb3866525724188461589485ac1aa50d08870;p=carveJwlIkooP6JGAAIwe30JlM.git stuff --- diff --git a/audio.h b/audio.h index 0572d6d..212ed9f 100644 --- a/audio.h +++ b/audio.h @@ -1,7 +1,10 @@ +#include "common.h" +static void audio_spacialize( sfx_system *sys, + v3f pos, v3f camera, v3f ears, float vol ); + #ifndef AUDIO_H #define AUDIO_H -#include "common.h" #include "world.h" static float audio_occlusion_current = 0.0f, @@ -9,8 +12,6 @@ static float audio_occlusion_current = 0.0f, static int k_audio_debug_soundscape = 0; -sfx_vol_control audio_vol_all = { .val = 1.0f, .name = "All" }; - sfx_set audio_board = { .sources = "sound/skate.ogg\0" @@ -85,6 +86,21 @@ static void audio_free(void) sfx_set_free( &audio_board ); } +static void audio_spacialize( sfx_system *sys, + v3f pos, v3f camera, v3f ears, float vol ) +{ + float attn = (v3_dist( pos, camera ) / vol) +1.0f; + + v3f delta; + v3_sub( pos, camera, delta ); + v3_normalize( delta ); + + float pan = v3_dot( ears, delta ); + + sys->vol = 1.0f/(attn*attn); + sys->pan = pan; +} + static void audio_sample_occlusion( v3f origin ) { float d = 0.0f, @@ -95,14 +111,7 @@ static void audio_sample_occlusion( v3f origin ) for( int i=0; i world_traffic.h */ #include "world_routes.h" #include "world_sfd.h" +#include "world_audio.h" #include "shaders/terrain.h" #include "shaders/sky.h" @@ -540,6 +541,7 @@ static void world_init(void) /* Other systems */ world_sfd_init(); + world_audio_init(); } static void world_update(void) diff --git a/world_audio.h b/world_audio.h new file mode 100644 index 0000000..e6ee331 --- /dev/null +++ b/world_audio.h @@ -0,0 +1,105 @@ +#ifndef WORLD_AUDIO_H +#define WORLD_AUDIO_H + +#include "common.h" +#include "audio.h" + +sfx_set audio_birds = +{ + .sources = "sound/bird0.ogg\0" + "sound/bird1.ogg\0" + "sound/bird2.ogg\0" +}; + +static float k_audio_random_freq = 1.0f/10.0f, + k_audio_random_hz = 1.0f; + +static double world_audio_last_tick = 0.0; + +static struct world_ambient_layer +{ + sfx_system sys; + v3f pos; +} +world_ambient_layers[8]; + +static void world_audio_init(void) +{ + sfx_set_init( &audio_birds, NULL ); + + vg_convar_push( (struct vg_convar){ + .name = "aud_random_freq", + .data = &k_audio_random_freq, + .data_type = k_convar_dtype_f32, + .opt_f32 = { .clamp = 0 }, + .persistent = 1 + }); + + for( int i=0; isys; + sys->vol = 1.0f; + sys->ch = 1; + sys->vol_src = &audio_vol_all; + sys->name = "ambient"; + sys->flags = SFX_FLAG_PERSISTENT; + } +} + +static void world_audio_spawn_random( v3f around ) +{ + for( int i=0; isys.is_playing ) + { + sfx_set_playrnd( &audio_birds, &layer->sys, 0, 3 ); + + v3f chance; + vg_rand_sphere( chance ); + v3_muladds( around, chance, 100.0f, layer->pos ); + + return; + } + } +} + +static void world_audio_update( v3f around, v3f ears ) +{ + if( world_audio_last_tick + (double)k_audio_random_hz < vg_time ) + { + world_audio_last_tick = vg_time; + + float chance = vg_randf(); + if( chance < k_audio_random_freq ) + { + world_audio_spawn_random( around ); + } + } + + /* Spacialize */ + for( int i=0; isys.is_playing ) + audio_spacialize( &layer->sys, layer->pos, around, ears, 30.0f ); + } +} + +static void world_audio_debug(void) +{ + for( int i=0; isys.is_playing ) + { + vg_line_pt3( layer->pos, 1.0f, 0xffff00ff ); + } + } +} + +#endif /* WORLD_AUDIO_H */