X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player.h;h=96b9dbaff93a6d6e4410e4767c0d417ad29f6360;hb=3ee65e6e24bfc39db7c7dd8c1f4cec3d5c42d0f8;hp=46c7dd4de0d416836bbe1b05d3b358fe80d71216;hpb=6a4dafa6fe9a3dd4bb88698bbe964154364390ec;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player.h b/player.h index 46c7dd4..96b9dba 100644 --- a/player.h +++ b/player.h @@ -4,7 +4,8 @@ #include "audio.h" #include "common.h" #include "world.h" -#include "character.h" +//#include "character.h" +#include "player_model.h" #include "bvh.h" /* @@ -48,6 +49,7 @@ static struct gplayer v2f board_xy; float grab; float pitch; + float pushing, push_time; v3f land_target; v3f land_target_log[22]; @@ -296,10 +298,14 @@ static void player_physics_control(void) if( !vg_get_button("break") && vg_get_button( "push" ) ) { - float cycle_time = (vg_time-start_push)*k_push_cycle_rate, + player.pushing = 1.0f; + player.push_time = vg_time-start_push; + + float cycle_time = player.push_time*k_push_cycle_rate, amt = k_push_accel * (sinf(cycle_time)*0.5f+0.5f)*ktimestep, current = v3_length( vel ), new_vel = vg_minf( current + amt, k_max_push_speed ); + new_vel -= vg_minf(current, k_max_push_speed); vel[2] -= new_vel * player.reverse; } @@ -530,6 +536,7 @@ static void player_physics(void) float grabt = vg_get_axis( "grabr" )*0.5f+0.5f; player.grab = vg_lerpf( player.grab, grabt, 0.14f ); + player.pushing = 0.0f; if( !player.in_air ) { @@ -1626,6 +1633,7 @@ static void player_animate(void) offset[0] = vg_clampf( offset[0], -0.8f, 0.8f ); offset[1] = vg_clampf( offset[1], -0.5f, 0.0f ); + offset[1] = 0.0f; /* * Player rotation @@ -1657,15 +1665,69 @@ static void player_animate(void) static float fdirx = 0.0f; static float fstand = 0.0f; static float ffly = 0.0f; + static float fpush = 0.0f; float speed = v3_length( player.rb.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,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.01f ); + fdirz = vg_lerpf(fdirz, player.reverse > 0.0f? 0.0f: 1.0f, 0.04f ); + fdirx = vg_lerpf(fdirx, player.slip < 0.0f? 0.0f: 1.0f, 0.01f ); ffly = vg_lerpf(ffly, player.in_air? 1.0f: 0.0f, 0.04f ); + fpush = vg_lerpf(fpush, player.pushing, 0.1f ); + + float lr = fdirz * (15.0f/30.0f), + st = offset[1]*-2.0f, + sa = fdirx * (15.0f/30.0f); + + mdl_keyframe apose[32], bpose[32]; + skeleton_sample_anim( &player.mdl.sk, player.mdl.anim_stand, lr, apose ); + skeleton_sample_anim( &player.mdl.sk, player.mdl.anim_highg, lr, bpose ); + skeleton_lerp_pose( &player.mdl.sk, apose, bpose, st, apose ); + skeleton_sample_anim( &player.mdl.sk, player.mdl.anim_slide, sa, bpose ); + skeleton_lerp_pose( &player.mdl.sk, apose, bpose, fslide, apose ); + + static float fairdir = 0.0f; + fairdir = vg_lerpf( fairdir, -vg_get_axis("horizontal"), 0.04f ); + + /* air anim */ + float air_dir = (fairdir*0.5f+0.5f)*(15.0f/30.0f); + skeleton_sample_anim( &player.mdl.sk, player.mdl.anim_air, air_dir, bpose ); + skeleton_lerp_pose( &player.mdl.sk, apose, bpose, ffly, apose ); + + /* push anim */ + skeleton_sample_anim( &player.mdl.sk, player.reverse > 0.0f? + player.mdl.anim_push: + player.mdl.anim_push_reverse, + player.push_time, bpose ); + skeleton_lerp_pose( &player.mdl.sk, apose, bpose, fpush, apose ); + + + /* additive effects */ + apose[player.mdl.id_hip-1].co[0] += offset[0]; + apose[player.mdl.id_hip-1].co[2] += offset[2]; + apose[player.mdl.id_ik_hand_l-1].co[0] += offset[0]; + apose[player.mdl.id_ik_hand_l-1].co[2] += offset[2]; + apose[player.mdl.id_ik_hand_r-1].co[0] += offset[0]; + apose[player.mdl.id_ik_hand_r-1].co[2] += offset[2]; + apose[player.mdl.id_ik_elbow_l-1].co[0] += offset[0]; + apose[player.mdl.id_ik_elbow_l-1].co[2] += offset[2]; + apose[player.mdl.id_ik_elbow_r-1].co[0] += offset[0]; + apose[player.mdl.id_ik_elbow_r-1].co[2] += offset[2]; + + skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_defer_ik ); + skeleton_apply_ik_pass( &player.mdl.sk ); + skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_deffered_only ); + + v3_copy( player.mdl.sk.final_mtx[player.mdl.id_head-1][3], + player.mdl.cam_pos ); + skeleton_apply_inverses( &player.mdl.sk ); + skeleton_apply_transform( &player.mdl.sk, player.rb.to_world ); + + skeleton_debug( &player.mdl.sk ); + +#if 0 character_pose_reset( &player.mdl ); /* TODO */ @@ -1789,6 +1851,7 @@ static void player_animate(void) rhead = vg_lerpf( rhead, vg_clampf( atan2f(localv[2],-localv[0]),-klook_max,klook_max), 0.04f ); player.mdl.rhead = rhead; +#endif } static void player_camera_update(void) @@ -1803,6 +1866,7 @@ static void player_camera_update(void) static void player_animate_death_cam(void) { +#if 0 v3f delta; v3f head_pos; v3_copy( player.mdl.ragdoll[k_chpart_head].co, head_pos ); @@ -1832,14 +1896,17 @@ static void player_animate_death_cam(void) player.angles[0] = atan2f( delta[0], -delta[2] ); player.angles[1] = -asinf( delta[1] ); +#endif } static void player_animate_camera(void) { - v3f offs = { -0.29f, 0.08f, 0.0f }; - m3x3_mulv( player.rb.to_world, offs, offs ); - m4x3_mulv( player.rb.to_world, player.mdl.ik_body.end, player.camera_pos ); - v3_add( offs, player.camera_pos, player.camera_pos ); + static v3f lerp_cam = {0.0f,0.0f,0.0f}; + v3f offs = { -0.4f, 0.15f, 0.0f }; + + v3_lerp( lerp_cam, player.mdl.cam_pos, 0.8f, lerp_cam ); + v3_add( lerp_cam, offs, offs ); + m4x3_mulv( player.rb.to_world, offs, player.camera_pos ); /* Look angles */ v3_lerp( player.vl, player.rb.v, 0.05f, player.vl ); @@ -2045,6 +2112,7 @@ static void player_update(void) static void draw_player(void) { /* Draw */ +#if 0 m4x3_copy( player.rb.to_world, player.mdl.mroot ); if( player.is_dead ) @@ -2057,6 +2125,21 @@ static void draw_player(void) opacity = 0.0f; character_draw( &player.mdl, opacity, player.camera ); +#endif + + shader_viewchar_use(); + vg_tex2d_bind( &tex_characters, 0 ); + shader_viewchar_uTexMain( 0 ); + shader_viewchar_uCamera( player.camera[3] ); + shader_viewchar_uPv( vg_pv ); + shader_link_standard_ub( _shader_viewchar.id, 2 ); + glUniformMatrix4x3fv( _uniform_viewchar_uTransforms, + player.mdl.sk.bone_count, + 0, + (float *)player.mdl.sk.final_mtx ); + + mesh_bind( &player.mdl.mesh ); + mesh_draw( &player.mdl.mesh ); } #endif /* PLAYER_H */