chaos pt 1
[carveJwlIkooP6JGAAIwe30JlM.git] / player.h
1 #ifndef PLAYER_H
2 #define PLAYER_H
3
4 #include "skaterift.h"
5 #include "player_common.h"
6 #include "network_compression.h"
7
8 enum player_subsystem{
9 k_player_subsystem_walk = 0,
10 k_player_subsystem_skate = 1,
11 k_player_subsystem_dead = 2,
12 k_player_subsystem_drive = 3,
13 k_player_subsystem_max,
14 k_player_subsystem_invalid = 255
15 };
16
17 struct player_cam_controller {
18 enum camera_mode{
19 k_cam_firstperson = 1,
20 k_cam_thirdperson = 0
21 }
22 camera_mode;
23 f32 camera_type_blend;
24
25 v3f fpv_offset, /* expressed relative to rigidbody */
26 tpv_offset,
27 tpv_offset_extra,
28 fpv_viewpoint, /* expressed relative to neck bone inverse final*/
29 fpv_offset_smooth,
30 fpv_viewpoint_smooth,
31 tpv_offset_smooth,
32 tpv_lpf,
33 cam_velocity_smooth;
34 };
35
36 struct player_subsystem_interface{
37 void(*system_register)(void);
38 void(*bind)(void);
39 void(*pre_update)(void);
40 void(*update)(void);
41 void(*post_update)(void);
42 void(*im_gui)(void);
43 void(*animate)(void);
44 void(*pose)( void *animator, player_pose *pose );
45 void(*post_animate)(void);
46 void(*network_animator_exchange)( bitpack_ctx *ctx, void *data );
47 void(*sfx_oneshot)( u8 id, v3f pos, f32 volume );
48
49 void *animator_data;
50 u32 animator_size;
51
52 const char *name;
53 };
54
55 #include "player_ragdoll.h"
56 #include "player_render.h"
57 #include "player_model.h"
58 #include "player_walk.h"
59 #include "player_skate.h"
60 #include "player_dead.h"
61 #include "player_drive.h"
62 #include "player_replay.h"
63
64 #define PLAYER_REWIND_FRAMES 60*4
65 #define RESET_MAX_TIME 45.0
66
67 static i32 k_cinema_fixed = 0;
68 static f32 k_cinema = 0.0f;
69 static i32 k_invert_y = 0;
70
71 struct {
72 /* transform definition */
73 rigidbody rb;
74 v3f angles;
75
76 v4f qbasis;
77 m3x3f basis, invbasis, basis_gate;
78 world_instance *viewable_world;
79
80 /*
81 * Camera management
82 * ---------------------------
83 */
84 camera cam;
85 struct player_cam_controller cam_control;
86 f32 cam_trackshake;
87
88 float cam_velocity_influence,
89 cam_velocity_coefficient,
90 cam_velocity_constant,
91 cam_velocity_coefficient_smooth,
92 cam_velocity_constant_smooth,
93 cam_velocity_influence_smooth;
94
95 v3f cam_land_punch, cam_land_punch_v;
96 ent_gate *gate_waiting;
97 int immobile;
98
99 /*
100 * Network
101 * --------------------------------------------------
102 */
103 u16 boundary_hash;
104 struct net_sfx {
105 u8 system, priority, id;
106 f32 subframe, volume;
107 v3f location;
108 }
109 sfx_buffer[4];
110 u32 sfx_buffer_count;
111
112 /*
113 * Animation
114 * --------------------------------------------------
115 */
116
117 struct player_ragdoll ragdoll;
118 struct player_model fallback_model;
119
120 u16 board_view_slot, playermodel_view_slot;
121
122 player_pose pose;
123 player_pose holdout_pose;
124 float holdout_time;
125
126 m4x3f *final_mtx;
127
128 /*
129 * Subsystems
130 * -------------------------------------------------
131 */
132
133 enum player_subsystem subsystem; /* .. prev */
134
135 /*
136 * Rendering
137 */
138 mdl_context skeleton_meta;
139 struct skeleton skeleton;
140
141 u32 id_hip,
142 id_chest,
143 id_ik_hand_l,
144 id_ik_hand_r,
145 id_ik_elbow_l,
146 id_ik_elbow_r,
147 id_head,
148 id_ik_foot_l,
149 id_ik_foot_r,
150 id_ik_knee_l,
151 id_ik_knee_r,
152 id_wheel_l,
153 id_wheel_r,
154 id_board;
155 }
156 static localplayer = {
157 .rb = {
158 .co = { 0,0,0 },
159 .w = { 0,0,0 },
160 .v = { 0,0,0 },
161 .q = { 0,0,0,1 },
162 .to_world = M4X3_IDENTITY,
163 .to_local = M4X3_IDENTITY
164 }
165 };
166
167 struct player_subsystem_interface static *player_subsystems[] = {
168 [k_player_subsystem_walk] = &player_subsystem_walk,
169 [k_player_subsystem_dead] = &player_subsystem_dead,
170 [k_player_subsystem_drive] = &player_subsystem_drive,
171 [k_player_subsystem_skate] = &player_subsystem_skate
172 };
173
174 /*
175 * Gameloop tables
176 * ---------------------------------------------------------
177 */
178
179 static void player__debugtext( int size, const char *fmt, ... );
180 static void player__use_mesh( glmesh *mesh );
181 static void player__use_texture( vg_tex2d *tex );
182 static void player__use_model( u16 reg_id );
183
184 static void player__bind(void);
185 static void player__pre_update(void);
186 static void player__update(void);
187 static void player__post_update(void);
188
189 static void player__pass_gate( u32 id );
190 static void player__im_gui(void);
191 static void player__setpos( v3f pos );
192 static void player__spawn( ent_spawn *rp );
193 static void player__reset(void);
194 static void player__kill(void);
195 static void player__begin_holdout( v3f offset );
196
197 static int localplayer_cmd_respawn( int argc, const char *argv[] );
198 static void player_apply_transport_to_cam( m4x3f transport );
199
200 static void player__clear_sfx_buffer(void);
201 static void player__networked_sfx( u8 system, u8 priority, u8 id,
202 v3f pos, f32 volume );
203 static void net_sfx_exchange( bitpack_ctx *ctx, struct net_sfx *sfx );
204 static void net_sfx_play( struct net_sfx *sfx );
205
206 #endif /* PLAYER_H */