the luxuries of a modern C compiler
[carveJwlIkooP6JGAAIwe30JlM.git] / player.h
1 #ifndef PLAYER_H
2 #define PLAYER_H
3
4 #include "player_ragdoll.h"
5 #include "player_render.h"
6 #include "player_model.h"
7 #include "player_common.h"
8 #include "player_walk.h"
9 #include "player_skate.h"
10 #include "player_dead.h"
11 #include "player_drive.h"
12
13 #define PLAYER_REWIND_FRAMES 60*4
14 #define RESET_MAX_TIME 45.0
15
16 struct player_instance
17 {
18 /* transform definition */
19 rigidbody rb, rb_gate_storage;
20 v3f angles, angles_storage;
21
22 v4f qbasis;
23 m3x3f basis, invbasis, basis_gate;
24 world_instance *viewable_world;
25
26 /*
27 * Camera management
28 * ---------------------------
29 */
30 camera cam;
31
32 enum camera_mode{
33 k_cam_firstperson = 1,
34 k_cam_thirdperson = 0
35 }
36 camera_mode;
37 float camera_type_blend;
38
39 v3f fpv_offset, /* expressed relative to rigidbody */
40 tpv_offset,
41 fpv_viewpoint, /* expressed relative to neck bone inverse final */
42 fpv_offset_smooth,
43 fpv_viewpoint_smooth,
44 tpv_offset_smooth,
45 tpv_lpf,
46 cam_velocity_smooth;
47
48 v3f cam_override_pos;
49 v3f cam_override_angles;
50 float cam_override_fov;
51 float cam_override_strength;
52
53 float cam_velocity_influence,
54 cam_velocity_coefficient,
55 cam_velocity_constant,
56 cam_velocity_coefficient_smooth,
57 cam_velocity_constant_smooth,
58 cam_velocity_influence_smooth,
59 cam_land_punch,
60 cam_land_punch_v;
61
62 ent_gate *gate_waiting;
63
64 int immobile;
65
66 /*
67 * Animation
68 * --------------------------------------------------
69 */
70
71 struct player_avatar *playeravatar;
72 struct player_model *playermodel;
73 struct player_ragdoll ragdoll;
74 //struct player_board *board;
75 struct cache_board *board_view_slot;
76
77 player_pose holdout_pose;
78 float holdout_time;
79
80 /*
81 * Rewind
82 * ----------------------------------------------------
83 */
84 int rewinding, rewind_sound_wait;
85
86 struct rewind_frame{
87 v3f pos;
88 v3f ang;
89 }
90 *rewind_buffer;
91 u32 rewind_length;
92 float rewind_accum;
93 ent_gate *rewind_gate;
94
95 float rewind_total_length, rewind_predicted_time,
96 dist_accum;
97 double rewind_start, rewind_time;
98
99 /*
100 * Subsystems
101 * -------------------------------------------------
102 */
103
104 enum player_subsystem{
105 k_player_subsystem_walk = 0,
106 k_player_subsystem_skate = 1,
107 k_player_subsystem_dead = 2,
108 k_player_subsystem_drive = 3
109 }
110 subsystem,
111 subsystem_gate;
112
113 struct player_skate _skate;
114 struct player_walk _walk;
115 struct player_dead _dead;
116 struct player_drive _drive;
117 }
118 static localplayer;
119
120 /*
121 * Gameloop tables
122 * ---------------------------------------------------------
123 */
124
125 VG_STATIC
126 void (*_player_system_register[])(void) =
127 {
128 player__walk_register,
129 player__skate_register,
130 NULL,
131 NULL
132 };
133
134 VG_STATIC
135 void (*_player_bind[])( player_instance *player ) =
136 {
137 player__walk_bind,
138 player__skate_bind,
139 NULL,
140 player__drive_bind
141 };
142
143 VG_STATIC
144 void (*_player_reset[])( player_instance *player, ent_spawn *rp ) =
145 {
146 player__walk_reset,
147 player__skate_reset,
148 NULL,
149 player__drive_reset
150 };
151
152 VG_STATIC
153 void (*_player_pre_update[])( player_instance *player ) =
154 {
155 player__walk_pre_update,
156 player__skate_pre_update,
157 NULL,
158 player__drive_pre_update
159 };
160
161 VG_STATIC
162 void( *_player_update[])( player_instance *player ) =
163 {
164 player__walk_update,
165 player__skate_update,
166 player__dead_update,
167 player__drive_update
168 };
169
170 VG_STATIC
171 void( *_player_post_update[])( player_instance *player ) =
172 {
173 player__walk_post_update,
174 player__skate_post_update,
175 NULL,
176 player__drive_post_update
177 };
178
179 VG_STATIC
180 void( *_player_im_gui[])( player_instance *player ) =
181 {
182 player__walk_im_gui,
183 player__skate_im_gui,
184 NULL,
185 player__drive_im_gui
186 };
187
188 VG_STATIC
189 void( *_player_animate[])( player_instance *player, player_animation *dest ) =
190 {
191 player__walk_animate,
192 player__skate_animate,
193 player__dead_animate,
194 player__drive_animate
195 };
196
197 VG_STATIC
198 void( *_player_post_animate[])( player_instance *player ) =
199 {
200 player__walk_post_animate,
201 player__skate_post_animate,
202 player__dead_post_animate,
203 player__drive_post_animate
204 };
205
206 VG_STATIC
207 void( *_player_restore[] )( player_instance *player ) =
208 {
209 player__walk_restore,
210 player__skate_restore,
211 NULL,
212 NULL
213 };
214
215 PLAYER_API void player__debugtext( int size, const char *fmt, ... );
216 PLAYER_API void player__create( player_instance *inst );
217 PLAYER_API void player__use_avatar( player_instance *player,
218 struct player_avatar *av );
219 PLAYER_API void player__use_mesh( player_instance *player, glmesh *mesh );
220 PLAYER_API void player__use_texture( player_instance *player, vg_tex2d *tex );
221 PLAYER_API void player__bind( player_instance *player );
222 PLAYER_API void player__pre_update( player_instance *player );
223 PLAYER_API void player__update( player_instance *player );
224 PLAYER_API void player__post_update( player_instance *player );
225
226 PLAYER_API void player__pass_gate( player_instance *player, ent_gate *gate );
227 PLAYER_API void player__im_gui( player_instance *player );
228 PLAYER_API void player__spawn( player_instance *player, ent_spawn *rp );
229 PLAYER_API void player__kill( player_instance *player );
230
231 VG_STATIC int localplayer_cmd_respawn( int argc, const char *argv[] );
232 VG_STATIC void player_apply_transport_to_cam( m4x3f transport );
233
234 #endif /* PLAYER_H */