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