move audio comp to its own thing
authorhgn <hgodden00@gmail.com>
Tue, 19 Dec 2023 08:02:36 +0000 (08:02 +0000)
committerhgn <hgodden00@gmail.com>
Tue, 19 Dec 2023 08:44:11 +0000 (08:44 +0000)
player.c
player.h
player_render.c
player_skate.c
player_skate.h

index 498b27e81c8a3561a3b3058cbeb907182d0ca6a7..c019f698484881551872ff89a171ecedfb1314de 100644 (file)
--- a/player.c
+++ b/player.c
@@ -115,8 +115,10 @@ static void player__update(void){
 }
 
 static void player__post_update(void){
-   if( player_subsystems[ localplayer.subsystem ]->post_update )
-      player_subsystems[ localplayer.subsystem ]->post_update();
+   struct player_subsystem_interface *sys = 
+      player_subsystems[ localplayer.subsystem ];
+
+   if( sys->post_update ) sys->post_update();
 
    SDL_AtomicLock( &air_data.sl );
    air_data.speed = v3_length( localplayer.rb.v ) * vg.time_rate;
index 8379becbff57e275eee712ae341c61f913ce2e5d..e1b44fe1104a3fc87cb6da6ebc372a7f74833be3 100644 (file)
--- a/player.h
+++ b/player.h
@@ -50,6 +50,9 @@ struct player_subsystem_interface{
    void(*network_animator_exchange)( bitpack_ctx *ctx, void *data );
    void(*sfx_oneshot)( u8 id, v3f pos, f32 volume );
 
+   void(*sfx_comp)(void *animator);
+   void(*sfx_kill)(void);
+
    void *animator_data;
    u32 animator_size;
 
index e1c065f272222a25e93e6ef9e30e3f47f71b0b4d..6174155351ef8486297f2e158bf31e29adbdd3e4 100644 (file)
@@ -275,6 +275,9 @@ static void player__animate(void){
    if( sys->post_animate )
       sys->post_animate();
 
+   if( sys->sfx_comp )
+      sys->sfx_comp( sys->animator_data );
+
    player__cam_iterate();
 }
 
@@ -313,17 +316,18 @@ static void player__animate_from_replay( replay_buffer *replay ){
    if( frame ){
       next = frame->r;
 
+      struct player_subsystem_interface 
+         *sys0 = player_subsystems[frame->system];
+      void *a0 = replay_frame_data( frame, k_replay_framedata_animator );
+
       if( next ){
          f32 t = replay_subframe_time( replay );
 
          player_pose pose0, pose1;
 
          struct player_subsystem_interface 
-            *sys0 = player_subsystems[frame->system],
             *sys1 = player_subsystems[next->system];
-
-         void *a0 = replay_frame_data( frame, k_replay_framedata_animator ), 
-              *a1 = replay_frame_data( next, k_replay_framedata_animator );
+         void *a1 = replay_frame_data( next, k_replay_framedata_animator );
 
          sys0->pose( a0, &pose0 );
          sys1->pose( a1, &pose1 );
@@ -331,11 +335,11 @@ static void player__animate_from_replay( replay_buffer *replay ){
          lerp_player_pose( &pose0, &pose1, t, &localplayer.pose );
       }
       else{
-         struct player_subsystem_interface 
-            *sys = player_subsystems[frame->system];
-         sys->pose( replay_frame_data( frame, k_replay_framedata_animator ), 
-                     &localplayer.pose );
+         sys0->pose( a0, &localplayer.pose );
       }
+
+      if( sys0->sfx_comp ) 
+         sys0->sfx_comp( a0 );
    }
    else return;
 
index 91265ceb3ec1bfbde17725b4eb2c0b607d71ff04..4fa21edccde8d7f5ae6f17f324726d781ce8a1e0 100644 (file)
@@ -1262,45 +1262,29 @@ static void player__skate_pre_update(void){
       state->trick_type = k_trick_type_none;
 }
 
-static void player__skate_post_update(void){
-   struct player_skate_state *state = &player_skate.state;
-
-   for( int i=0; i<player_skate.possible_jump_count; i++ ){
-      jump_info *jump = &player_skate.possible_jumps[i];
-
-      if( jump->log_length == 0 ){
-         vg_fatal_error( "assert: jump->log_length == 0\n" );
-      }
-      
-      for( int j=0; j<jump->log_length - 1; j ++ ){
-         float brightness = jump->score*jump->score*jump->score;
-         v3f p1;
-         v3_lerp( jump->log[j], jump->log[j+1], brightness, p1 );
-         vg_line( jump->log[j], p1, jump->colour );
-      }
-
-      vg_line_cross( jump->log[jump->log_length-1], jump->colour, 0.25f );
-
-      v3f p1;
-      v3_add( jump->log[jump->log_length-1], jump->n, p1 );
-      vg_line( jump->log[jump->log_length-1], p1, 0xffffffff );
-
-      vg_line_point( jump->apex, 0.02f, 0xffffffff );
-   }
-
+static void player__skate_comp_audio( void *_animator ){
+   struct player_skate_animator *animator = _animator;
    audio_lock();
 
-   float air   = ((state->activity <= k_skate_activity_air_to_grind) ||
-                  (state->activity == k_skate_activity_handplant))? 1.0f: 0.0f,
-         speed = v3_length( localplayer.rb.v ),
-         attn  = vg_minf( 1.0f, speed*0.1f ),
-         slide = vg_clampf( fabsf(state->slip), 0.0f, 1.0f );
+   f32 air   = ((animator->activity <= k_skate_activity_air_to_grind) ||
+                (animator->activity == k_skate_activity_handplant))? 1.0f: 0.0f,
+       speed = v3_length( animator->root_v ),
+       attn  = vg_minf( 1.0f, speed*0.1f ),
+       slide = animator->slide;
 
-   if( state->activity >= k_skate_activity_grind_any ){
+   if( animator->activity >= k_skate_activity_grind_any )
       slide = 0.0f;
+
+   f32 gate = skaterift.time_rate;
+
+   if( skaterift.activity == k_skaterift_replay ){
+      if( skaterift.replay_control == k_replay_control_play )
+         gate = 1.0f;
+      else
+         gate = vg_minf( 1.0f, fabsf(skaterift.track_velocity) );
    }
 
-   f32 gate        = skaterift.time_rate,
+   f32
        vol_main    = sqrtf( (1.0f-air)*attn*(1.0f-slide) * 0.4f ) * gate,
        vol_air     = sqrtf(       air *attn * 0.5f )              * gate,
        vol_slide   = sqrtf( (1.0f-air)*attn*slide * 0.25f )       * gate;
@@ -1325,8 +1309,8 @@ static void player__skate_post_update(void){
    float sidechain_amt = 0.0f,
          hz            = vg_maxf( speed * 2.0f, 2.0f );
 
-   if( (player_skate.surface == k_surface_prop_tiles) &&
-       (state->activity < k_skate_activity_grind_any) )
+   if( (animator->surface == k_surface_prop_tiles) &&
+       (animator->activity < k_skate_activity_grind_any) )
       sidechain_amt = 1.0f;
    else
       sidechain_amt = 0.0f;
@@ -1341,29 +1325,33 @@ static void player__skate_post_update(void){
    else{
       int sample_type = k_skate_sample_concrete;
 
-      if( state->activity == k_skate_activity_grind_5050 ){
-         if( player_skate.surface == k_surface_prop_metal )
+      if( animator->activity == k_skate_activity_grind_5050 ){
+         if( animator->surface == k_surface_prop_metal )
             sample_type = k_skate_sample_metal_scrape_generic;
          else
             sample_type = k_skate_sample_concrete_scrape_metal;
       }
-      else if( (state->activity == k_skate_activity_grind_back50) ||
-               (state->activity == k_skate_activity_grind_front50) )
+      else if( (animator->activity == k_skate_activity_grind_back50) ||
+               (animator->activity == k_skate_activity_grind_front50) )
       {
-         if( player_skate.surface == k_surface_prop_metal ){
+         if( animator->surface == k_surface_prop_metal ){
             sample_type = k_skate_sample_metal_scrape_generic;
          }
          else{
+#if 0
             float a = v3_dot( localplayer.rb.to_world[2], 
                               player_skate.grind_dir );
             if( fabsf(a) > 0.70710678118654752f )
                sample_type = k_skate_sample_concrete_scrape_wood;
             else 
                sample_type = k_skate_sample_concrete_scrape_metal;
+#endif
+
+            sample_type = k_skate_sample_concrete_scrape_wood;
          }
       }
-      else if( state->activity == k_skate_activity_grind_boardslide ){
-         if( player_skate.surface == k_surface_prop_metal )
+      else if( animator->activity == k_skate_activity_grind_boardslide ){
+         if( animator->surface == k_surface_prop_metal )
             sample_type = k_skate_sample_metal_scrape_generic;
          else
             sample_type = k_skate_sample_concrete_scrape_wood;
@@ -1392,7 +1380,7 @@ static void player__skate_post_update(void){
    if( player_skate.aud_main ){
       player_skate.aud_main->colour = 0x00103efe;
       audio_channel_set_spacial( player_skate.aud_main, 
-                                 localplayer.rb.co, 40.0f );
+                                 animator->root_co, 40.0f );
       //audio_channel_slope_volume( player_skate.aud_main, 0.05f, vol_main );
       audio_channel_edit_volume( player_skate.aud_main, vol_main, 1 );
       audio_channel_sidechain_lfo( player_skate.aud_main, 0, sidechain_amt );
@@ -1404,7 +1392,7 @@ static void player__skate_post_update(void){
    if( player_skate.aud_slide ){
       player_skate.aud_slide->colour = 0x00103efe;
       audio_channel_set_spacial( player_skate.aud_slide, 
-                                 localplayer.rb.co, 40.0f );
+                                 animator->root_co, 40.0f );
       //audio_channel_slope_volume( player_skate.aud_slide, 0.05f, vol_slide );
       audio_channel_edit_volume( player_skate.aud_slide, vol_slide, 1 );
       audio_channel_sidechain_lfo( player_skate.aud_slide, 0, sidechain_amt );
@@ -1413,7 +1401,7 @@ static void player__skate_post_update(void){
    if( player_skate.aud_air ){
       player_skate.aud_air->colour = 0x00103efe;
       audio_channel_set_spacial( player_skate.aud_air, 
-                                 localplayer.rb.co, 40.0f );
+                                 animator->root_co, 40.0f );
       //audio_channel_slope_volume( player_skate.aud_air, 0.05f, vol_air );
       audio_channel_edit_volume( player_skate.aud_air, vol_air, 1 );
    }
@@ -1421,6 +1409,33 @@ static void player__skate_post_update(void){
    audio_unlock();
 }
 
+static void player__skate_post_update(void){
+   struct player_skate_state *state = &player_skate.state;
+
+   for( int i=0; i<player_skate.possible_jump_count; i++ ){
+      jump_info *jump = &player_skate.possible_jumps[i];
+
+      if( jump->log_length == 0 ){
+         vg_fatal_error( "assert: jump->log_length == 0\n" );
+      }
+      
+      for( int j=0; j<jump->log_length - 1; j ++ ){
+         float brightness = jump->score*jump->score*jump->score;
+         v3f p1;
+         v3_lerp( jump->log[j], jump->log[j+1], brightness, p1 );
+         vg_line( jump->log[j], p1, jump->colour );
+      }
+
+      vg_line_cross( jump->log[jump->log_length-1], jump->colour, 0.25f );
+
+      v3f p1;
+      v3_add( jump->log[jump->log_length-1], jump->n, p1 );
+      vg_line( jump->log[jump->log_length-1], p1, 0xffffffff );
+
+      vg_line_point( jump->apex, 0.02f, 0xffffffff );
+   }
+}
+
 /*
  * truck alignment model at ra(local)
  * returns 1 if valid surface:
@@ -2896,6 +2911,7 @@ static void player__skate_animate(void){
    animator->grind_balance = vg_lerpf( animator->grind_balance, grind_frame, 
                                 5.0f*vg.time_delta );
    animator->activity = state->activity;
+   animator->surface = player_skate.surface;
 
    /* pushing */
    animator->push_time = vg.time - state->start_push;
index 269e552cfff54d3340bc1cfbff949a85c6938ad0..4118fd63f8552b8c8647c69225772db21d744a7b 100644 (file)
@@ -131,8 +131,8 @@ struct player_skate{
        * on activity. */
       f32 push_time, jump_time, handplant_t;
       u8 jump_dir;
-      u8 trick_type;
-      u8 activity;
+      u8 trick_type; /* todo: should encode grind type */
+      u8 activity, surface;
    }
    animator;
 
@@ -319,6 +319,8 @@ static void player__skate_sfx_oneshot  ( u8 id, v3f pos, f32 volume );
 static void player__skate_clear_mechanics(void);
 static void player__skate_reset_animator(void);
 static void player__approximate_best_trajectory(void);
+static void player__skate_comp_audio( void *animator );
+static void player__skate_kill_audio(void);
 
 struct player_subsystem_interface static player_subsystem_skate = {
    .system_register = player__skate_register,
@@ -333,6 +335,8 @@ struct player_subsystem_interface static player_subsystem_skate = {
    .post_animate = player__skate_post_animate,
    .network_animator_exchange = player__skate_animator_exchange,
    .sfx_oneshot = player__skate_sfx_oneshot,
+   .sfx_comp = player__skate_comp_audio,
+   .sfx_kill = player__skate_kill_audio,
 
    .animator_data = &player_skate.animator,
    .animator_size = sizeof(player_skate.animator),