*input_reset,
*input_grab;
+ v3f prev_position;
+
struct player_avatar *playeravatar;
glmesh *playermesh;
struct player_ragdoll ragdoll;
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 )
player->playermesh = mesh;
}
+/* FIXME: Seperate concepts for binding and equip.
+ */
VG_STATIC void player_use_device( player_interface *player, player_device *dev,
void *storage )
{
{
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 );
}
player->dev.device->update( player, &player->dev );
}
+VG_STATIC void player_apply_transport_to_cam( m4x3f transport )
+{
+ /* FIXME: Applies to main_camera directly! */
+
+ /* Pre-emptively edit the camera matrices so that the motion vectors
+ * are correct */
+ m4x3f transport_i;
+ m4x4f transport_4;
+ m4x3_invert_affine( 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 );
+}
+
VG_STATIC void player_post_update( player_interface *player )
{
+ /* FIXME: Applies to main_camera directly! */
+
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; i<world.gate_count; i++ )
+ {
+ struct route_gate *rg = &world.gates[i];
+ teleport_gate *gate = &rg->gate;
+
+ 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 );
+ }
+ }
#if 0
camera_update_transform( &player->cam );
player_pose pose;
m4x3f transform;
- player->dev.device->pose( player, &player->dev, pose, transform );
+ /* FIXME: Give devices more control over these render stages, and have
+ * 'API calls'
+ * for this kindof crap instead of it dictating order... */
- struct skeleton *sk = &player->playeravatar->sk;
+ if( player->dev.device->pose )
+ {
+ player->dev.device->pose( player, &player->dev, pose, transform );
+
+ struct skeleton *sk = &player->playeravatar->sk;
- skeleton_apply_pose( sk, pose, k_anim_apply_defer_ik );
- skeleton_apply_ik_pass( sk );
- skeleton_apply_pose( sk, pose, k_anim_apply_deffered_only );
- skeleton_apply_inverses( sk );
- skeleton_apply_transform( sk, transform );
- skeleton_debug( sk );
+ skeleton_apply_pose( sk, pose, k_anim_apply_defer_ik );
+ skeleton_apply_ik_pass( sk );
+ skeleton_apply_pose( sk, pose, k_anim_apply_deffered_only );
+ skeleton_apply_inverses( sk );
+ skeleton_apply_transform( sk, transform );
+ skeleton_debug( sk );
+ }
player->dev.device->get_camera( player, &player->dev, &player->cam );
/* TODO: if dead copy ragdoll.. . */
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 );
+
+ if( player->dev.device->reset )
+ player->dev.device->reset( player, &player->dev, rp );
+}
+
+VG_STATIC void player_kill( player_interface *player )
+{
+
}
/*