basic dead device and some comments for next time
[carveJwlIkooP6JGAAIwe30JlM.git] / player_interface.h
index f28d7a82ac5b960fd4238cae9b0c72f442c5bd14..acd9e1e9082daace25308df87a95cfa0a8076159 100644 (file)
@@ -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 )
@@ -149,6 +153,8 @@ VG_STATIC void player_use_mesh( player_interface *player, glmesh *mesh )
    player->playermesh = mesh;
 }
 
+/* FIXME: Seperate concepts for binding and equip.
+ */
 VG_STATIC void player_use_device( player_interface *player, player_device *dev,
                                   void *storage )
 {
@@ -162,6 +168,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 +182,43 @@ VG_STATIC void player_update( player_interface *player )
       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 );
@@ -204,16 +243,23 @@ VG_STATIC void player_pre_render( player_interface *player )
    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.. . */
@@ -274,9 +320,19 @@ 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 );
+
+   if( player->dev.device->reset )
+      player->dev.device->reset( player, &player->dev, rp );
+}
+
+VG_STATIC void player_kill( player_interface *player )
+{
+   
 }
 
 /*