X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_device_skate.h;fp=player_device_skate.h;h=04a2da1115242581249cece7b445d8d03d23c553;hb=ff8fcac9582d07bc1ccbf08421d6ffec1758a755;hp=3d5b0795c4473af25d277209b8bcd3a384026590;hpb=f82c365a9144c3e5e57df88cb57ef273e9e9d47b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_device_skate.h b/player_device_skate.h index 3d5b079..04a2da1 100644 --- a/player_device_skate.h +++ b/player_device_skate.h @@ -4,6 +4,7 @@ #include "player_interface.h" #include "skeleton.h" #include "player_model.h" +#include "player_device_common.h" struct player_device_skate { @@ -43,8 +44,9 @@ struct player_device_skate double start_push, cur_push; - v3f vl, follow_cam_pos; - struct teleport_gate *follow_cam_gate; + struct mixedcam_state cam; + + v3f prev_pos; } state, state_gate_storage; @@ -1101,6 +1103,7 @@ VG_STATIC void player_skate_update( player_interface *player, player_attachment *at ) { struct player_device_skate *s = at->storage; + v3_copy( player->rb.co, s->state.prev_pos ); s->state.activity_prev = s->state.activity; /* Setup colliders */ @@ -1158,6 +1161,27 @@ VG_STATIC void player_skate_update( player_interface *player, vg_line_pt3( s->state.cog, 0.14f, VG__WHITE ); vg_line( player->rb.co, s->state.cog, VG__RED ); + + + teleport_gate *gate; + if( (gate = world_intersect_gates( player->rb.co, s->state.prev_pos )) ) + { + m4x3_mulv( gate->transport, player->rb.co, player->rb.co ); + m3x3_mulv( gate->transport, player->rb.v, player->rb.v ); + m4x3_mulv( gate->transport, s->state.cog, s->state.cog ); + m3x3_mulv( gate->transport, s->state.cog_v, s->state.cog_v ); + m3x3_mulv( gate->transport, s->state.throw_v, s->state.throw_v ); + + mixedcam_transport( &s->state.cam, gate ); + + v4f transport_rotation; + m3x3_q( gate->transport, transport_rotation ); + q_mul( transport_rotation, player->rb.q, player->rb.q ); + rb_update_transform( &player->rb ); + + s->state_gate_storage = s->state; + player_pass_gate( player, gate ); + } } VG_STATIC void player_skate_post_update( player_interface *player, @@ -1191,14 +1215,8 @@ VG_STATIC void player_skate_ui( player_interface *player, k_steer_ground, k_steer_air ); } -VG_STATIC void skate_camera_thirdperson_nextpos( player_interface *player, - struct player_device_skate *s, - struct player_avatar *av, - v3f next_pos, v3f d ); - -VG_STATIC void player_skate_pose( player_interface *player, - player_attachment *at, - player_pose pose, m4x3f transform ) +VG_STATIC void player_skate_animate( player_interface *player, + player_attachment *at ) { struct player_device_skate *s = at->storage; struct player_avatar *av = player->playeravatar; @@ -1363,7 +1381,7 @@ VG_STATIC void player_skate_pose( player_interface *player, skeleton_lerp_pose( sk, apose, bpose, s->state.grabbing, air_pose ); } - skeleton_lerp_pose( sk, ground_pose, air_pose, s->blend_fly, pose ); + skeleton_lerp_pose( sk, ground_pose, air_pose, s->blend_fly, at->pose ); float add_grab_mod = 1.0f - s->blend_fly; @@ -1377,13 +1395,13 @@ VG_STATIC void player_skate_pose( player_interface *player, for( int i=0; ipose[apply_to[i]-1].co[0] += offset[0]*add_grab_mod; + at->pose[apply_to[i]-1].co[2] += offset[2]*add_grab_mod; } - mdl_keyframe *kf_board = &pose[av->id_board-1], - *kf_foot_l = &pose[av->id_ik_foot_l-1], - *kf_foot_r = &pose[av->id_ik_foot_r-1]; + mdl_keyframe *kf_board = &at->pose[av->id_board-1], + *kf_foot_l = &at->pose[av->id_ik_foot_l-1], + *kf_foot_r = &at->pose[av->id_ik_foot_r-1]; v3f bo; v3_muls( s->board_offset, add_grab_mod, bo ); @@ -1409,9 +1427,10 @@ VG_STATIC void player_skate_pose( player_interface *player, } /* transform */ - rb_extrapolate_transform( &player->rb, transform ); + rb_extrapolate( &player->rb, at->pose_root_co, at->pose_root_q ); - v3_muladds( transform[3], player->rb.to_world[1], -0.28f, transform[3] ); + v3_muladds( at->pose_root_co, player->rb.to_world[1], -0.28f, + at->pose_root_co ); v4f qresy, qresx, qresidual; m3x3f mtx_residual; @@ -1420,22 +1439,21 @@ VG_STATIC void player_skate_pose( player_interface *player, q_axis_angle( qresx, player->rb.to_world[0], s->state.steerx_s*substep ); q_mul( qresy, qresx, qresidual ); - q_m3x3( qresidual, mtx_residual ); - m3x3_mul( transform, mtx_residual, transform ); + q_normalize( qresidual ); + q_mul( at->pose_root_q, qresidual, at->pose_root_q ); + q_normalize( at->pose_root_q ); - if( cl_thirdperson && s->state.follow_cam_gate ) +#if 0 + if( cl_thirdperson ) { - v3f next_pos, d, _; - skate_camera_thirdperson_nextpos( player, s, av, next_pos, d ); - - if( !gate_intersect_plane( s->state.follow_cam_gate, - next_pos, s->state.follow_cam_pos, _ ) ) + if( !followcam_will_hit_gate( player, &s->state.cam ) ) { m4x3f inverse; - m4x3_invert_affine( s->state.follow_cam_gate->transport, inverse ); + m4x3_invert_affine( s->state.cam.gate->transport, inverse ); m4x3_mul( inverse, transform, transform ); } } +#endif } VG_STATIC void skate_camera_vector_look( camera *cam, v3f v, float C, float k ) @@ -1455,15 +1473,17 @@ VG_STATIC void skate_camera_vector_look( camera *cam, v3f v, float C, float k ) } VG_STATIC void skate_camera_firstperson( player_interface *player, - struct player_device_skate *s, - struct player_avatar *av, camera *cam ) + player_attachment *at ) { + struct player_device_skate *s = at->storage; + struct player_avatar *av = player->playeravatar; + /* FIXME: viewpoint entity */ v3f vp = {-0.1f,1.8f,0.0f}; - m4x3_mulv( av->sk.final_mtx[ av->id_head-1 ], vp, cam->pos ); + m4x3_mulv( av->sk.final_mtx[ av->id_head-1 ], vp, at->cam_1st.pos ); - v3_zero( cam->angles ); - cam->fov = 119.0f; + v3_zero( at->cam_1st.angles ); + at->cam_1st.fov = 119.0f; v3f flat_dir, vel_dir, @@ -1486,84 +1506,57 @@ VG_STATIC void skate_camera_firstperson( player_interface *player, //v3_normalize( flat_dir ); v3_lerp( flat_dir, vel_dir, vg_clampf( tti / 2.0f, 0.4f, 1.0f ), look_dir ); - v3_lerp( s->state.vl, look_dir, 4.0f*vg.time_delta, s->state.vl ); - - skate_camera_vector_look( cam, s->state.vl, 0.7f, 0.5f ); -} - -/* this is a little yucky but needs to be done so we can use this 'prediction' - * in the pose function. its unfortunate. too bad - * - * FIXME: Can do better with FREEDOM MODE + api ordering. - */ -VG_STATIC void skate_camera_thirdperson_nextpos( player_interface *player, - struct player_device_skate *s, - struct player_avatar *av, - v3f next_pos, v3f d ) -{ - v3f origin, target; - - if( s->state.follow_cam_gate ) - { - m4x3f inverse; - m4x3_invert_affine( s->state.follow_cam_gate->transport, inverse ); - m4x3_mulv( inverse, player->rb.co, origin ); - } - else - { - v3_copy( player->rb.co, origin ); - } - - v3_add( origin, (v3f){0.0f,1.35f,0.0f}, origin ); - v3_sub( origin, s->state.follow_cam_pos, d ); - - if( v3_length2( d ) < 0.1f*0.1f ) - v3_copy( (v3f){ 0.0f, 0.0f, 1.0f }, d ); - else - v3_normalize( d ); + v3_lerp( s->state.cam.vl, look_dir, 4.0f*vg.time_delta, s->state.cam.vl ); - v3_muladds( origin, d, -2.0f, target ); - v3_lerp( s->state.follow_cam_pos, target, vg.frame_delta * 12.0f, next_pos ); + skate_camera_vector_look( &at->cam_1st, s->state.cam.vl, 0.7f, 0.5f ); } +#if 0 VG_STATIC void skate_camera_thirdperson( player_interface *player, struct player_device_skate *s, struct player_avatar *av, camera *cam ) { v3f prev_pos, cam_look_dir, d; - v3_copy( s->state.follow_cam_pos, prev_pos ); - skate_camera_thirdperson_nextpos( player, s, av, s->state.follow_cam_pos, d); + v3_copy( s->state.cam.pos, prev_pos ); + skate_camera_thirdperson_nextpos( player, s, av, s->state.cam.pos, d); - if( s->state.follow_cam_gate ) + if( s->state.cam.gate ) { v2f _; - if( gate_intersect_plane( s->state.follow_cam_gate, - s->state.follow_cam_pos, prev_pos, _ ) ) + if( gate_intersect_plane( s->state.cam.gate, + s->state.cam.pos, prev_pos, _ ) ) { - m4x3_mulv( s->state.follow_cam_gate->transport, - s->state.follow_cam_pos, s->state.follow_cam_pos ); - m3x3_mulv( s->state.follow_cam_gate->transport, d, d ); - player_apply_transport_to_cam( s->state.follow_cam_gate->transport ); + m4x3_mulv( s->state.cam.gate->transport, + s->state.cam.pos, s->state.cam.pos ); + m3x3_mulv( s->state.cam.gate->transport, d, d ); + player_apply_transport_to_cam( s->state.cam.gate->transport ); - s->state.follow_cam_gate = NULL; + s->state.cam.gate = NULL; } } skate_camera_vector_look( cam, d, 1.0f, 0.0f ); - v3_copy( s->state.follow_cam_pos, cam->pos ); + v3_copy( s->state.cam.pos, cam->pos ); } +#endif -VG_STATIC void player_skate_get_camera( player_interface *player, - player_attachment *at, camera *cam ) +VG_STATIC void player_skate_post_animate( player_interface *player, + player_attachment *at ) { struct player_device_skate *s = at->storage; struct player_avatar *av = player->playeravatar; + v3_zero( at->cam_1st.pos ); + v3_zero( at->cam_1st.angles ); + at->cam_1st.fov = 90.0f; + +#if 0 if( cl_thirdperson ) skate_camera_thirdperson( player, s, av, cam ); else - skate_camera_firstperson( player, s, av, cam ); +#endif + skate_camera_firstperson( player, at ); /* FIXME: Organize this. Its int wrong fucking place */ v3f vp0 = {0.0f,0.1f, 0.6f}, @@ -1577,27 +1570,6 @@ VG_STATIC void player_skate_transport( player_interface *player, player_attachment *at, teleport_gate *gate ) { - struct player_device_skate *s = at->storage; - - m4x3_mulv( gate->transport, player->rb.co, player->rb.co ); - m3x3_mulv( gate->transport, player->rb.v, player->rb.v ); - m4x3_mulv( gate->transport, s->state.cog, s->state.cog ); - m3x3_mulv( gate->transport, s->state.cog_v, s->state.cog_v ); - m3x3_mulv( gate->transport, s->state.vl, s->state.vl ); - m3x3_mulv( gate->transport, s->state.throw_v, s->state.throw_v ); - - v4f transport_rotation; - m3x3_q( gate->transport, transport_rotation ); - q_mul( transport_rotation, player->rb.q, player->rb.q ); - rb_update_transform( &player->rb ); - - s->state.follow_cam_gate = gate; - s->state_gate_storage = s->state; - - if( !cl_thirdperson ) - { - player_apply_transport_to_cam( gate->transport ); - } } VG_STATIC void player_skate_reset( player_interface *player, @@ -1606,7 +1578,8 @@ VG_STATIC void player_skate_reset( player_interface *player, { struct player_device_skate *s = at->storage; v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog ); - s->state.follow_cam_gate = NULL; + + mixedcam_reset( player, &s->state.cam ); } VG_STATIC player_device player_device_skate = @@ -1614,11 +1587,10 @@ VG_STATIC player_device player_device_skate = .pre_update = player_skate_pre_update, .update = player_skate_update, .post_update = player_skate_post_update, - .get_camera = player_skate_get_camera, + .animate = player_skate_animate, + .post_animate = player_skate_post_animate, .debug_ui = player_skate_ui, .bind = player_skate_bind, - .pose = player_skate_pose, - .gate_transport= player_skate_transport, .reset = player_skate_reset };