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