-
- /* Creating a skeleton of the player dynamically */
-
-
- #if 0
- player.handl_target[0] = head[0] + 0.2f;
- player.handl_target[1] = head[1] - 0.8f*(1.0f-fabsf(slip));
- player.handl_target[2] = head[2] + 0.2f + 0.7f*fabsf(slip);
-
- player.handr_target[0] = head[0] + 0.2f;
- player.handr_target[1] = head[1] - 0.8f*(1.0f-fabsf(slip));
- player.handr_target[2] = head[2] - (0.2f + 0.7f*fabsf(slip));
-
- if( vg_maxf(lslip,grab) > 0.5f )
- {
- if( player.slip < 0.0f && player.in_air )
- {
- player.handl_target[0] = 0.15f;
- player.handl_target[1] = 0.1f;
- player.handl_target[2] = 0.4f;
- }
- else
- {
- player.handr_target[0] = 0.15f;
- player.handr_target[1] = 0.1f;
- player.handr_target[2] = -0.4f;
- }
-
- if( grab > 0.5f )
- {
- player.handr_target[0] = -0.15f;
- player.handr_target[1] = 0.1f;
- player.handr_target[2] = 0.4f;
- }
- }
-
- #endif
-}
-
-static void player_animate(void)
-{
- /* Camera position */
- static v3f last_vel = { 0.0f, 0.0f, 0.0f };
- static v3f momentum, bob;
-
- v3_sub( player.v, last_vel, player.a );
- v3_copy( player.v, last_vel );
-
- v3_add( momentum, player.a, momentum );
- v3_lerp( momentum, (v3f){0.0f,0.0f,0.0f}, 0.1f, momentum );
- v3f target;
-
- momentum[0] = vg_clampf( momentum[0], -2.0f, 2.0f );
- momentum[1] = vg_clampf( momentum[1], -0.2f, 5.0f );
- momentum[2] = vg_clampf( momentum[2], -2.0f, 2.0f );
- v3_copy( momentum, target );
- v3_lerp( bob, target, 0.2f, bob );
-
- /* Head */
- float lslip = fabsf(player.slip); //vg_minf( 0.4f, slip );
-
- float grabt = vg_get_axis( "grabr" )*0.5f+0.5f;
- player.grab = vg_lerpf( player.grab, grabt, 0.04f );
-
- float kheight = 1.8f,
- kleg = 0.6f;
-
- v3f head;
- head[0] = 0.0f;
- head[1] = (0.3f+cosf(lslip)*0.5f*(1.0f-player.grab*0.7f)) * kheight;
- head[2] = 0.0f;
-
- v3f offset;
- m3x3_mulv( player.to_local, bob, offset );
-
- offset[0] *= 0.3333f;
- offset[1] *= -0.25f;
- offset[2] *= 0.7f;
- v3_muladds( head, offset, 0.7f, head );
- head[1] = vg_clampf( head[1], 0.3f, kheight );
-
- m4x3_mulv( player.to_world, head, head );
-
- v3_copy( head, player.view );
-
- /* New board transformation */
- v4f board_rotation; v3f board_location;
-
- /* TODO: Move this out of animate into update */
- v2_lerp( player.board_xy, (v2f){ vg_get_axis("h1"), vg_get_axis("v1") },
- ktimestep*3.0f, player.board_xy );
-
- v4f rz, rx;
- q_axis_angle( rz, (v3f){ 0.0f, 0.0f, 1.0f }, player.board_xy[0] );
- q_axis_angle( rx, (v3f){ 1.0f, 0.0f, 0.0f }, player.board_xy[1] );
- q_mul( rx, rz, board_rotation );
-
- q_m3x3( board_rotation, player.mboard );
- m3x3_mulv( player.mboard, (v3f){ 0.0f, -0.5f, 0.0f }, board_location );
- v3_add( (v3f){0.0f,0.5f,0.0f}, board_location, board_location );
-
- m3x3_mul( player.to_world, player.mboard, player.mboard );
- m4x3_mulv( player.to_world, board_location, player.mboard[3] );
-
-
- /* In the air, the dude should grab with the side thats highest,
- * while also sliding the same foot downwards a bit */
-
- float foot_l = 0.3f,
- foot_r = -0.4f;
-
- player.handl_target[0] = 0.0f;
- player.handl_target[1] = 0.0f;
- player.handl_target[2] = 0.6f;
-
- player.handr_target[0] = 0.0f;
- player.handr_target[1] = 0.0f;
- player.handr_target[2] = -0.6f;
- if( 1||player.in_air )
- {
- float tuck = player.board_xy[1],
- tuck_amt = fabsf( tuck ) * (1.0f-fabsf(player.board_xy[0]));
-
- if( tuck < 0.0f )
- {
- foot_l *= 1.0f-tuck_amt*1.5f;
-
- if( player.grab > 0.1f )
- {
- m4x3_mulv( player.mboard, (v3f){0.1f,0.14f,0.6f},
- player.handl_target );
- m4x3_mulv( player.to_local,
- player.handl_target, player.handl_target );
- }
- }
- else
- {
- foot_r *= 1.0f-tuck_amt*1.4f;
-
- if( player.grab > 0.1f )
- {
- m4x3_mulv( player.mboard, (v3f){0.1f,0.14f,-0.6f},
- player.handr_target );
- m4x3_mulv( player.to_local,
- player.handr_target, player.handr_target );
- }
- }
- }
- else
- {
- }
-
- m3x3_copy( player.mboard, player.mfoot_l );
- m4x3_mulv( player.mboard, (v3f){ 0.0f,0.16f,foot_l }, player.mfoot_l[3] );
-
- m3x3_copy( player.mboard, player.mfoot_r );
- m4x3_mulv( player.mboard, (v3f){ 0.0f,0.16f,foot_r }, player.mfoot_r[3] );
-
- float const kleg_upper = 0.53f,
- kleg_lower = 0.5f,
- karm_ratio = 0.75f,
- karm_upper = kleg_upper*karm_ratio,
- karm_lower = kleg_lower*karm_ratio;
-
- /* Create IK targets */
- struct ik_basic ik_leg_l = { .l1 = kleg_upper, .l2 = kleg_lower },
- ik_leg_r = { .l1 = kleg_upper, .l2 = kleg_lower },
- ik_arm_l = { .l1 = karm_upper, .l2 = karm_lower },
- ik_arm_r = { .l1 = karm_upper, .l2 = karm_lower };
-
- v3f butt, fwd;
- v4f hip_rotation;
-
- /* create hip rotation */
- q_axis_angle( hip_rotation, (v3f){0.0f,1.0f,0.0f}, sinf(vg_time) );
- q_m3x3( hip_rotation, player.mbutt );
- m3x3_mul( player.to_world, player.mbutt, player.mbutt );
-
- /* offset */
- m3x3_mulv( player.to_world, (v3f){ 0.2f,-0.55f,0.0f}, butt );
- v3_add( butt, player.view, butt );
- v3_copy( butt, player.mbutt[3] );
-
- m4x3_mulv( player.mbutt, (v3f){0.0f,0.0f,-0.1f}, ik_leg_r.base );
- m4x3_mulv( player.mbutt, (v3f){0.0f,0.0f, 0.1f}, ik_leg_l.base );
-
- m4x3_mulv( player.mboard, (v3f){ 0.0f,0.16f, foot_r }, ik_leg_r.end );
- m4x3_mulv( player.mboard, (v3f){ 0.0f,0.16f, foot_l }, ik_leg_l.end );
- m4x3_mulv( player.mboard, (v3f){ -0.6f,0.50f,-0.40f }, ik_leg_r.pole );
- m4x3_mulv( player.mboard, (v3f){ -0.6f,0.50f, 0.35f }, ik_leg_l.pole );
-
- /* Compute IK */
- ik_basic( &ik_leg_r, player.mleg_r, player.mknee_r );
- ik_basic( &ik_leg_l, player.mleg_l, player.mknee_l );
-
- /* Arms */
- v3f hl, hr, neckl = {0.0f, 0.5f, 0.2f},
- neckr = {0.0f, 0.5f,-0.2f};
-
- m4x3_mulv( player.mbutt, neckl, ik_arm_l.base );
- m4x3_mulv( player.mbutt, neckr, ik_arm_r.base );
-
- v3_lerp( player.handl, player.handl_target, 0.1f, player.handl );
- v3_lerp( player.handr, player.handr_target, 0.1f, player.handr );
-
- m4x3_mulv( player.to_world, player.handl, ik_arm_l.end );
- m4x3_mulv( player.to_world, player.handr, ik_arm_r.end );
- m4x3_mulv( player.to_world, (v3f){ 0.6f,0.7f, 0.4f }, ik_arm_l.pole );
- m4x3_mulv( player.to_world, (v3f){ 0.6f,0.7f,-0.35f }, ik_arm_r.pole );
-
- ik_basic( &ik_arm_l, player.marm_l, player.melbow_l );
- ik_basic( &ik_arm_r, player.marm_r, player.melbow_r );
-
- if( thirdperson )
- {
- v3f nv;
- v3_copy( player.v, nv );
- v3_normalize( nv );
- v3_muladds( player.view, nv, -3.0f, player.view );
- }