X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_walk.c;h=cd5e52c7a3f9ddd9d1950820e039c8127cbfb4fa;hb=859178c6d4b2a9b9a95f8b01b113f589ce0f197f;hp=38429c7c531be3c6dabf9266a9d094df0886ae63;hpb=64d773ba5c208685f5cf265cc3505e3898e03528;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_walk.c b/player_walk.c index 38429c7..cd5e52c 100644 --- a/player_walk.c +++ b/player_walk.c @@ -1,5 +1,7 @@ -#ifndef PLAYER_WALK_C -#define PLAYER_WALK_C +#pragma once + +#include "vg/vg_rigidbody_collision.h" +#include "scene_rigidbody.h" #include "player.h" #include "input.h" @@ -47,7 +49,7 @@ static void player_walk_generic_to_skate( enum skate_activity init, f32 yaw ){ player__begin_holdout( (v3f){0.0f,0.0f,0.0f} ); player__skate_reset_animator(); player__skate_clear_mechanics(); - rb_update_transform( &localplayer.rb ); + rb_update_matrices( &localplayer.rb ); v3_copy( (v3f){yaw,0.0f,0.0f}, player_skate.state.trick_euler ); if( init == k_skate_activity_air ) @@ -68,7 +70,7 @@ static void player_walk_drop_in_to_skate(void){ v3f init_velocity; player_walk_drop_in_vector( init_velocity ); - rb_update_transform( &localplayer.rb ); + rb_update_matrices( &localplayer.rb ); v3_muladds( localplayer.rb.co, localplayer.rb.to_world[1], 1.0f, player_skate.state.cog ); v3_copy( init_velocity, player_skate.state.cog_v ); @@ -457,14 +459,14 @@ static void player_walk_update_generic(void){ enum walk_activity prev_state = w->state.activity; - w->collider.height = 2.0f; - w->collider.radius = 0.3f; + w->collider.h = 2.0f; + w->collider.r = 0.3f; m4x3f mtx; m3x3_copy( localplayer.rb.to_world, mtx ); v3_add( localplayer.rb.co, (v3f){0,1,0}, mtx[3] ); - vg_line_capsule( mtx, w->collider.radius, w->collider.height, VG__WHITE ); + vg_line_capsule( mtx, w->collider.r, w->collider.h, VG__WHITE ); rb_ct manifold[64]; int len; @@ -479,7 +481,7 @@ static void player_walk_update_generic(void){ */ len = rb_capsule__scene( mtx, &w->collider, NULL, - &world->rb_geo.inf.scene, manifold, 0 ); + world->geo_bh, manifold, 0 ); player_walk_custom_filter( world, manifold, len, 0.01f ); len = rb_manifold_apply_filtered( manifold, len ); @@ -489,7 +491,7 @@ static void player_walk_update_generic(void){ w->surface = k_surface_prop_concrete; for( int i=0; in ) ){ @@ -562,7 +564,7 @@ static void player_walk_update_generic(void){ */ for( int j=0; j<5; j++ ){ for( int i=0; in ); @@ -582,17 +584,17 @@ static void player_walk_update_generic(void){ v3f pa, pb; v3_copy( localplayer.rb.co, pa ); - pa[1] += w->collider.radius + max_dist; + pa[1] += w->collider.r + max_dist; v3_add( pa, (v3f){0, -max_dist * 2.0f, 0}, pb ); vg_line( pa, pb, 0xff000000 ); v3f n; float t; if( spherecast_world( world, pa, pb, - w->collider.radius, &t, n, 0 ) != -1 ){ + w->collider.r, &t, n, 0 ) != -1 ){ if( player_walk_normal_standable(n) ){ v3_lerp( pa, pb, t, localplayer.rb.co ); - localplayer.rb.co[1] += -w->collider.radius - k_penetration_slop; + localplayer.rb.co[1] += -w->collider.r - k_penetration_slop; w->state.activity = k_walk_activity_ground; float d = -v3_dot(n,localplayer.rb.v); @@ -622,7 +624,7 @@ static void player_walk_update_generic(void){ v3_muladds( localplayer.rb.co, localplayer.rb.v, k_rb_delta, localplayer.rb.co ); v3_add( localplayer.rb.co, (v3f){0,1,0}, mtx[3] ); - vg_line_capsule( mtx, w->collider.radius, w->collider.height, VG__GREEN ); + vg_line_capsule( mtx, w->collider.r, w->collider.h, VG__GREEN ); /* * CCD routine @@ -631,7 +633,7 @@ static void player_walk_update_generic(void){ */ v3f lwr_prev, lwr_now, - lwr_offs = { 0.0f, w->collider.radius, 0.0f }; + lwr_offs = { 0.0f, w->collider.r, 0.0f }; v3_add( lwr_offs, w->state.prev_pos, lwr_prev ); v3_add( lwr_offs, localplayer.rb.co, lwr_now ); @@ -642,16 +644,15 @@ static void player_walk_update_generic(void){ float movedist = v3_length( movedelta ); if( movedist > 0.3f ){ - float t, sr = w->collider.radius-0.04f; + float t, sr = w->collider.r-0.04f; v3f n; if( spherecast_world( world, lwr_prev, lwr_now, sr, &t, n, 0 ) != -1 ){ v3_lerp( lwr_prev, lwr_now, vg_maxf(0.01f,t), localplayer.rb.co ); - localplayer.rb.co[1] -= w->collider.radius; - rb_update_transform( &localplayer.rb ); - + localplayer.rb.co[1] -= w->collider.r; + rb_update_matrices( &localplayer.rb ); v3_add( localplayer.rb.co, (v3f){0,1,0}, mtx[3] ); - vg_line_capsule( mtx, w->collider.radius, w->collider.height, VG__RED); + vg_line_capsule( mtx, w->collider.r, w->collider.h, VG__RED); } } @@ -664,11 +665,11 @@ static void player_walk_update_generic(void){ v4f transport_rotation; m3x3_q( gate->transport, transport_rotation ); q_mul( transport_rotation, localplayer.rb.q, localplayer.rb.q ); - - rb_update_transform( &localplayer.rb ); + q_normalize( localplayer.rb.q ); + rb_update_matrices( &localplayer.rb ); player__pass_gate( id ); } - rb_update_transform( &localplayer.rb ); + rb_update_matrices( &localplayer.rb ); if( (prev_state == k_walk_activity_oregular) || (prev_state == k_walk_activity_oair) || @@ -690,7 +691,7 @@ static void player__walk_post_update(void){ float substep = vg.time_fixed_extrapolate; v3_muladds( mtx[3], localplayer.rb.v, k_rb_delta*substep, mtx[3] ); - vg_line_capsule( mtx, w->collider.radius, w->collider.height, VG__YELOW ); + vg_line_capsule( mtx, w->collider.r, w->collider.h, VG__YELOW ); /* Calculate header */ v3f v; @@ -797,7 +798,7 @@ static void player_walk_animate_drop_in(void){ v3_lerp( localplayer.rb.co, final_co, animator->transition_t, localplayer.rb.co ); - rb_update_transform( &localplayer.rb ); + rb_update_matrices( &localplayer.rb ); v3_muladds( localplayer.rb.co, localplayer.rb.to_world[1], -0.1f*animator->transition_t, localplayer.rb.co ); @@ -893,6 +894,13 @@ static void player__walk_animate(void){ } else localplayer.cam_velocity_influence = 0.0f; + + if( w->state.activity == k_walk_activity_sit ){ + localplayer.cam_dist = 3.8f; + } + else { + localplayer.cam_dist = 1.8f; + } } static void player_walk_pose_sit( struct player_walk_animator *animator, @@ -1097,7 +1105,9 @@ static void player__walk_im_gui(void){ "wood", "grass", "tiles", - "metal" } + "metal", + "snow", + "sand" } [w->surface] ); } @@ -1130,7 +1140,7 @@ static void player__walk_transition( bool grounded, f32 board_yaw ){ w->state.walk_timer = 0.0f; w->state.step_phase = 0; w->animator.board_yaw = fmodf( board_yaw, 2.0f ); - rb_update_transform( &localplayer.rb ); + rb_update_matrices( &localplayer.rb ); } static void player__walk_reset(void){ @@ -1143,7 +1153,7 @@ static void player__walk_reset(void){ q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f}, atan2f(fwd[0], fwd[2]) ); - rb_update_transform( &localplayer.rb ); + rb_update_matrices( &localplayer.rb ); } static void player__walk_animator_exchange( bitpack_ctx *ctx, void *data ){ @@ -1180,4 +1190,3 @@ static void player__walk_sfx_oneshot( u8 id, v3f pos, f32 volume ){ audio_unlock(); } -#endif /* PLAYER_DEVICE_WALK_H */