-static void player_animate(void);
-static void player_update(void)
-{
-
- if( vg_get_axis("grabl")>0.0f)
- reset_player(0,NULL);
- if( player.is_dead )
- return;
-
- static int clock = 0;
-
- /* temp */
- if( freecam )
- {
- player_freecam();
- return;
- }
-
- clock ++;
- if( clock >= clock_divider )
- clock = 0;
- else
- return;
- float horizontal = vg_get_axis("horizontal"),
- vertical = vg_get_axis("vertical");
-
- player.joy_l[0] = vg_signf(horizontal) * powf( horizontal, 2.0f );
- player.joy_l[1] = vg_signf(vertical) * powf( vertical, 2.0f );
-
- /* Integrate velocity */
- if( sv_phys )
- {
- apply_gravity( player.v, ktimestep );
- v3_muladds( player.co, player.v, ktimestep, player.co );
- }
-
- /* Integrate inertia */
- v4f rotate; v3f vup = {0.0f,1.0f,0.0f};
- m3x3_mulv( player.to_world, vup, vup );
-
- static float siY = 0.0f;
-
- float lerpq = player.in_air? 0.04f: 0.3f;
- siY = vg_lerpf( siY, player.iY, lerpq );
-
- q_axis_angle( rotate, vup, siY );
- q_mul( rotate, player.rot, player.rot );
-
- player.look_dir[0] = atan2f( player.v[0], -player.v[2] );
- player.look_dir[1] = atan2f( -player.v[1], sqrtf(player.v[0]*player.v[0]+
- player.v[2]*player.v[2]) ) * 0.3f;
-
- player.iY = 0.0f; /* temp */
-
- if( player.in_air )
- player_physics_air();
-
- if( !player.in_air )
- player_physics_ground();
-
- /* Camera and character */
-
- player_transform_update();
- q_normalize(player.rot);
- player_animate();
-}
-
-void vg_update(void)
-{
- player_update();
-
- //rb_torque( &mr_box, (v3f){0.0f,0.0f,1.0f}, 0.01f );
-
- if( glfwGetKey( vg_window, GLFW_KEY_F ) )
- character_ragdoll_go( &player.mdl, player.view );
-
- if( glfwGetKey( vg_window, GLFW_KEY_G ) )
- {
- player.is_dead = 1;
- m4x3_mulv( player.to_world, player.view, player.follow );
- character_ragdoll_copypose( &player.mdl, player.v );
- }
-
- static int clock = 0;
-
- clock ++;
- if( clock >= clock_divider )
- {
- character_debug_ragdoll( &player.mdl );
-
- if( player.is_dead )
- character_ragdoll_iter( &player.mdl, &world.geo );
-
- rb_build_manifold( &mr_box, &world.geo );
- rb_build_manifold( &mrs_box, &world.geo );
- rb_constraint_manifold( &mr_box );
- rb_constraint_manifold( &mrs_box );
-
- rb_iter( &mr_box );
- rb_iter( &mrs_box );
-
- rb_debug( &mr_box, 0xffffffff );
- rb_debug( &mrs_box, 0xff00ff00 );
-
- rb_update_transform( &mr_box );
- rb_update_transform( &mrs_box );
-
- clock = 0;
- }
-
-}
-
-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 = 2.0f,
- 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 );
-
-#if 0
- if( !freecam )
- {
- v3_copy( head, player.view );
- v3f camoffs = {-0.2f,-0.6f,0.00f};
- v3_add( player.view, camoffs, player.view );
- }
-#endif
-
-
- /*
- * Animation blending
- * ===========================================
- */
-
- static float fslide = 0.0f;
- static float fdirz = 0.0f;
- static float fdirx = 0.0f;
- static float fstand = 0.0f;
- static float ffly = 0.0f;
-
- float speed = v3_length( player.v );
-
- fstand = vg_lerpf(fstand, 1.0f-vg_clampf(speed*0.03f,0.0f,1.0f),0.1f);
- fslide = vg_lerpf(fslide, vg_clampf(lslip+fabsf(offset[0])*0.2f,
- 0.0f,1.0f), 0.04f);
- fdirz = vg_lerpf(fdirz, player.reverse > 0.0f? 1.0f: 0.0f, 0.04f );
- fdirx = vg_lerpf(fdirx, player.slip < 0.0f? 1.0f: 0.0f, 0.04f );
- ffly = vg_lerpf(ffly, player.in_air? 1.0f: 0.0f, 0.04f );
-
- character_pose_reset( &player.mdl );
-
- float amt_air = ffly*ffly,
- amt_ground = 1.0f-amt_air,
- amt_std = (1.0f-fslide) * amt_ground,
- amt_stand = amt_std * fstand,
- amt_aero = amt_std * (1.0f-fstand),
- amt_slide = amt_ground * fslide;
-
- character_final_pose( &player.mdl, offset, &pose_stand, amt_stand );
- character_final_pose( &player.mdl, offset, &pose_aero, amt_aero*fdirz );
- character_final_pose( &player.mdl, offset,
- &pose_aero_reverse, amt_aero * (1.0f-fdirz) );
- character_final_pose( &player.mdl, offset, &pose_slide, amt_slide*fdirx );
- character_final_pose( &player.mdl, offset,
- &pose_slide1, amt_slide*(1.0f-fdirx) );
-
- character_final_pose( &player.mdl, (v3f){0.0f,0.0f,0.0f},
- &pose_fly, amt_air );
-
- if( !freecam )
- {
- v3_copy( player.mdl.cam_pos, player.view );
- v3_muladds( player.view, offset, 0.7f, player.view );
- player.view[1] = vg_clampf( player.view[1], 0.3f, kheight );
- }
-
- /*
- * Additive effects
- * ==========================
- */
- struct ik_basic *arm_l = &player.mdl.ik_arm_l,
- *arm_r = &player.mdl.ik_arm_r;
-
- v3f localv;
- m3x3_mulv( player.to_local, player.v, localv );
- v3_muladds( arm_l->end, localv, -0.01f, arm_l->end );
- v3_muladds( arm_r->end, localv, -0.01f, arm_r->end );
-
- /* New board transformation */
- v4f board_rotation; v3f board_location;
-
- 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 );
-
- v3f *mboard = player.mdl.matrices[k_chpart_board];// player.mboard;
- q_m3x3( board_rotation, mboard );
- m3x3_mulv( mboard, (v3f){ 0.0f, -0.5f, 0.0f }, board_location );
- v3_add( (v3f){0.0f,0.5f,0.0f}, board_location, board_location );
- v3_copy( board_location, mboard[3] );
-
-
- float wheel_r = offset[0]*-0.4f;
- v4f qwheel;
- q_axis_angle( qwheel, (v3f){0.0f,1.0f,0.0f}, wheel_r );
-
- q_m3x3( qwheel, player.mdl.matrices[k_chpart_wb] );
-
- m3x3_transpose( player.mdl.matrices[k_chpart_wb],
- player.mdl.matrices[k_chpart_wf] );
- v3_copy( player.mdl.offsets[k_chpart_wb],
- player.mdl.matrices[k_chpart_wb][3] );
- v3_copy( player.mdl.offsets[k_chpart_wf],
- player.mdl.matrices[k_chpart_wf][3] );
-
- m4x3_mul( mboard, player.mdl.matrices[k_chpart_wb],
- player.mdl.matrices[k_chpart_wb] );
- m4x3_mul( mboard, player.mdl.matrices[k_chpart_wf],
- player.mdl.matrices[k_chpart_wf] );
-
- m4x3_mulv( mboard, player.mdl.ik_leg_l.end, player.mdl.ik_leg_l.end );
- m4x3_mulv( mboard, player.mdl.ik_leg_r.end, player.mdl.ik_leg_r.end );
-
-
- v3_copy( player.mdl.ik_arm_l.end, player.handl_target );
- v3_copy( player.mdl.ik_arm_r.end, player.handr_target );
-
- if( 1||player.in_air )
- {
- float tuck = player.board_xy[1],
- tuck_amt = fabsf( tuck ) * (1.0f-fabsf(player.board_xy[0]));
-
- float crouch = player.grab*0.3f;
- v3_muladds( player.mdl.ik_body.base, (v3f){0.0f,-1.0f,0.0f},
- crouch, player.mdl.ik_body.base );
- v3_muladds( player.mdl.ik_body.end, (v3f){0.0f,-1.0f,0.0f},
- crouch*1.2f, player.mdl.ik_body.end );
-
- if( tuck < 0.0f )
- {
- //foot_l *= 1.0f-tuck_amt*1.5f;
-
- if( player.grab > 0.1f )
- {
- m4x3_mulv( mboard, (v3f){0.1f,0.14f,0.6f},
- player.handl_target );
- }
- }
- else
- {
- //foot_r *= 1.0f-tuck_amt*1.4f;
-
- if( player.grab > 0.1f )
- {
- m4x3_mulv( mboard, (v3f){0.1f,0.14f,-0.6f},
- player.handr_target );
- }
- }
- }
-
- v3_lerp( player.handl, player.handl_target, 0.1f, player.handl );
- v3_lerp( player.handr, player.handr_target, 0.1f, player.handr );
-
- v3_copy( player.handl, player.mdl.ik_arm_l.end );
- v3_copy( player.handr, player.mdl.ik_arm_r.end );
-
- /* Head rotation */
-
- static float rhead = 0.0f;
- rhead = vg_lerpf( rhead,
- vg_clampf(atan2f( localv[2], -localv[0] ),-1.0f,1.0f), 0.04f );
- player.mdl.rhead = rhead;
-}
-
-static void draw_player(void)