X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_interface.h;h=1b9e16bc6b59528681d277fc0caee1b1a1c43846;hb=38672ec938499ce9e610c3e1848e74880b78a845;hp=f28d7a82ac5b960fd4238cae9b0c72f442c5bd14;hpb=07d0834b13ecf5de312cf3578e8aca8f106f5ef1;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_interface.h b/player_interface.h index f28d7a8..1b9e16b 100644 --- a/player_interface.h +++ b/player_interface.h @@ -38,6 +38,8 @@ struct player_interface *input_reset, *input_grab; + v3f prev_position; + struct player_avatar *playeravatar; glmesh *playermesh; struct player_ragdoll ragdoll; @@ -67,6 +69,8 @@ struct player_device void (* store_state)( player_interface *player, player_attachment *at ); void (* load_state) ( player_interface *player, player_attachment *at ); void (* debug_ui) ( player_interface *player, player_attachment *at ); + void (* gate_transport)( player_interface *player, player_attachment *at, + teleport_gate *gate ); }; VG_STATIC void player_interface_create_player( player_interface *inst ) @@ -162,6 +166,8 @@ VG_STATIC void player_pre_update( player_interface *player ) { assert( player->dev.device ); + v3_copy( player->rb.co, player->prev_position ); + if( player->dev.device->pre_update ) player->dev.device->pre_update( player, &player->dev ); } @@ -174,12 +180,37 @@ VG_STATIC void player_update( player_interface *player ) player->dev.device->update( player, &player->dev ); } -VG_STATIC void player_post_update( player_interface *player ) +VG_STATIC void player_post_update( player_interface *player, + camera *main_camera ) { assert( player->dev.device ); if( player->dev.device->post_update ) player->dev.device->post_update( player, &player->dev ); + + /* FIXME: only need to test against the visible gate.... + * OR... bvh */ + + for( int i=0; igate; + + if( gate_intersect( gate, player->rb.co, player->prev_position ) ) + { + player->dev.device->gate_transport( player, &player->dev, gate ); + v3_copy( player->rb.co, player->prev_position ); + + /* Pre-emptively edit the camera matrices so that the motion vectors + * are correct */ + m4x3f transport_i; + m4x4f transport_4; + m4x3_invert_affine( gate->transport, transport_i ); + m4x3_expand( transport_i, transport_4 ); + m4x4_mul( main_camera->mtx.pv, transport_4, main_camera->mtx.pv ); + m4x4_mul( main_camera->mtx.v, transport_4, main_camera->mtx.v ); + } + } #if 0 camera_update_transform( &player->cam ); @@ -274,9 +305,11 @@ VG_STATIC void player_spawn( player_interface *player, struct respawn_point *rp ) { v3_copy( rp->co, player->rb.co ); + v3_copy( rp->co, player->prev_position ); v3_zero( player->rb.v ); v3_zero( player->rb.w ); q_identity( player->rb.q ); + rb_update_transform( &player->rb ); } /*