completed all glider stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / player_glide.h
index 0794b1c9b9347bca0b7c83ef9f85058bcd5af93b..f8f6dd99dffee4de2a9d85f47d91c8c6b025826f 100644 (file)
@@ -2,9 +2,10 @@
 #define PLAYER_GLIDE_H
 
 #include "player.h"
+#include "trail.h"
 
 struct player_glide {
-   struct skeleton_anim *anim_temp;
+   struct skeleton_anim *anim_glide;
 
    struct player_glide_animator {
       v3f root_co;
@@ -12,6 +13,14 @@ struct player_glide {
    }
    animator;
 
+   /* this sucks */
+   struct remote_glider_animator {
+      v3f root_co;
+      v4f root_q;
+      f32 s;
+   }
+   remote_animator;
+
    v3f info_lift,
        info_slip,
        info_drag;
@@ -20,6 +29,8 @@ struct player_glide {
 
    rigidbody rb;
 
+   f32 t;
+
    struct {
       v3f co, euler;
       m4x3f mdl;
@@ -30,32 +41,69 @@ struct player_glide {
       };
 
       enum rb_shape shape;
+      bool is_damage;
    }
-   parts[3];
+   parts[4];
+
+   u32 trail_count;
+   v3f trail_positions[2];
+
+   mdl_context glider;
+   GLuint *glider_textures;
+   glmesh glider_mesh;
 }
 static player_glide = {
    .parts = {
       {
-         .co    = { 1.0f, 1.0f, -1.0f },
+         .co    = { 1.0f, 0.5f, -1.0f },
          .euler = { VG_TAUf*0.25f,  VG_TAUf*0.125f, 0.0f },
          .shape = k_rb_shape_capsule,
          .inf   = { .h = 2.82842712475f, .r = 0.25f },
       },
       {
-         .co    = { -1.0f, 1.0f, -1.0f },
+         .co    = { -1.0f, 0.5f, -1.0f },
          .euler = { VG_TAUf*0.25f, -VG_TAUf*0.125f, 0.0f },
          .shape = k_rb_shape_capsule,
          .inf   = { .h = 2.82842712475f, .r = 0.25f },
       },
+      {
+         .co    = {  0.0f, 0.5f, 1.0f },
+         .euler = { VG_TAUf*0.25f, VG_TAUf*0.25f, 0.0f },
+         .shape = k_rb_shape_capsule,
+         .inf   = { .h = 6.0f, .r = 0.25f },
+      },
+      {
+         .co    = {  0.0f, -0.5f, 0.0f },
+         .euler = { VG_TAUf*0.25f, VG_TAUf*0.25f, 0.0f },
+         .shape = k_rb_shape_capsule,
+         .inf   = { .h = 2.0f, .r = 0.25f },
+         .is_damage = 1,
+      },
+
+#if 0
       {
          .co    = { 0.0f, 0.0f, 0.0f },
          .euler = { 0.0f, 0.0f, 0.0f },
          .shape = k_rb_shape_sphere,
          .r     = 0.5f
       }
+#endif
    }
 };
 
+static trail_system trails_glider[] = {
+{
+   .width = 0.035f,
+   .lifetime = 5.0f,
+   .min_dist = 0.5f
+},
+{
+   .width = 0.035f,
+   .lifetime = 5.0f,
+   .min_dist = 0.5f
+},
+};
+
 static void player_glide_pre_update(void);
 static void player_glide_update(void);
 static void player_glide_post_update(void);
@@ -65,6 +113,16 @@ static void player_glide_pose( void *animator, player_pose *pose );
 static void player_glide_post_animate(void);
 static void player_glide_im_gui(void);
 static void player_glide_bind(void);
+static void player_glide_transition(void);
+static bool glider_physics( v2f steer );
+static void player_glide_animator_exchange( bitpack_ctx *ctx, void *data );
+static void player_glide_render( camera *cam, world_instance *world,
+                                 player_pose *pose );
+static void render_glider_model( camera *cam, world_instance *world,
+                                 m4x3f mmdl, enum board_shader shader );
+static void 
+player_glide_remote_animator_exchange( bitpack_ctx *ctx, void *data );
+static void player_glide_equip_glider(void);
 
 struct player_subsystem_interface static player_subsystem_glide = {
    .pre_update = player_glide_pre_update,
@@ -73,6 +131,7 @@ struct player_subsystem_interface static player_subsystem_glide = {
    .animate = player_glide_animate,
    .pose = player_glide_pose,
    .post_animate = player_glide_post_animate,
+   .network_animator_exchange = player_glide_animator_exchange,
    .im_gui = player_glide_im_gui,
    .bind = player_glide_bind,