mdl_keyframe apose[32], bpose[32];
struct skeleton *sk = &player.mdl.sk;
-
if( player.walk > 0.025f )
{
/* TODO move */
{
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;
}
/* 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 );
{
float dirz = phys->reverse > 0.0f? 0.0f: 1.0f,
dirx = phys->slip < 0.0f? 0.0f: 1.0f,
- fly = phys->in_air? 1.0f: 0.0f;
+ fly = (phys->in_air|phys->grind)? 1.0f: 0.0f;
player.fdirz = vg_lerpf( player.fdirz, dirz, 2.4f*vg.time_delta );
player.fdirx = vg_lerpf( player.fdirx, dirx, 0.6f*vg.time_delta );
/* 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 );
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 );
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;