fix geo crash & backflips
[carveJwlIkooP6JGAAIwe30JlM.git] / player_device_dead.h
index 848e8ecff3bf4bd833f5c52bafbd669c5677607c..56055714d63bf6b24fab80af58f1e60646ee48ef 100644 (file)
@@ -5,84 +5,60 @@
 #include "skeleton.h"
 #include "player_model.h"
 
+VG_STATIC
 struct player_device_dead
 {
-};
-
-VG_STATIC void player_dead_pre_update( player_interface *player,
-                                       player_attachment *at )
-{
-}
-
-VG_STATIC void player_dead_update( player_interface *player,
-                                   player_attachment *at )
-{
-   player_ragdoll_iter( &player->ragdoll );
-}
-
-VG_STATIC void player_dead_post_update( player_interface *player,
-                                        player_attachment *at )
-{
-   copy_ragdoll_pose_to_avatar( &player->ragdoll, player->playeravatar );
+   int _;
 }
+localplayer_device_dead;
 
-VG_STATIC void player_dead_ui( player_interface *player,
-                               player_attachment *at )
-{
-}
-
-VG_STATIC void player_dead_bind( player_interface *player,
-                                 player_attachment *at )
-{
-   copy_avatar_pose_to_ragdoll( player->playeravatar, &player->ragdoll, 
-                                player->rb.v );
-}
-
-VG_STATIC void player_dead_pose( player_interface *player,
-                                 player_attachment *at, 
-                                 player_pose pose, m4x3f transform )
-{
-}
-
-/* FIXME: player_device_common */
-VG_STATIC void player_skate_get_camera( player_interface *player,
-                                        player_attachment *at, camera *cam );
-VG_STATIC void skate_camera_vector_look( camera *cam, v3f v, float C, float k );
-
-VG_STATIC void player_dead_get_camera( player_interface *player,
-                                       player_attachment *at, camera *cam )
-{
-   struct player_avatar *av = player->playeravatar;
-
-   v3f vp = {-0.1f,1.8f,0.0f},
-       vd = {-1.0f,0.0f,0.0f};
-
-   m4x3_mulv( av->sk.final_mtx[ av->id_head-1 ], vp, cam->pos );
-   m3x3_mulv( av->sk.final_mtx[ av->id_head-1 ], vd, vd );
-
-   v3_zero( cam->angles );
-   cam->fov = 119.0f;
-
-   skate_camera_vector_look( cam, vd, 1.0f, 0.0f );
-}
-
-VG_STATIC void player_dead_transport( player_interface *player,
-                                      player_attachment *at,
-                                      teleport_gate *gate )
+VG_STATIC int player_dead_event( player_device *dev, player_interface *player,
+                                 enum player_device_event_type ev, void *data )
 {
+   if( ev == k_player_device_event_update )
+   {
+      player_ragdoll_iter( &player->ragdoll );
+   }
+   else if( ev == k_player_device_event_custom_transition )
+   {
+      copy_avatar_pose_to_ragdoll( player->playeravatar, &player->ragdoll, 
+                                   player->rb.v );
+   }
+   else if( ev == k_player_device_event_animate )
+   {
+      v3_zero( dev->pose_root_co );
+      q_identity( dev->pose_root_q );
+      
+      for( int i=0; i<vg_list_size( dev->pose ); i ++ )
+      {
+         v3_zero( dev->pose[i].co );
+         v3_fill( dev->pose[i].s, 1.0f );
+         q_identity( dev->pose[i].q );
+      }
+   }
+   else if( ev == k_player_device_event_post_animate )
+   {
+      struct player_avatar *av = player->playeravatar;
+
+      v3_zero( dev->cam_1st.pos );
+      v3_zero( dev->cam_1st.angles );
+      dev->cam_1st.fov = 90.0f;
+      
+      /* FIXME: This overwrites pose blending, however, do we need to blend with 
+       * this device, anyway? */
+      copy_ragdoll_pose_to_avatar( &player->ragdoll, player->playeravatar );
+   }
+   else
+      return 0;
+
+   return 1;
 }
 
 VG_STATIC player_device player_device_dead =
 {
-   .pre_update    = player_dead_pre_update,
-   .update        = player_dead_update,
-   .post_update   = player_dead_post_update,
-   .get_camera    = player_dead_get_camera,
-   .debug_ui      = player_dead_ui,
-   .bind          = player_dead_bind,
-#if 0
-   .pose          = player_dead_pose,
-#endif
-   .gate_transport= player_dead_transport
+   .name          = "ragdoll/dead",
+   .event         = player_dead_event,
+   .storage       = &localplayer_device_dead
 };
+
 #endif /* PLAYER_DEVICE_DEAD_H */