Fix major overstep with last commit
[carveJwlIkooP6JGAAIwe30JlM.git] / player_audio.h
1 /*
2 * Copyright 2021-2022 (C) Mount0 Software, Harry Godden - All Rights Reserved
3 * -----------------------------------------------------------------------------
4 *
5 * Player audio
6 *
7 * -----------------------------------------------------------------------------
8 */
9
10 #ifndef PLAYER_AUDIO_H
11 #define PLAYER_AUDIO_H
12
13 #include "player.h"
14
15 /*
16 * Audio
17 */
18 static void player_audio(void)
19 {
20 struct player_phys *phys = &player.phys;
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 audio_player_set_position( &audio_player0, phys->rb.co );
57 audio_player_set_position( &audio_player1, phys->rb.co );
58 audio_player_set_position( &audio_player2, phys->rb.co );
59 audio_player_set_position( &audio_player_gate, world.render_gate_pos );
60 audio_player_set_vol( &audio_player_gate, 5.0f );
61
62 v3_sub( phys->rb.co, player.camera[3], delta );
63 v3_normalize( delta );
64 m3x3_mulv( player.camera, ears, ears );
65
66 /* TODO, Make function */
67 v3_copy( ears, vg_audio.listener_ears );
68 v3_copy( player.camera[3], vg_audio.listener_pos );
69
70 /* Tunnel / occlusion */
71 audio_sample_occlusion( player.camera[3] );
72
73 int sprite_avail = -1;
74 for( int i=0; i<vg_list_size(ambient_sprites); i++ )
75 {
76 if( !audio_player_is_playing( &ambient_sprites[i] ) )
77 {
78 sprite_avail = i;
79 break;
80 }
81 }
82
83 if( sprite_avail != -1 )
84 {
85 v3f waterpos;
86 enum audio_sprite_type sprite_type =
87 audio_sample_sprite_random( phys->rb.co, waterpos );
88
89 if( sprite_type != k_audio_sprite_type_none )
90 {
91 audio_player *avail = &ambient_sprites[ sprite_avail ];
92
93 audio_player_set_vol( avail, 20.0f );
94 audio_player_set_flags( avail, AUDIO_FLAG_SPACIAL_3D );
95 audio_player_set_position( avail, waterpos );
96
97 if( sprite_type == k_audio_sprite_type_grass )
98 {
99 audio_player_playclip( avail, &audio_grass[rand()%4] );
100 }
101 else if( sprite_type == k_audio_sprite_type_water )
102 {
103 audio_player_playclip( avail, &audio_water[rand()%6] );
104 }
105 }
106 }
107
108 if( freecam || player.is_dead || !phys->on_board )
109 {
110 audio_player_set_vol( &audio_player0, 0.0f );
111 audio_player_set_vol( &audio_player1, 0.0f );
112 audio_player_set_vol( &audio_player2, 0.0f );
113 audio_player_set_vol( &audio_player3, 0.0f );
114
115 int walk_phase = 0;
116 if( vg_fractf(player.walk_timer) > 0.5f )
117 walk_phase = 1;
118 else
119 walk_phase = 0;
120
121 if( (player.step_phase != walk_phase) && !phys->in_air )
122 {
123 audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D );
124 audio_player_set_position( &audio_player_extra, phys->rb.co );
125 audio_player_set_vol( &audio_player_extra, 6.0f );
126 audio_player_playclip( &audio_player_extra,
127 &audio_footsteps[rand()%4] );
128 }
129
130 player.step_phase = walk_phase;
131 }
132 else
133 {
134 /* Composite */
135 float speed = vg_minf(v3_length( phys->rb.v )*0.1f,1.0f),
136 attn = speed,
137 slide = vg_clampf( fabsf(phys->slip), 0.0f, 1.0f ),
138 vol0 = (1.0f-air)*attn*(1.0f-slide),
139 vol1 = air *attn,
140 vol2 = (1.0f-air)*attn*slide;
141
142 audio_player_set_vol( &audio_player0, vol0 );
143 audio_player_set_vol( &audio_player1, vol1 );
144 audio_player_set_vol( &audio_player2, vol2 );
145
146 float reverb_amt = vol0 * audio_occlusion_current * 0.5f;
147 audio_player_set_pan( &audio_player3, 0.0f );
148 audio_player_set_vol( &audio_player3, reverb_amt );
149 }
150
151 #if 0
152 world_audio_update( cam, ears );
153 #endif
154 audio_unlock();
155 }
156
157 #endif /* PLAYER_AUDIO_H */