reset run when using lgider
[carveJwlIkooP6JGAAIwe30JlM.git] / player_glide.h
1 #ifndef PLAYER_GLIDE_H
2 #define PLAYER_GLIDE_H
3
4 #include "player.h"
5 #include "trail.h"
6
7 struct player_glide {
8 struct skeleton_anim *anim_glide;
9
10 struct player_glide_animator {
11 v3f root_co;
12 v4f root_q;
13 }
14 animator;
15
16 /* this sucks */
17 struct remote_glider_animator {
18 v3f root_co;
19 v4f root_q;
20 f32 s;
21 }
22 remote_animator;
23
24 v3f info_lift,
25 info_slip,
26 info_drag;
27
28 u32 ticker;
29
30 rigidbody rb;
31
32 f32 t;
33
34 struct {
35 v3f co, euler;
36 m4x3f mdl;
37
38 union {
39 rb_capsule inf;
40 f32 r;
41 };
42
43 enum rb_shape shape;
44 bool is_damage;
45 }
46 parts[4];
47
48 u32 trail_count;
49 v3f trail_positions[2];
50
51 mdl_context glider;
52 GLuint *glider_textures;
53 glmesh glider_mesh;
54 }
55 static player_glide = {
56 .parts = {
57 {
58 .co = { 1.0f, 0.5f, -1.0f },
59 .euler = { VG_TAUf*0.25f, VG_TAUf*0.125f, 0.0f },
60 .shape = k_rb_shape_capsule,
61 .inf = { .h = 2.82842712475f, .r = 0.25f },
62 },
63 {
64 .co = { -1.0f, 0.5f, -1.0f },
65 .euler = { VG_TAUf*0.25f, -VG_TAUf*0.125f, 0.0f },
66 .shape = k_rb_shape_capsule,
67 .inf = { .h = 2.82842712475f, .r = 0.25f },
68 },
69 {
70 .co = { 0.0f, 0.5f, 1.0f },
71 .euler = { VG_TAUf*0.25f, VG_TAUf*0.25f, 0.0f },
72 .shape = k_rb_shape_capsule,
73 .inf = { .h = 6.0f, .r = 0.25f },
74 },
75 {
76 .co = { 0.0f, -0.5f, 0.0f },
77 .euler = { VG_TAUf*0.25f, VG_TAUf*0.25f, 0.0f },
78 .shape = k_rb_shape_capsule,
79 .inf = { .h = 2.0f, .r = 0.25f },
80 .is_damage = 1,
81 },
82
83 #if 0
84 {
85 .co = { 0.0f, 0.0f, 0.0f },
86 .euler = { 0.0f, 0.0f, 0.0f },
87 .shape = k_rb_shape_sphere,
88 .r = 0.5f
89 }
90 #endif
91 }
92 };
93
94 static trail_system trails_glider[] = {
95 {
96 .width = 0.035f,
97 .lifetime = 5.0f,
98 .min_dist = 0.5f
99 },
100 {
101 .width = 0.035f,
102 .lifetime = 5.0f,
103 .min_dist = 0.5f
104 },
105 };
106
107 static void player_glide_pre_update(void);
108 static void player_glide_update(void);
109 static void player_glide_post_update(void);
110 static void player_glide_animate(void);
111 static void player_glide_pose( void *animator, player_pose *pose );
112
113 static void player_glide_post_animate(void);
114 static void player_glide_im_gui(void);
115 static void player_glide_bind(void);
116 static void player_glide_transition(void);
117 static bool glider_physics( v2f steer );
118 static void player_glide_animator_exchange( bitpack_ctx *ctx, void *data );
119 static void player_glide_render( camera *cam, world_instance *world,
120 player_pose *pose );
121 static void render_glider_model( camera *cam, world_instance *world,
122 m4x3f mmdl, enum board_shader shader );
123 static void
124 player_glide_remote_animator_exchange( bitpack_ctx *ctx, void *data );
125 static void player_glide_equip_glider(void);
126
127 struct player_subsystem_interface static player_subsystem_glide = {
128 .pre_update = player_glide_pre_update,
129 .update = player_glide_update,
130 .post_update = player_glide_post_update,
131 .animate = player_glide_animate,
132 .pose = player_glide_pose,
133 .post_animate = player_glide_post_animate,
134 .network_animator_exchange = player_glide_animator_exchange,
135 .im_gui = player_glide_im_gui,
136 .bind = player_glide_bind,
137
138 .animator_data = &player_glide.animator,
139 .animator_size = sizeof(player_glide.animator),
140 .name = "Glide"
141 };
142
143 #endif /* PLAYER_GLIDE_H */