yo
[carveJwlIkooP6JGAAIwe30JlM.git] / player_device_walk.h
index 3b30d061fa040d808fe4bea56ae1e78d415ef079..c1fbd4fd5ee48bd1235f1c271e42688582508f4f 100644 (file)
@@ -2,9 +2,11 @@
 #define PLAYER_DEVICE_WALK_H
 
 #include "player_interface.h"
+#include "player_device_common.h"
 #include "skeleton.h"
 #include "player_model.h"
 
+VG_STATIC
 struct player_device_walk
 {
    rb_capsule collider;
@@ -26,7 +28,6 @@ struct player_device_walk
    state_gate_storage;
 
    enum mdl_surface_prop surface;
-
    struct skeleton_anim *anim_walk, *anim_run, *anim_idle, *anim_jump;
 
    float blend_fly,
@@ -35,14 +36,41 @@ struct player_device_walk
 
          move_speed,
          walk_timer;
-};
 
-VG_STATIC void player_walk_pre_update( player_interface *player,
-                                       player_attachment *at )
+   u32 device_id_skate;
+}
+localplayer_device_walk;
+
+VG_STATIC void player_walk_pre_update( player_device *dev, 
+                                       player_interface *player )
 {
-   struct player_device_walk *w = at->storage;
+   struct player_device_walk *w = dev->storage;
    player_look( player, w->state.angles );
 
+   if( vg_input_button_down( player->input_use ) )
+   {
+      struct device_transition_skateboard inf;
+
+      v3f xy_speed;
+      v3_copy( player->rb.v, xy_speed );
+      xy_speed[1] = 0.0f;
+
+      if( v3_length2( xy_speed ) > 0.1f * 0.1f )
+      {
+         v3_copy( player->rb.v, inf.dir );
+      }
+      else
+      {
+         inf.dir[0] = -sinf( -w->state.angles[0] );
+         inf.dir[1] =  0.0f;
+         inf.dir[2] = -cosf( -w->state.angles[0] );
+         v3_muls( inf.dir, 1.6f, player->rb.v );
+      }
+
+      player_transition_to_device( player, w->device_id_skate, &inf );
+      return;
+   }
+
 #if 0
    v3f walk = {  player->input_walkh->axis.value,
                  0.0f, 
@@ -96,10 +124,10 @@ VG_STATIC void player_friction( v3f v )
    v3_muls( v, newspeed, v );
 }
 
-VG_STATIC void player_walk_update( player_interface *player,
-                                   player_attachment *at )
+VG_STATIC void player_walk_update( player_device *dev, 
+                                   player_interface *player )
 {
-   struct player_device_walk *w = at->storage;
+   struct player_device_walk *w = dev->storage;
    v3_copy( player->rb.co, w->state.prev_pos );
 
    w->collider.height = 2.0f;
@@ -323,7 +351,7 @@ VG_STATIC void player_walk_update( player_interface *player,
    teleport_gate *gate;
    if( (gate = world_intersect_gates( player->rb.co, w->state.prev_pos )) )
    {
-      struct player_device_walk *w = at->storage;
+      struct player_device_walk *w = dev->storage;
 
       m4x3_mulv( gate->transport, player->rb.co, player->rb.co );
       m3x3_mulv( gate->transport, player->rb.v,  player->rb.v );
@@ -341,10 +369,10 @@ VG_STATIC void player_walk_update( player_interface *player,
    }
 }
 
-VG_STATIC void player_walk_post_update( player_interface *player,
-                                        player_attachment *at )
+VG_STATIC void player_walk_post_update( player_device *dev,
+                                        player_interface *player )
 {
-   struct player_device_walk *w = at->storage;
+   struct player_device_walk *w = dev->storage;
 
    m4x3f mtx;
    m3x3_identity( mtx );
@@ -360,10 +388,10 @@ VG_STATIC void player_walk_post_update( player_interface *player,
 
 }
 
-VG_STATIC void player_walk_animate( player_interface *player,
-                                    player_attachment *at )
+VG_STATIC void player_walk_animate( player_device *dev, 
+                                    player_interface *player )
 {
-   struct player_device_walk *w = at->storage;
+   struct player_device_walk *w = dev->storage;
    struct skeleton *sk = &player->playeravatar->sk;
 
    {
@@ -416,21 +444,21 @@ VG_STATIC void player_walk_animate( player_interface *player,
 
    /* air */
    skeleton_sample_anim( sk, w->anim_jump, vg.time*0.6f, bpose );
-   skeleton_lerp_pose( sk, apose, bpose, w->blend_fly, at->pose );
+   skeleton_lerp_pose( sk, apose, bpose, w->blend_fly, dev->pose );
 
    /* Create transform */
-   rb_extrapolate( &player->rb, at->pose_root_co, at->pose_root_q );
-   q_axis_angle( at->pose_root_q, (v3f){0.0f,1.0f,0.0f}, 
+   rb_extrapolate( &player->rb, dev->pose_root_co, dev->pose_root_q );
+   q_axis_angle( dev->pose_root_q, (v3f){0.0f,1.0f,0.0f}, 
                  -w->state.angles[0]-VG_PIf*0.5f );
 }
 
-VG_STATIC void player_walk_post_animate( player_interface *player,
-                                         player_attachment *at )
+VG_STATIC void player_walk_post_animate( player_device *dev,
+                                         player_interface *player )
 {
    /* 
     * Camera 
     */
-   struct player_device_walk *w = at->storage;
+   struct player_device_walk *w = dev->storage;
    struct player_avatar *av = player->playeravatar;
 
    /* 3RD */
@@ -441,28 +469,34 @@ VG_STATIC void player_walk_post_animate( player_interface *player,
 
    v3_add( player->rb.co, (v3f){0.0f,2.0f,0.0f}, origin );
 
-   v3_muladds( origin, angles[2], 2.0f, at->cam_3rd.pos );
-   v3_muladds( at->cam_3rd.pos, angles[0], 0.5f, at->cam_3rd.pos );
+   v3_muladds( origin, angles[2], 2.0f, dev->cam_3rd.pos );
+   v3_muladds( dev->cam_3rd.pos, angles[0], 0.5f, dev->cam_3rd.pos );
 
    float t;
    v3f n;
-   if( spherecast_world( origin, at->cam_3rd.pos, 0.1f, &t, n ) != -1 )
-      v3_lerp( origin, at->cam_3rd.pos, t, at->cam_3rd.pos );
-   v3_copy( w->state.angles, at->cam_3rd.angles );
-   at->cam_3rd.fov = 90.0f;
+   if( spherecast_world( origin, dev->cam_3rd.pos, 0.1f, &t, n ) != -1 )
+      v3_lerp( origin, dev->cam_3rd.pos, t, dev->cam_3rd.pos );
+   v3_copy( w->state.angles, dev->cam_3rd.angles );
+   dev->cam_3rd.fov = 90.0f;
 
 
    /* 1ST */
    /* FIXME: viewpoint entity */
    v3f vp = {-0.1f,1.8f,0.0f};
-   m4x3_mulv( av->sk.final_mtx[ av->id_head-1 ], vp, at->cam_1st.pos );
-   v3_copy( w->state.angles, at->cam_1st.angles );
-   at->cam_1st.fov = 90.0f;
+   m4x3_mulv( av->sk.final_mtx[ av->id_head-1 ], vp, dev->cam_1st.pos );
+   v3_copy( w->state.angles, dev->cam_1st.angles );
+   dev->cam_1st.fov = 90.0f;
+
+   /* FIXME: Organize this. Its int wrong fucking place */
+   v3f vp0 = {0.0f,0.1f, 0.6f},
+       vp1 = {0.0f,0.1f,-0.6f};
+
+   m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp0, TEMP_BOARD_0 );
+   m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp1, TEMP_BOARD_1 );
 }
 
 
-VG_STATIC void player_walk_ui( player_interface *player,
-                               player_attachment *at )
+VG_STATIC void player_walk_ui( player_device *dev, player_interface *player )
 {
    player_debugtext( 1, "V:  %5.2f %5.2f %5.2f",player->rb.v[0],
                                                 player->rb.v[1],
@@ -472,10 +506,9 @@ VG_STATIC void player_walk_ui( player_interface *player,
                                                 player->rb.co[2] );
 }
 
-VG_STATIC void player_walk_bind( player_interface *player,
-                                 player_attachment *at )
+VG_STATIC void player_walk_bind( player_device *dev, player_interface *player )
 {
-   struct player_device_walk *w = at->storage;
+   struct player_device_walk *w = dev->storage;
    struct player_avatar *av = player->playeravatar;
    struct skeleton *sk = &av->sk;
 
@@ -483,17 +516,59 @@ VG_STATIC void player_walk_bind( player_interface *player,
    w->anim_walk = skeleton_get_anim( sk, "walk" );
    w->anim_run  = skeleton_get_anim( sk, "run" );
    w->anim_jump = skeleton_get_anim( sk, "jump" );
+
+   w->device_id_skate = player_get_device( player, "skateboard" );
+}
+
+VG_STATIC int player_walk_event( player_device *dev, player_interface *player,
+                                 enum player_device_event_type ev, void *data )
+{
+   struct player_device_walk *w = dev->storage;
+
+   if( ev == k_player_device_event_bind )
+   {
+      player_walk_bind( dev, player );
+   }
+   else if( ev == k_player_device_event_custom_transition )
+   {
+      struct device_transition_walk *inf = data;
+      v3_copy( inf->angles, w->state.angles );
+   }
+   else if( ev == k_player_device_event_pre_update )
+   {
+      player_walk_pre_update( dev, player );
+   }
+   else if( ev == k_player_device_event_update )
+   {
+      player_walk_update( dev, player );
+   }
+   else if( ev == k_player_device_event_post_update )
+   {
+      player_walk_post_update( dev, player );
+   }
+   else if( ev == k_player_device_event_animate )
+   {
+      player_walk_animate( dev, player );
+   }
+   else if( ev == k_player_device_event_post_animate )
+   {
+      player_walk_post_animate( dev, player );
+   }
+   else if( ev == k_player_device_event_debug_ui )
+   {
+      player_walk_ui( dev, player );
+   }
+   else
+      return 0;
+
+   return 1;
 }
 
 VG_STATIC player_device player_device_walk =
 {
-   .pre_update    = player_walk_pre_update,
-   .update        = player_walk_update,
-   .post_update   = player_walk_post_update,
-   .debug_ui      = player_walk_ui,
-   .bind          = player_walk_bind,
-   .animate       = player_walk_animate,
-   .post_animate  = player_walk_post_animate
+   .name          = "walk",
+   .event         = player_walk_event,
+   .storage       = &localplayer_device_walk
 };
 
 #endif /* PLAYER_DEVICE_WALK_H */