X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_animation.h;h=b255f14c71b176d52e3032fc549f6d4891e2f6cc;hb=0124cd309a7db70cdd74b5661f2df8b862ca2f2f;hp=e08991014629b05224ab5babd4754873af2cdc6a;hpb=297468e5a3cc8c7805c16fdd615f42f3876eb908;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_animation.h b/player_animation.h index e089910..b255f14 100644 --- a/player_animation.h +++ b/player_animation.h @@ -30,7 +30,6 @@ VG_STATIC void player_animate_offboard(void) mdl_keyframe apose[32], bpose[32]; struct skeleton *sk = &player.mdl.sk; - if( player.walk > 0.025f ) { /* TODO move */ @@ -88,6 +87,8 @@ VG_STATIC void player_animate(void) { struct player_phys *phys = &player.phys; rb_extrapolate_transform( &player.phys.rb, player.visual_transform ); + v3_muladds( player.visual_transform[3], phys->rb.up, -0.2f, + player.visual_transform[3] ); v4f qfake_rot; m3x3f fake_rot; @@ -105,10 +106,7 @@ VG_STATIC void player_animate(void) } /* Camera position */ - v3_sub( phys->rb.v, phys->v_last, phys->a ); - v3_copy( phys->rb.v, phys->v_last ); - - v3_add( phys->m, phys->a, phys->m ); + v3_muladds( phys->m, phys->a, VG_TIMESTEP_FIXED, phys->m ); v3_lerp( phys->m, (v3f){0.0f,0.0f,0.0f}, 0.1f, phys->m ); phys->m[0] = vg_clampf( phys->m[0], -2.0f, 2.0f ); @@ -180,7 +178,12 @@ VG_STATIC void player_animate(void) /* stand/crouch */ float dir_frame = player.fdirz * (15.0f/30.0f), stand_blend = offset[1]*-2.0f; - + + v3f local_cog; + m4x3_mulv( player.phys.rb.to_local, player.phys.cog, local_cog ); + + stand_blend = vg_clampf( 1.0f-local_cog[1], 0, 1 ); + skeleton_sample_anim( sk, player.mdl.anim_stand, dir_frame, apose ); skeleton_sample_anim( sk, player.mdl.anim_highg, dir_frame, bpose ); skeleton_lerp_pose( sk, apose, bpose, stand_blend, apose ); @@ -268,6 +271,32 @@ VG_STATIC void player_animate(void) apose[apply_to[i]-1].co[0] += offset[0]*add_grab_mod; apose[apply_to[i]-1].co[2] += offset[2]*add_grab_mod; } + + v3f bo; + v3_muls( player.board_offset, add_grab_mod, bo ); + + v3_add( bo, apose[ player.mdl.id_board-1 ].co, + apose[ player.mdl.id_board-1 ].co ); + v3_add( bo, apose[ player.mdl.id_ik_foot_l-1 ].co, + apose[ player.mdl.id_ik_foot_l-1 ].co ); + v3_add( bo, apose[ player.mdl.id_ik_foot_r-1 ].co, + apose[ player.mdl.id_ik_foot_r-1 ].co ); + + m3x3f c; + q_m3x3( player.board_rotation, c ); + + v3f d; + v3_sub( apose[ player.mdl.id_ik_foot_l-1 ].co, bo, d ); + m3x3_mulv( c, d, d ); + v3_add( bo, d, apose[ player.mdl.id_ik_foot_l-1 ].co ); + + v3_sub( apose[ player.mdl.id_ik_foot_r-1 ].co, bo, d ); + m3x3_mulv( c, d, d ); + v3_add( bo, d, apose[ player.mdl.id_ik_foot_r-1 ].co ); + + q_mul( player.board_rotation, apose[ player.mdl.id_board-1 ].q , + apose[ player.mdl.id_board-1 ].q ); + q_normalize( apose[ player.mdl.id_board-1 ].q ); } skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_defer_ik ); @@ -318,6 +347,53 @@ VG_STATIC void player_animate_death_cam(void) player.angles[1] = -asinf( delta[1] ); } +VG_STATIC void player_animate_follow_cam( v3f target, float dist, float speed ) +{ + v3f delta; + + v3_sub( target, player.camera_pos, delta ); + v3_normalize( delta ); + + v3f follow_pos; + v3_muladds( target, delta, -dist, follow_pos ); + v3_lerp( player.camera_pos, follow_pos, + speed * vg.time_delta, player.camera_pos ); + + /* + * Make sure the camera stays above the ground + */ + v3f min_height = {0.0f,1.0f,0.0f}; + + v3f sample; + v3_add( player.camera_pos, min_height, sample ); + ray_hit hit; + hit.dist = min_height[1]*2.0f; + + if( ray_world( sample, (v3f){0.0f,-1.0f,0.0f}, &hit )) + v3_add( hit.pos, min_height, player.camera_pos ); + +#if 0 + if( world.water.enabled ) + { + player.camera_pos[1] = + vg_maxf( world.water.height + 2.0f, player.camera_pos[1] ); + } +#endif + + player.angles[0] = atan2f( delta[0], -delta[2] ); + player.angles[1] = -asinf( delta[1] ); +} + +VG_STATIC void player_animate_camera_thirdperson(void) +{ + static v3f lerp_cam = { 0.0f, 0.0f, 0.0f }; + v3f target; + + v3_muladds( player.phys.rb.co, player.phys.rb.up, 1.2f, target ); + + player_animate_follow_cam( target, 1.5f, 20.0f ); +} + VG_STATIC void player_animate_camera(void) { struct player_phys *phys = &player.phys;