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