X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_skate.c;h=2ebcee2448668cbdcd0152c5c5b98a537e414069;hb=4fa1c611e0af4c32cdcc891f8c511217a2762d65;hp=c6e5db6ab6c188cd3cc901301b751fa530829ecb;hpb=a1056ed8198f0f5be0e0f341da8bd49aa6c47198;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_skate.c b/player_skate.c index c6e5db6..2ebcee2 100644 --- a/player_skate.c +++ b/player_skate.c @@ -22,6 +22,20 @@ VG_STATIC void player__skate_bind( player_instance *player ) s->anim_grabs = skeleton_get_anim( sk, "grabs" ); } +VG_STATIC void player__skate_kill_audio( player_instance *player ) +{ + struct player_skate *s = &player->_skate; + + audio_lock(); + if( s->aud_main ) + s->aud_main = audio_channel_fadeout( s->aud_main, 0.1f ); + if( s->aud_air ) + s->aud_air = audio_channel_fadeout( s->aud_air, 0.1f ); + if( s->aud_slide ) + s->aud_slide = audio_channel_fadeout( s->aud_slide, 0.1f ); + audio_unlock(); +} + /* * Collision detection routines * @@ -380,15 +394,18 @@ void player__approximate_best_trajectory( player_instance *player ) v3_copy( launch_v, p->v ); + m3x3f basis; + m3x3_copy( player->basis, basis ); + for( int i=1; i<=50; i++ ) { float t = (float)i * k_trace_delta; v3_muls( launch_v, t, co1 ); - v3_muladds( co1, player->basis[1], -0.5f * gravity * t*t, co1 ); + v3_muladds( co1, basis[1], -0.5f * gravity * t*t, co1 ); v3_add( launch_co, co1, co1 ); - float launch_vy = v3_dot( launch_v,player->basis[1] ); + float launch_vy = v3_dot( launch_v,basis[1] ); if( !grind_located && (launch_vy - gravity*t < 0.0f) ) { v3f closest; @@ -396,15 +413,15 @@ void player__approximate_best_trajectory( player_instance *player ) { v3f ve; v3_copy( launch_v, ve ); - v3_muladds( ve, player->basis[1], -gravity * t, ve ); + v3_muladds( ve, basis[1], -gravity * t, ve ); if( skate_grind_scansq( player, closest, ve, 0.5f, &grind ) ) { /* check alignment */ - v2f v0 = { v3_dot( ve, player->basis[0] ), - v3_dot( ve, player->basis[2] ) }, - v1 = { v3_dot( grind.dir, player->basis[0] ), - v3_dot( grind.dir, player->basis[2] ) }; + v2f v0 = { v3_dot( ve, basis[0] ), + v3_dot( ve, basis[2] ) }, + v1 = { v3_dot( grind.dir, basis[0] ), + v3_dot( grind.dir, basis[2] ) }; v2_normalize( v0 ); v2_normalize( v1 ); @@ -419,6 +436,17 @@ void player__approximate_best_trajectory( player_instance *player ) } } + if( world->rendering_gate ){ + ent_gate *gate = world->rendering_gate; + if( gate_intersect( gate, co1, co0 ) ){ + m4x3_mulv( gate->transport, co0, co0 ); + m4x3_mulv( gate->transport, co1, co1 ); + m3x3_mulv( gate->transport, launch_v, launch_v); + m4x3_mulv( gate->transport, launch_co, launch_co ); + m3x3_mul( gate->transport, basis, basis ); + } + } + float t1; v3f n; @@ -636,6 +664,7 @@ VG_STATIC void skate_apply_trick_model( player_instance *player ) if( (v3_length2(s->state.trick_vel) >= 0.0001f ) && s->state.trick_time > 0.2f) { + player__skate_kill_audio( player ); player__dead_transition( player ); } @@ -967,6 +996,7 @@ VG_STATIC void player__skate_pre_update( player_instance *player ) angles[2] = 0.0f; player->holdout_time = 0.25f; + player__skate_kill_audio( player ); player__walk_transition( player, angles ); return; } @@ -2065,6 +2095,7 @@ begin_collision:; v3_lerp( start_co, player->rb.co, t, player->rb.co ); rb_update_transform( &player->rb ); + player__skate_kill_audio( player ); player__dead_transition( player ); return; }