2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
13 VG_STATIC
void player_audio(void)
16 struct player_phys
*phys
= &player
.phys
;
21 _air
= player_skate
.activity
== k_skate_activity_air
;
23 static double last_revert
= -2000.0;
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
) )
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
);
39 if( (fabsf(phys
->slip
) > 0.75f
) )
41 audio_player_playclip( &audio_player_extra
, &audio_lands
[rand()%2+3] );
45 audio_player_playclip( &audio_player_extra
, &audio_lands
[rand()%3] );
48 last_revert
= vg
.time
;
51 static float air
= 0.0f
;
52 air
= vg_lerpf( air
, player_skate
.activity
== k_skate_activity_air
,
56 v3f ears
= { 1.0f
,0.0f
,0.0f
};
59 float *cam
= main_camera
.transform
[3],
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
);
69 v3_sub( phys
->rb
.co
, main_camera
.transform
[3], delta
);
70 v3_normalize( delta
);
71 m3x3_mulv( main_camera
.transform
, ears
, ears
);
73 /* TODO, Make function */
74 v3_copy( ears
, vg_audio
.listener_ears
);
75 v3_copy( main_camera
.transform
[3], vg_audio
.listener_pos
);
77 /* Tunnel / occlusion */
78 audio_sample_occlusion( main_camera
.transform
[3] );
80 int sprite_avail
= -1;
81 for( int i
=0; i
<vg_list_size(ambient_sprites
); i
++ )
83 if( !audio_player_is_playing( &ambient_sprites
[i
] ) )
90 if( sprite_avail
!= -1 )
93 enum audio_sprite_type sprite_type
=
94 audio_sample_sprite_random( phys
->rb
.co
, waterpos
);
96 if( sprite_type
!= k_audio_sprite_type_none
)
98 audio_player
*avail
= &ambient_sprites
[ sprite_avail
];
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
);
104 if( sprite_type
== k_audio_sprite_type_grass
)
106 audio_player_playclip( avail
, &audio_grass
[rand()%4] );
108 else if( sprite_type
== k_audio_sprite_type_water
)
110 if( world
.water
.enabled
)
111 audio_player_playclip( avail
, &audio_water
[rand()%6] );
116 if( freecam
|| player
.is_dead
||
117 !(phys
->controller
!= k_player_controller_skate
))
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
);
126 if( vg_fractf(player
.walk_timer
) > 0.5f
)
131 if( (player
.step_phase
!= walk_phase
) &&
132 !(player_walk
.activity
== k_walk_activity_air
) )
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
);
138 if( player
.surface_prop
== k_surface_prop_concrete
)
140 audio_player_playclip(
142 &audio_footsteps
[rand()%vg_list_size(audio_footsteps
)]
145 else if( player
.surface_prop
== k_surface_prop_grass
)
147 audio_player_playclip(
149 &audio_footsteps_grass
[rand()%vg_list_size(audio_footsteps_grass
)]
152 else if( player
.surface_prop
== k_surface_prop_wood
)
154 audio_player_playclip(
156 &audio_footsteps_wood
[rand()%vg_list_size(audio_footsteps_wood
)]
161 player
.step_phase
= walk_phase
;
166 float speed
= vg_minf(v3_length( phys
->rb
.v
)*0.1f
,1.0f
),
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
),
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
);
180 float reverb_amt
= vol0
* audio_occlusion_current
* 0.5f
;
182 audio_player_set_pan( &audio_player3
, 0.0f
);
183 audio_player_set_vol( &audio_player3
, reverb_amt
*vg
.time_rate
);
187 world_audio_update( cam
, ears
);
191 if( player_skate
.activity
== k_skate_activity_air
)
192 player
.air_time
+= vg
.time_delta
;
194 player
.air_time
= 0.0f
;
198 #endif /* PLAYER_AUDIO_H */