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