up network version
[carveJwlIkooP6JGAAIwe30JlM.git] / player.h
index 6315e1a219c9dadb4b53cae73bdb73bb293585dd..ad152270328d8f2d633885ee105bd95a098565ea 100644 (file)
--- a/player.h
+++ b/player.h
@@ -2,12 +2,19 @@
 #define PLAYER_H
 
 #include "skaterift.h"
+#include "player_common.h"
+#include "network_compression.h"
+#include "player_effects.h"
 
 enum player_subsystem{
    k_player_subsystem_walk = 0,
    k_player_subsystem_skate = 1,
    k_player_subsystem_dead = 2,
-   k_player_subsystem_drive = 3
+   k_player_subsystem_drive = 3,
+   k_player_subsystem_basic_info = 4,
+   k_player_subsystem_glide = 5,
+   k_player_subsystem_max,
+   k_player_subsystem_invalid = 255
 };
 
 struct player_cam_controller {
@@ -29,14 +36,43 @@ struct player_cam_controller {
        cam_velocity_smooth;
 };
 
+struct player_subsystem_interface{
+   void(*system_register)(void);
+   void(*bind)(void);
+   void(*pre_update)(void);
+   void(*update)(void);
+   void(*post_update)(void);
+   void(*im_gui)(void);
+   void(*animate)(void);
+   void(*pose)( void *animator, player_pose *pose );
+   void(*effects)( void *animator, m4x3f *final_mtx, struct player_board *board,
+                   struct player_effects_data *effect_data );
+   void(*post_animate)(void);
+
+   void(*network_animator_exchange)( bitpack_ctx *ctx, void *data );
+   void(*sfx_oneshot)( u8 id, v3f pos, f32 volume );
+
+   void(*sfx_comp)(void *animator);
+   void(*sfx_kill)(void);
+
+   void *animator_data;
+   u32 animator_size;
+
+   const char *name;
+};
+
 #include "player_ragdoll.h"
 #include "player_render.h"
 #include "player_model.h"
-#include "player_common.h"
+
+/* subsystem headers */
 #include "player_walk.h"
 #include "player_skate.h"
 #include "player_dead.h"
 #include "player_drive.h"
+#include "player_glide.h"
+#include "player_basic_info.h"
+
 #include "player_replay.h"
 
 #define PLAYER_REWIND_FRAMES 60*4
@@ -45,15 +81,14 @@ struct player_cam_controller {
 static i32 k_cinema_fixed = 0;
 static f32 k_cinema       = 0.0f;
 static i32 k_invert_y     = 0;
+static f32 k_cam_dist     = 1.8f;
 
-struct player_instance{
+struct {
    /* transform definition */
    rigidbody rb;
    v3f angles;
 
-   v4f   qbasis;
-   m3x3f basis, invbasis, basis_gate;
-   world_instance *viewable_world;
+   bool have_glider, glider_orphan;
 
    /*
     * Camera management
@@ -68,168 +103,138 @@ struct player_instance{
          cam_velocity_constant,
          cam_velocity_coefficient_smooth,
          cam_velocity_constant_smooth,
-         cam_velocity_influence_smooth;
+         cam_velocity_influence_smooth,
+         cam_dist,
+         cam_dist_smooth;
 
    v3f cam_land_punch, cam_land_punch_v;
    ent_gate *gate_waiting;
+   int deferred_frame_record;
 
    int immobile;
 
+   int rewinded_since_last_gate;
+
+   /* 
+    * Network
+    * --------------------------------------------------
+    */
+   u16 boundary_hash;
+   struct net_sfx {
+      u8 system, priority, id;
+      f32 subframe, volume;
+      v3f location;
+   }
+   sfx_buffer[4],             /* large timeframe 1/10s; for networking */
+   local_sfx_buffer[2];       /* per framerate 1/30s; for replay */
+   u32 sfx_buffer_count, 
+       local_sfx_buffer_count;
+
    /*
     * Animation
     * --------------------------------------------------
     */
 
-   struct player_avatar  *playeravatar;
    struct player_ragdoll  ragdoll;
    struct player_model    fallback_model;
+   struct player_board    fallback_board;
 
    u16 board_view_slot, playermodel_view_slot;
 
+   player_pose            pose;
    player_pose            holdout_pose;
    float                  holdout_time;
 
-   struct board_pose      board_pose;
+   m4x3f                 *final_mtx;
 
    /*
     * Subsystems
     * -------------------------------------------------
     */
 
-   enum player_subsystem subsystem; /* .. prev */
+   enum player_subsystem subsystem, 
+                         observing_system; 
 
-   struct player_skate  _skate;
-   struct player_walk   _walk;
-   struct player_dead   _dead;
-   struct player_drive  _drive;
+   /*
+    * Rendering
+    */
+   mdl_context skeleton_meta;
+   struct skeleton skeleton;
+
+   u8 id_hip,
+      id_chest,
+      id_ik_hand_l,
+      id_ik_hand_r,
+      id_ik_elbow_l,
+      id_ik_elbow_r,
+      id_head,
+      id_foot_l,
+      id_foot_r,
+      id_ik_foot_l,
+      id_ik_foot_r,
+      id_ik_knee_l,
+      id_ik_knee_r,
+      id_wheel_l,
+      id_wheel_r,
+      id_board,
+      id_eyes,
+      id_world;
+
+   u8 skeleton_mirror[32];
+
+   struct player_effects_data effect_data;
 }
-static localplayer;
+static localplayer = {
+   .rb = {
+      .co = { 0,0,0 },
+      .w = { 0,0,0 },
+      .v = { 0,0,0 },
+      .q = { 0,0,0,1 },
+      .to_world = M4X3_IDENTITY,
+      .to_local = M4X3_IDENTITY
+   }
+};
+
+struct player_subsystem_interface static *player_subsystems[] = {
+   [k_player_subsystem_walk]  = &player_subsystem_walk,
+   [k_player_subsystem_dead]  = &player_subsystem_dead,
+   [k_player_subsystem_drive] = &player_subsystem_drive,
+   [k_player_subsystem_skate] = &player_subsystem_skate,
+   [k_player_subsystem_basic_info]=&player_subsystem_basic_info,
+   [k_player_subsystem_glide] = &player_subsystem_glide,
+};
 
 /*
  * Gameloop tables
  * ---------------------------------------------------------
  */
 
-VG_STATIC
-void (*_player_system_register[])(void) =
-{
-   player__walk_register,
-   player__skate_register,
-   NULL,
-   NULL
-};
-
-VG_STATIC
-void (*_player_bind[])( player_instance *player ) =
-{
-   player__walk_bind,
-   player__skate_bind,
-   NULL,
-   player__drive_bind
-};
-
-VG_STATIC
-void (*_player_reset[])( player_instance *player, ent_spawn *rp ) =
-{
-   player__walk_reset,
-   player__skate_reset,
-   NULL,
-   player__drive_reset
-};
-
-VG_STATIC
-void (*_player_pre_update[])( player_instance *player ) = 
-{
-   player__walk_pre_update,
-   player__skate_pre_update,
-   NULL,
-   player__drive_pre_update
-};
-
-VG_STATIC
-void( *_player_update[])( player_instance *player ) =
-{
-   player__walk_update,
-   player__skate_update,
-   player__dead_update,
-   player__drive_update
-};
-
-VG_STATIC 
-void( *_player_post_update[])( player_instance *player ) =
-{
-   player__walk_post_update,
-   player__skate_post_update,
-   NULL,
-   player__drive_post_update
-};
-
-VG_STATIC
-void( *_player_im_gui[])( player_instance *player ) =
-{
-   player__walk_im_gui,
-   player__skate_im_gui,
-   NULL,
-   player__drive_im_gui
-};
-
-VG_STATIC
-void( *_player_animate[])( player_instance *player, player_animation *dest ) =
-{
-   player__walk_animate,
-   player__skate_animate,
-   player__dead_animate,
-   player__drive_animate
-};
-
-VG_STATIC
-void( *_player_post_animate[])( player_instance *player ) =
-{
-   player__walk_post_animate,
-   player__skate_post_animate,
-   player__dead_post_animate,
-   player__drive_post_animate
-};
-
-VG_STATIC
-void( *_player_store_state[] )( player_instance *player ) = 
-{
-   NULL,
-   NULL,
-   NULL,
-   NULL
-};
-
-VG_STATIC
-void( *_player_load_state_lerp[] )( player_instance *player, 
-                                    void *A, void *B, f32 t ) =
-{
-   NULL,
-   NULL,
-   NULL,
-   NULL
-};
-
-PLAYER_API void player__debugtext( int size, const char *fmt, ... );
-PLAYER_API void player__create( player_instance *inst );
-PLAYER_API void player__use_avatar( player_instance *player, 
-                                    struct player_avatar *av );
-PLAYER_API void player__use_mesh( player_instance *player, glmesh *mesh );
-PLAYER_API void player__use_texture( player_instance *player, vg_tex2d *tex );
-PLAYER_API void player__use_model( player_instance *player, u16 reg_id );
-
-PLAYER_API void player__bind( player_instance *player );
-PLAYER_API void player__pre_update( player_instance *player );
-PLAYER_API void player__update( player_instance *player );
-PLAYER_API void player__post_update( player_instance *player );
-
-PLAYER_API void player__pass_gate( player_instance *player, ent_gate *gate );
-PLAYER_API void player__im_gui( player_instance *player );
-PLAYER_API void player__setpos( player_instance *player, v3f pos );
-PLAYER_API void player__spawn( player_instance *player, ent_spawn *rp );
-PLAYER_API void player__kill( player_instance *player );
-
-VG_STATIC int localplayer_cmd_respawn( int argc, const char *argv[] );
-VG_STATIC void player_apply_transport_to_cam( m4x3f transport );
+static void player__debugtext( int size, const char *fmt, ... );
+static void player__use_mesh( glmesh *mesh );
+static void player__use_texture( vg_tex2d *tex );
+static void player__use_model( u16 reg_id );
+
+static void player__bind(void);
+static void player__pre_update(void);
+static void player__update(void);
+static void player__post_update(void);
+
+static void player__pass_gate( u32 id );
+static void player__im_gui(void);
+static void player__setpos( v3f pos );
+static void player__spawn( ent_spawn *rp );
+static void player__clean_refs(void);
+static void player__reset(void);
+static void player__kill(void);
+static void player__begin_holdout( v3f offset );
+
+static int localplayer_cmd_respawn( int argc, const char *argv[] );
+static void player_apply_transport_to_cam( m4x3f transport );
+
+static void player__clear_sfx_buffer(void);
+static void player__networked_sfx( u8 system, u8 priority, u8 id, 
+                                   v3f pos, f32 volume );
+static void net_sfx_exchange( bitpack_ctx *ctx, struct net_sfx *sfx );
+static void net_sfx_play( struct net_sfx *sfx );
 
 #endif /* PLAYER_H */