water splash
[carveJwlIkooP6JGAAIwe30JlM.git] / player_audio.h
1 #ifndef PLAYER_AUDIO_H
2 #define PLAYER_AUDIO_H
3
4 #include "player.h"
5
6 /*
7 * Audio
8 */
9 static void player_audio(void)
10 {
11 struct player_phys *phys = &player.phys;
12
13 static int _air = 0;
14
15 int l2 = _air;
16 _air = phys->in_air;
17
18 static double last_revert = -2000.0;
19
20
21
22
23 audio_lock();
24
25 double revert_delta = vg_time - last_revert;
26 if( phys->on_board && (!_air && l2) && (fabsf(phys->slip) > 0.5f) &&
27 (revert_delta > 0.7) )
28 {
29 audio_player_set_position( &audio_player_extra, phys->rb.co );
30 audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D );
31 audio_player_set_vol( &audio_player_extra, 2.0f );
32 audio_player_playclip( &audio_player_extra, &audio_lands[rand()%5] );
33
34 last_revert = vg_time;
35 }
36
37 static float air = 0.0f;
38 air = vg_lerpf(air, phys->in_air? 1.0f: 0.0f, 5.0f*ktimestep);
39
40 /* Spacial info */
41 v3f ears = { 1.0f,0.0f,0.0f };
42 v3f delta;
43
44 float *cam = player.camera[3],
45 *pos = phys->rb.co;
46
47 audio_player_set_position( &audio_player0, phys->rb.co );
48 audio_player_set_position( &audio_player1, phys->rb.co );
49 audio_player_set_position( &audio_player2, phys->rb.co );
50 audio_player_set_position( &audio_player_gate, world.render_gate_pos );
51
52 v3_sub( phys->rb.co, player.camera[3], delta );
53 v3_normalize( delta );
54 m3x3_mulv( player.camera, ears, ears );
55
56 /* TODO, Make function */
57 v3_copy( ears, vg_audio.listener_ears );
58 v3_copy( player.camera[3], vg_audio.listener_pos );
59
60 /* Tunnel / occlusion */
61 audio_sample_occlusion( player.camera[3] );
62
63 int sprite_avail = -1;
64 for( int i=0; i<vg_list_size(ambient_sprites); i++ )
65 {
66 if( !audio_player_is_playing( &ambient_sprites[i] ) )
67 {
68 sprite_avail = i;
69 break;
70 }
71 }
72
73 if( sprite_avail != -1 )
74 {
75 v3f waterpos;
76 enum audio_sprite_type sprite_type =
77 audio_sample_sprite_random( phys->rb.co, waterpos );
78
79 if( sprite_type != k_audio_sprite_type_none )
80 {
81 audio_player *avail = &ambient_sprites[ sprite_avail ];
82
83 audio_player_set_vol( avail, 20.0f );
84 audio_player_set_flags( avail, AUDIO_FLAG_SPACIAL_3D );
85 audio_player_set_position( avail, waterpos );
86
87 if( sprite_type == k_audio_sprite_type_grass )
88 {
89 audio_player_playclip( avail, &audio_grass[rand()%4] );
90 }
91 else if( sprite_type == k_audio_sprite_type_water )
92 {
93 audio_player_playclip( avail, &audio_water[rand()%6] );
94 }
95 }
96 }
97
98 if( freecam || player.is_dead || !phys->on_board )
99 {
100 audio_player_set_vol( &audio_player0, 0.0f );
101 audio_player_set_vol( &audio_player1, 0.0f );
102 audio_player_set_vol( &audio_player2, 0.0f );
103 audio_player_set_vol( &audio_player3, 0.0f );
104
105 int walk_phase = 0;
106 if( vg_fractf(player.walk_timer) > 0.5f )
107 walk_phase = 1;
108 else
109 walk_phase = 0;
110
111 if( (player.step_phase != walk_phase) && !phys->in_air )
112 {
113 audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D );
114 audio_player_set_position( &audio_player_extra, phys->rb.co );
115 audio_player_set_vol( &audio_player_extra, 6.0f );
116 audio_player_playclip( &audio_player_extra,
117 &audio_footsteps[rand()%4] );
118 }
119
120 player.step_phase = walk_phase;
121 }
122 else
123 {
124 /* Composite */
125 float speed = vg_minf(v3_length( phys->rb.v )*0.1f,1.0f),
126 attn = speed,
127 slide = vg_clampf( fabsf(phys->slip), 0.0f, 1.0f ),
128 vol0 = (1.0f-air)*attn*(1.0f-slide),
129 vol1 = air *attn,
130 vol2 = (1.0f-air)*attn*slide;
131
132 audio_player_set_vol( &audio_player0, vol0 );
133 audio_player_set_vol( &audio_player1, vol1 );
134 audio_player_set_vol( &audio_player2, vol2 );
135
136 float reverb_amt = vol0 * audio_occlusion_current * 0.5f;
137 audio_player_set_pan( &audio_player3, 0.0f );
138 audio_player_set_vol( &audio_player3, reverb_amt );
139 }
140
141 #if 0
142 world_audio_update( cam, ears );
143 #endif
144 audio_unlock();
145 }
146
147 #endif /* PLAYER_AUDIO_H */