stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / world_audio.h
1 #ifndef WORLD_AUDIO_H
2 #define WORLD_AUDIO_H
3
4 #include "common.h"
5 #include "audio.h"
6
7 sfx_set audio_birds =
8 {
9 .sources = "sound/bird0.ogg\0"
10 "sound/bird1.ogg\0"
11 "sound/bird2.ogg\0"
12 };
13
14 static float k_audio_random_freq = 1.0f/10.0f,
15 k_audio_random_hz = 1.0f;
16
17 static double world_audio_last_tick = 0.0;
18
19 static struct world_ambient_layer
20 {
21 sfx_system sys;
22 v3f pos;
23 }
24 world_ambient_layers[8];
25
26 static void world_audio_init(void)
27 {
28 sfx_set_init( &audio_birds, NULL );
29
30 vg_convar_push( (struct vg_convar){
31 .name = "aud_random_freq",
32 .data = &k_audio_random_freq,
33 .data_type = k_convar_dtype_f32,
34 .opt_f32 = { .clamp = 0 },
35 .persistent = 1
36 });
37
38 for( int i=0; i<vg_list_size(world_ambient_layers); i++ )
39 {
40 struct world_ambient_layer *layer = &world_ambient_layers[i];
41 sfx_system *sys = &layer->sys;
42 sys->vol = 1.0f;
43 sys->ch = 1;
44 sys->vol_src = &audio_vol_all;
45 sys->name = "ambient";
46 sys->flags = SFX_FLAG_PERSISTENT;
47 }
48 }
49
50 static void world_audio_spawn_random( v3f around )
51 {
52 for( int i=0; i<vg_list_size(world_ambient_layers); i++ )
53 {
54 struct world_ambient_layer *layer = &world_ambient_layers[i];
55
56 if( !layer->sys.is_playing )
57 {
58 sfx_set_playrnd( &audio_birds, &layer->sys, 0, 3 );
59
60 v3f chance;
61 vg_rand_sphere( chance );
62 v3_muladds( around, chance, 100.0f, layer->pos );
63
64 return;
65 }
66 }
67 }
68
69 static void world_audio_update( v3f around, v3f ears )
70 {
71 if( world_audio_last_tick + (double)k_audio_random_hz < vg_time )
72 {
73 world_audio_last_tick = vg_time;
74
75 float chance = vg_randf();
76 if( chance < k_audio_random_freq )
77 {
78 world_audio_spawn_random( around );
79 }
80 }
81
82 /* Spacialize */
83 for( int i=0; i<vg_list_size(world_ambient_layers); i++ )
84 {
85 struct world_ambient_layer *layer = &world_ambient_layers[i];
86
87 if( layer->sys.is_playing )
88 audio_spacialize( &layer->sys, layer->pos, around, ears, 30.0f );
89 }
90 }
91
92 static void world_audio_debug(void)
93 {
94 for( int i=0; i<vg_list_size(world_ambient_layers); i++ )
95 {
96 struct world_ambient_layer *layer = &world_ambient_layers[i];
97
98 if( layer->sys.is_playing )
99 {
100 vg_line_pt3( layer->pos, 1.0f, 0xffff00ff );
101 }
102 }
103 }
104
105 #endif /* WORLD_AUDIO_H */