dead
[carveJwlIkooP6JGAAIwe30JlM.git] / player_audio.h
1 /*
2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
3 */
4
5 #ifndef PLAYER_AUDIO_H
6 #define PLAYER_AUDIO_H
7
8 #include "player.h"
9
10 /*
11 * Audio
12 */
13 VG_STATIC void player_audio(void)
14 {
15 #if 0
16 struct player_phys *phys = &player.phys;
17
18 static int _air = 0;
19
20 int l2 = _air;
21 _air = player_skate.activity == k_skate_activity_air;
22
23 static double last_revert = -2000.0;
24
25
26
27
28 audio_lock();
29
30 double revert_delta = vg.time - last_revert;
31 if( (phys->controller == k_player_controller_skate) &&
32 (!_air && l2) && (revert_delta > 0.7) &&
33 (player.air_time > 0.5f) )
34 {
35 audio_player_set_position( &audio_player_extra, phys->rb.co );
36 audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D );
37 audio_player_set_vol( &audio_player_extra, 2.0f );
38
39 if( (fabsf(phys->slip) > 0.75f) )
40 {
41 audio_player_playclip( &audio_player_extra, &audio_lands[rand()%2+3] );
42 }
43 else
44 {
45 audio_player_playclip( &audio_player_extra, &audio_lands[rand()%3] );
46 }
47
48 last_revert = vg.time;
49 }
50
51 static float air = 0.0f;
52 air = vg_lerpf( air, player_skate.activity == k_skate_activity_air,
53 5.0f*vg.time_delta );
54
55 /* Spacial info */
56 v3f ears = { 1.0f,0.0f,0.0f };
57 v3f delta;
58
59 float *cam = main_camera.transform[3],
60 *pos = phys->rb.co;
61
62 audio_player_set_position( &audio_player0, phys->rb.co );
63 audio_player_set_position( &audio_player1, phys->rb.co );
64 audio_player_set_position( &audio_player2, phys->rb.co );
65 audio_player_set_position( &audio_player4, phys->rb.co );
66 audio_player_set_position( &audio_player_gate, world.render_gate_pos );
67 audio_player_set_vol( &audio_player_gate, 5.0f );
68
69 v3_sub( phys->rb.co, main_camera.transform[3], delta );
70 v3_normalize( delta );
71 m3x3_mulv( main_camera.transform, ears, ears );
72
73 /* TODO, Make function */
74 v3_copy( ears, vg_audio.listener_ears );
75 v3_copy( main_camera.transform[3], vg_audio.listener_pos );
76
77 /* Tunnel / occlusion */
78 audio_sample_occlusion( main_camera.transform[3] );
79
80 int sprite_avail = -1;
81 for( int i=0; i<vg_list_size(ambient_sprites); i++ )
82 {
83 if( !audio_player_is_playing( &ambient_sprites[i] ) )
84 {
85 sprite_avail = i;
86 break;
87 }
88 }
89
90 if( sprite_avail != -1 )
91 {
92 v3f waterpos;
93 enum audio_sprite_type sprite_type =
94 audio_sample_sprite_random( phys->rb.co, waterpos );
95
96 if( sprite_type != k_audio_sprite_type_none )
97 {
98 audio_player *avail = &ambient_sprites[ sprite_avail ];
99
100 audio_player_set_vol( avail, 20.0f );
101 audio_player_set_flags( avail, AUDIO_FLAG_SPACIAL_3D );
102 audio_player_set_position( avail, waterpos );
103
104 if( sprite_type == k_audio_sprite_type_grass )
105 {
106 audio_player_playclip( avail, &audio_grass[rand()%4] );
107 }
108 else if( sprite_type == k_audio_sprite_type_water )
109 {
110 if( world.water.enabled )
111 audio_player_playclip( avail, &audio_water[rand()%6] );
112 }
113 }
114 }
115
116 if( freecam || player.is_dead ||
117 !(phys->controller != k_player_controller_skate))
118 {
119 audio_player_set_vol( &audio_player0, 0.0f );
120 audio_player_set_vol( &audio_player1, 0.0f );
121 audio_player_set_vol( &audio_player2, 0.0f );
122 audio_player_set_vol( &audio_player3, 0.0f );
123 audio_player_set_vol( &audio_player4, 0.0f );
124
125 int walk_phase = 0;
126 if( vg_fractf(player.walk_timer) > 0.5f )
127 walk_phase = 1;
128 else
129 walk_phase = 0;
130
131 if( (player.step_phase != walk_phase) &&
132 !(player_walk.activity == k_walk_activity_air) )
133 {
134 audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D );
135 audio_player_set_position( &audio_player_extra, phys->rb.co );
136 audio_player_set_vol( &audio_player_extra, 6.0f );
137
138 if( player.surface_prop == k_surface_prop_concrete )
139 {
140 audio_player_playclip(
141 &audio_player_extra,
142 &audio_footsteps[rand()%vg_list_size(audio_footsteps)]
143 );
144 }
145 else if( player.surface_prop == k_surface_prop_grass )
146 {
147 audio_player_playclip(
148 &audio_player_extra,
149 &audio_footsteps_grass[rand()%vg_list_size(audio_footsteps_grass)]
150 );
151 }
152 else if( player.surface_prop == k_surface_prop_wood )
153 {
154 audio_player_playclip(
155 &audio_player_extra,
156 &audio_footsteps_wood[rand()%vg_list_size(audio_footsteps_wood)]
157 );
158 }
159 }
160
161 player.step_phase = walk_phase;
162 }
163 else
164 {
165 /* Composite */
166 float speed = vg_minf(v3_length( phys->rb.v )*0.1f,1.0f),
167 attn = speed,
168 slide = vg_clampf( fabsf(phys->slip), 0.0f, 1.0f ),
169 grind = player_skate.activity == k_skate_activity_grind,
170 vol0 = (1.0f-air)*attn*(1.0f-slide)*(1.0f-grind),
171 vol1 = air *attn*(1.0f-grind),
172 vol2 = (1.0f-air)*attn*slide*(1.0f-grind),
173 vol4 = grind*2.0f;
174
175 audio_player_set_vol( &audio_player0, vol0*vg.time_rate );
176 audio_player_set_vol( &audio_player1, vol1*vg.time_rate );
177 audio_player_set_vol( &audio_player2, vol2*vg.time_rate );
178 audio_player_set_vol( &audio_player4, vol4*vg.time_rate );
179
180 float reverb_amt = vol0 * audio_occlusion_current * 0.5f;
181
182 audio_player_set_pan( &audio_player3, 0.0f );
183 audio_player_set_vol( &audio_player3, reverb_amt*vg.time_rate );
184 }
185
186 #if 0
187 world_audio_update( cam, ears );
188 #endif
189 audio_unlock();
190
191 if( player_skate.activity == k_skate_activity_air )
192 player.air_time += vg.time_delta;
193 else
194 player.air_time = 0.0f;
195 #endif
196 }
197
198 #endif /* PLAYER_AUDIO_H */