X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_skate.c;h=551c2cc1d9d026db60f829c8a7a3b6b6d0716a22;hb=b8d9653b23cc9d09608e05f08020fb923b3305ac;hp=e1971b2000725198264cf07b6d7ec5f65e675d40;hpb=f24a8cdd8ea6c3d762d26de2fc0700599bedbcad;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_skate.c b/player_skate.c index e1971b2..551c2cc 100644 --- a/player_skate.c +++ b/player_skate.c @@ -55,7 +55,7 @@ VG_STATIC int skate_collide_smooth( player_instance *player, m4x3f mtx, rb_sphere *sphere, rb_ct *man ) { - world_instance *world = get_active_world(); + world_instance *world = world_current_instance(); int len = 0; len = rb_sphere__scene( mtx, sphere, NULL, &world->rb_geo.inf.scene, man ); @@ -92,7 +92,7 @@ VG_STATIC int skate_grind_scansq( player_instance *player, v3f pos, v3f dir, float r, struct grind_info *inf ) { - world_instance *world = get_active_world(); + world_instance *world = world_current_instance(); v4f plane; v3_copy( dir, plane ); @@ -102,13 +102,8 @@ VG_STATIC int skate_grind_scansq( player_instance *player, boxf box; v3_add( pos, (v3f){ r, r, r }, box[1] ); v3_sub( pos, (v3f){ r, r, r }, box[0] ); - - bh_iter it; - bh_iter_init( 0, &it ); - int idx; - struct grind_sample - { + struct grind_sample{ v2f co; v2f normal; v3f normal3, @@ -124,7 +119,11 @@ VG_STATIC int skate_grind_scansq( player_instance *player, v3_cross( plane, player->basis[1], support_axis ); v3_normalize( support_axis ); - while( bh_next( world->geo_bh, &it, box, &idx ) ){ + bh_iter it; + bh_iter_init_box( 0, &it, box ); + i32 idx; + + while( bh_next( world->geo_bh, &it, &idx ) ){ u32 *ptri = &world->scene_geo.arrindices[ idx*3 ]; v3f tri[3]; @@ -234,10 +233,8 @@ too_many_samples: float yi = v3_dot( player->basis[1], si->normal3 ), yj = v3_dot( player->basis[1], sj->normal3 ); - if( yi > yj ) - v3_add( si->normal3, average_normal, average_normal ); - else - v3_add( sj->normal3, average_normal, average_normal ); + if( yi > yj ) v3_add( si->normal3, average_normal, average_normal ); + else v3_add( sj->normal3, average_normal, average_normal ); passed_samples ++; } @@ -348,7 +345,7 @@ VG_STATIC int create_jumps_to_hit_target( player_instance *player, VG_STATIC void player__approximate_best_trajectory( player_instance *player ) { - world_instance *world0 = get_active_world(); + world_instance *world0 = world_current_instance(); struct player_skate *s = &player->_skate; float k_trace_delta = k_rb_delta * 10.0f; @@ -502,7 +499,7 @@ void player__approximate_best_trajectory( player_instance *player ) m3x3_mul( gate->transport, basis, basis ); if( gate->type == k_gate_type_nonlocel ){ - trace_world = &world_global.worlds[ gate->target ]; + trace_world = &world_static.worlds[ gate->target ]; } } } @@ -980,7 +977,7 @@ VG_STATIC void skate_apply_jump_model( player_instance *player ) s->state.jump_time = vg.time; audio_lock(); - audio_oneshot_3d( &audio_jumps[rand()%2], player->rb.co, 40.0f, 1.0f ); + audio_oneshot_3d( &audio_jumps[vg_randu32()%2], player->rb.co, 40.0f, 1.0f ); audio_unlock(); } } @@ -1192,13 +1189,10 @@ 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.time_frame_delta*4.0f ); - - float - 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; + f32 gate = 1.0f-menu.factive, + 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; const u32 flags = AUDIO_FLAG_SPACIAL_3D|AUDIO_FLAG_LOOP; @@ -1323,7 +1317,7 @@ int skate_compute_surface_alignment( player_instance *player, v3f surface_normal, v3f axel_dir ) { struct player_skate *s = &player->_skate; - world_instance *world = get_active_world(); + world_instance *world = world_current_instance(); v3f truck, left, right; m4x3_mulv( player->rb.to_world, ra, truck ); @@ -1536,7 +1530,7 @@ VG_STATIC int skate_point_visible( v3f origin, v3f target ) v3_muls( dir, 1.0f/ray.dist, dir ); ray.dist -= 0.025f; - if( ray_world( get_active_world(), origin, dir, &ray ) ) + if( ray_world( world_current_instance(), origin, dir, &ray ) ) return 0; return 1; @@ -1669,6 +1663,10 @@ VG_STATIC void skate_5050_apply( player_instance *player, v3_muladds( inf_back->co, inf_avg.dir, 0.5f, inf_avg.co ); v3_normalize( inf_avg.dir ); + /* dont ask */ + v3_muls( inf_avg.dir, vg_signf(v3_dot(inf_avg.dir,player->rb.v)), + inf_avg.dir ); + v3f axis_front, axis_back, axis; v3_cross( inf_front->dir, inf_front->n, axis_front ); v3_cross( inf_back->dir, inf_back->n, axis_back ); @@ -1697,6 +1695,8 @@ VG_STATIC void skate_5050_apply( player_instance *player, k_grind_spring, k_grind_dampener, k_rb_delta ); + vg_line_arrow( player->rb.co, up, 1.0f, VG__GREEN ); + vg_line_arrow( player->rb.co, target_up, 1.0f, VG__GREEN ); v3f fwd_nplane, dir_nplane; v3_muladds( player->rb.to_world[2], inf_avg.n, @@ -1713,6 +1713,8 @@ VG_STATIC void skate_5050_apply( player_instance *player, 1000.0f, k_grind_dampener, k_rb_delta ); + vg_line_arrow( player->rb.co, fwd_nplane, 0.8f, VG__RED ); + vg_line_arrow( player->rb.co, dir_nplane, 0.8f, VG__RED ); v3f pos_front = { 0.0f, -k_board_radius, -1.0f * k_board_length }, pos_back = { 0.0f, -k_board_radius, 1.0f * k_board_length }, @@ -2078,10 +2080,21 @@ VG_STATIC enum skate_activity skate_availible_grind( player_instance *player ) VG_STATIC void player__skate_update( player_instance *player ) { struct player_skate *s = &player->_skate; - world_instance *world = get_active_world(); + world_instance *world = world_current_instance(); + + if( world->water.enabled ){ + if( player->rb.co[1]+0.25f < world->water.height ){ + audio_oneshot_3d( &audio_splash, player->rb.co, 40.0f, 1.0f ); + player__skate_kill_audio( player ); + player__dead_transition( player ); + return; + } + } v3_copy( player->rb.co, s->state.prev_pos ); s->state.activity_prev = s->state.activity; + v3f normal_total; + v3_zero( normal_total ); struct board_collider { @@ -2115,7 +2128,6 @@ VG_STATIC void player__skate_update( player_instance *player ) float slap = 0.0f; if( s->state.activity <= k_skate_activity_air_to_grind ){ - float min_dist = 0.6f; for( int i=0; i<2; i++ ){ v3f wpos, closest; @@ -2137,9 +2149,6 @@ VG_STATIC void player__skate_update( player_instance *player ) wheels[1].pos[1] = s->state.slap; - - - const int k_wheel_count = 2; s->substep = k_rb_delta; @@ -2199,7 +2208,7 @@ VG_STATIC void player__skate_update( player_instance *player ) if( !prev_contacts[i] ){ v3f co; m4x3_mulv( player->rb.to_world, wheels[i].pos, co ); - audio_oneshot_3d( &audio_taps[rand()%4], co, 40.0f, 0.75f ); + audio_oneshot_3d( &audio_taps[vg_randu32()%4], co, 40.0f, 0.75f ); } } audio_unlock(); @@ -2486,6 +2495,7 @@ begin_collision:; v3f impulse; v3_muls( ct->n, lambda, impulse ); + v3_muladds( normal_total, impulse, inv_mass, normal_total ); v3_muladds( player->rb.v, impulse, inv_mass, player->rb.v ); v3_cross( delta, impulse, impulse ); m3x3_mulv( iIw, impulse, impulse ); @@ -2512,6 +2522,24 @@ begin_collision:; * -------------------------------------------------------------------------- */ + f32 nforce = v3_length(normal_total); + if( nforce > 4.0f ){ + if( nforce > 17.6f ){ + v3_muladds( player->rb.v, normal_total, -1.0f, player->rb.v ); + player__dead_transition(player); + player__skate_kill_audio(player); + return; + } + + f32 amt = k_cam_punch; + if( player->camera_mode == k_cam_firstperson ){ + amt *= 0.25f; + } + + v3_muladds( player->cam_land_punch_v, normal_total, amt, + player->cam_land_punch_v ); + } + s->surface = k_surface_prop_concrete; for( int i=0; istate.activity == k_skate_activity_ground ){ if( (fabsf(s->state.slip) > 0.75f) ){ - audio_oneshot_3d( &audio_lands[rand()%2+3], player->rb.co, + audio_oneshot_3d( &audio_lands[vg_randu32()%2+3], player->rb.co, 40.0f, 1.0f ); } else{ - audio_oneshot_3d( &audio_lands[rand()%3], player->rb.co, + audio_oneshot_3d( &audio_lands[vg_randu32()%3], player->rb.co, 40.0f, 1.0f ); } } @@ -2668,7 +2696,7 @@ VG_STATIC void player__skate_animate( player_instance *player, float curspeed = v3_length( player->rb.v ), kickspeed = vg_clampf( curspeed*(1.0f/40.0f), 0.0f, 1.0f ), - kicks = (vg_randf()-0.5f)*2.0f*kickspeed, + kicks = (vg_randf64()-0.5f)*2.0f*kickspeed, sign = vg_signf( kicks ); s->wobble[0] = vg_lerpf( s->wobble[0], kicks*kicks*sign, 6.0f*vg.time_delta);