X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_skate.c;h=e9a4f09f4b01cbaca4857b4b0e95c897f82218c4;hb=6b9993651343af73bd48e2213910bbaadb41edaf;hp=bec54539ecd625135513fd136df79ad731a8f117;hpb=eb203257efcfe324217de9e733cc6c1371b99de6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_skate.c b/player_skate.c index bec5453..e9a4f09 100644 --- a/player_skate.c +++ b/player_skate.c @@ -4,6 +4,7 @@ #include "player.h" #include "audio.h" #include "vg/vg_perlin.h" +#include "menu.h" VG_STATIC void player__skate_bind( player_instance *player ) { @@ -127,10 +128,8 @@ VG_STATIC int skate_grind_scansq( player_instance *player, v3f tri[3]; struct world_surface *surf = world_tri_index_surface(world,ptri[0]); -#if 0 if( !(surf->info.flags & k_material_flag_skate_surface) ) continue; -#endif for( int j=0; j<3; j++ ) v3_copy( world->scene_geo->arrvertices[ptri[j]].co, tri[j] ); @@ -348,7 +347,7 @@ VG_STATIC int create_jumps_to_hit_target( player_instance *player, VG_STATIC void player__approximate_best_trajectory( player_instance *player ) { - world_instance *world = get_active_world(); + world_instance *world0 = get_active_world(); struct player_skate *s = &player->_skate; float k_trace_delta = k_rb_delta * 10.0f; @@ -393,6 +392,7 @@ void player__approximate_best_trajectory( player_instance *player ) v3_copy( player->rb.co, launch_co ); v3_copy( player->rb.v, launch_v ); v3_copy( launch_co, co0 ); + world_instance *trace_world = world0; float vt = (float)m * (1.0f/30.0f), ang = vg_lerpf( angle_begin, angle_end, vt ) * 0.15f; @@ -430,10 +430,9 @@ void player__approximate_best_trajectory( player_instance *player ) /* REFACTOR */ - v3f closest; + v3f closest={0.0f,0.0f,0.0f}; if( search_for_grind ){ - if( bh_closest_point( world->geo_bh, co1, closest, 1.0f ) != -1 ){ - + if( bh_closest_point(trace_world->geo_bh,co1,closest,1.0f) != -1 ){ float min_dist = 0.75f; min_dist *= min_dist; @@ -492,14 +491,18 @@ void player__approximate_best_trajectory( player_instance *player ) } } - if( world->rendering_gate ){ - ent_gate *gate = world->rendering_gate; + if( trace_world->rendering_gate ){ + ent_gate *gate = trace_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 ); + + if( gate->type == k_gate_type_nonlocel ){ + trace_world = &world_global.worlds[ gate->target ]; + } } } @@ -509,15 +512,16 @@ void player__approximate_best_trajectory( player_instance *player ) float scan_radius = k_board_radius; scan_radius *= vg_clampf( t, 0.02f, 1.0f ); - int idx = spherecast_world( world, co0, co1, scan_radius, &t1, n ); + int idx = spherecast_world(trace_world, co0, co1, scan_radius, &t1, n); if( idx != -1 ){ v3f co; v3_lerp( co0, co1, t1, co ); v3_copy( co, inf->log[ inf->log_length ++ ] ); v3_copy( n, inf->n ); - u32 *tri = &world->scene_geo->arrindices[ idx*3 ]; - struct world_surface *surf = world_tri_index_surface(world, tri[0]); + u32 *tri = &trace_world->scene_geo->arrindices[ idx*3 ]; + struct world_surface *surf = + world_tri_index_surface( trace_world, tri[0] ); inf->type = k_prediction_land; @@ -579,8 +583,6 @@ void player__approximate_best_trajectory( player_instance *player ) v3_add( launch_co, co0, co0 ); /* rough scan to make sure we dont collide with anything */ - /* NOTE this was rarely needed and ends up with false negatives. */ -#if 0 for( int j=1; j<=16; j++ ){ t = (float)j*(1.0f/16.0f); t *= 0.9f; @@ -594,15 +596,14 @@ void player__approximate_best_trajectory( player_instance *player ) float t1; v3f n; - int idx = spherecast_world( world, co0,co1, - k_board_radius*0.5f, &t1, n); + int idx = spherecast_world( world0, co0,co1, + k_board_radius*0.1f, &t1, n); if( idx != -1 ){ goto invalidated_grind; } v3_copy( co1, co0 ); } -#endif v3_copy( grind.n, jump->n ); @@ -614,10 +615,8 @@ void player__approximate_best_trajectory( player_instance *player ) s->possible_jumps[ s->possible_jump_count ++ ] = *jump; -#if 0 continue; invalidated_grind:; -#endif } } @@ -1010,7 +1009,8 @@ VG_STATIC void skate_apply_pump_model( player_instance *player ) v3_muladds( s->state.throw_v, player->rb.to_world[1], -doty, Fl); if( s->state.activity == k_skate_activity_ground ){ - v3_muladds( player->rb.v, Fl, k_mmcollect_lat, player->rb.v ); + if( v3_length2(player->rb.v)<(20.0f*20.0f) ) + v3_muladds( player->rb.v, Fl, k_mmcollect_lat, player->rb.v ); v3_muladds( s->state.throw_v, Fl, -k_mmcollect_lat, s->state.throw_v ); } @@ -1191,10 +1191,13 @@ VG_STATIC void player__skate_post_update( player_instance *player ) slide = 0.0f; } + static float menu_gate = 1.0f; + menu_gate = vg_lerpf( menu_gate, 1-cl_menu, vg.frame_delta*4.0f ); + float - vol_main = sqrtf( (1.0f-air)*attn*(1.0f-slide) * 0.4f ), - vol_air = sqrtf( air *attn * 0.5f ), - vol_slide = sqrtf( (1.0f-air)*attn*slide * 0.25f ); + vol_main = sqrtf( (1.0f-air)*attn*(1.0f-slide) * 0.4f ) * menu_gate, + vol_air = sqrtf( air *attn * 0.5f ) * menu_gate, + vol_slide = sqrtf( (1.0f-air)*attn*slide * 0.25f ) * menu_gate; const u32 flags = AUDIO_FLAG_SPACIAL_3D|AUDIO_FLAG_LOOP; @@ -2390,7 +2393,8 @@ begin_collision:; manifold_len += l; - debug_capsule( mtx, capsule.radius, capsule.height, VG__WHITE ); + if( vg_lines.draw ) + debug_capsule( mtx, capsule.radius, capsule.height, VG__WHITE ); /* add limits */ if( s->state.activity >= k_skate_activity_grind_any ){ @@ -3033,7 +3037,7 @@ VG_STATIC void player__skate_animate( player_instance *player, if( (s->state.activity <= k_skate_activity_air_to_grind) && (fabsf(s->state.flip_rate) > 0.01f) ) { - float t = s->state.flip_time; + float t = s->state.flip_time+s->state.flip_rate*substep*k_rb_delta; sign = vg_signf( t ); t = 1.0f - vg_minf( 1.0f, fabsf( t * 1.1f ) );