recycle youre leflet
authorhgn <hgodden00@gmail.com>
Wed, 28 May 2025 21:03:56 +0000 (22:03 +0100)
committerhgn <hgodden00@gmail.com>
Wed, 28 May 2025 21:03:56 +0000 (22:03 +0100)
14 files changed:
content_skaterift/maps/mp_line1/main.mdl
content_skaterift/maps/mp_mtzero/before.mdl
content_skaterift/maps/mp_mtzero/main.mdl
content_skaterift/models/battery.mdl [new file with mode: 0644]
content_skaterift/models/glider.mdl
src/ent_atom.c
src/player.c
src/player.h
src/player_glide.c
src/player_glide.h
src/player_remote.c
src/player_render.c
src/world_map.c
src/world_render.c

index f5e0d8e7117c42e61e1ef1ba9a1dc43197d4fee4..83c567ea5f8455c34e0976e6d4713c3f2f1585bf 100644 (file)
Binary files a/content_skaterift/maps/mp_line1/main.mdl and b/content_skaterift/maps/mp_line1/main.mdl differ
index e000c27c07d71563cb7989ae4561babaec6a63b7..640bbf313497945cb284f97c9b80276c7e3a9c28 100644 (file)
Binary files a/content_skaterift/maps/mp_mtzero/before.mdl and b/content_skaterift/maps/mp_mtzero/before.mdl differ
index 03637628653606d83b0e260ca06a48cc46ce16e0..3134fafb78289755e1bb6b9c4b53c4c8be450bb3 100644 (file)
Binary files a/content_skaterift/maps/mp_mtzero/main.mdl and b/content_skaterift/maps/mp_mtzero/main.mdl differ
diff --git a/content_skaterift/models/battery.mdl b/content_skaterift/models/battery.mdl
new file mode 100644 (file)
index 0000000..5811319
Binary files /dev/null and b/content_skaterift/models/battery.mdl differ
index 0a2ca3c4401a4c09e351c6ba980e3652e3e32674..f230ecc3eeab6e17ac25cc9d4fbe7307c61031e9 100644 (file)
Binary files a/content_skaterift/models/glider.mdl and b/content_skaterift/models/glider.mdl differ
index 24a8494fd3e78fb3784d580150c1a25312a21641..d290cba9af74b628ebe86475b8a502bb6a58ea58 100644 (file)
@@ -105,7 +105,7 @@ entity_event_result _ent_atom_event( ent_event *event )
    {
       if( event->flags & k_ent_event_data_const_i32 )
       {
-         i32 new = _ent_atom_get( event->recieve_entity_id ) | event->data.const_i32;
+         i32 new = _ent_atom_get( event->recieve_entity_id ) & event->data.const_i32;
          _ent_atom_set( event->recieve_entity_id, new );
          vg_info( KBLU "Value of atom '%s' is now %d\n", _ent_atom_name( event->recieve_entity_id ), new );
       }
index 6078f5fc3d94d978c8ddb9804aa3be063d6099c6..54309971509c378a7e2ceb784da5c810f25b9e0d 100644 (file)
@@ -70,9 +70,11 @@ void player_init(void)
    for( u32 i=0; i<k_player_subsystem_max; i++ )
    {
       struct player_subsystem_interface *sys = player_subsystems[i];
-      if( sys->system_register ) sys->system_register();
+      if( sys->system_register ) 
+         sys->system_register();
    }
 
+   vg_console_reg_var( "player_battery", &localplayer.has_battery, k_var_dtype_i32, 0 );
    vg_console_reg_cmd( "respawn", localplayer_cmd_respawn, NULL );
    VG_VAR_F32( k_cam_damp );
    VG_VAR_F32( k_cam_spring );
@@ -85,8 +87,14 @@ void player_init(void)
    vg_console_reg_var( "cinema", &k_cinema, k_var_dtype_f32, 0 );
    vg_console_reg_var( "cinema_fixed", &k_cinema_fixed, k_var_dtype_i32, 0 );
 #endif
-   vg_console_reg_var( "invert_y", &k_invert_y,
-                        k_var_dtype_i32, VG_VAR_PERSISTENT );
+   vg_console_reg_var( "invert_y", &k_invert_y, k_var_dtype_i32, VG_VAR_PERSISTENT );
+
+   void *alloc = vg_mem.rtmemory;
+   mdl_context *mdl = &localplayer.battery;
+   mdl_open( mdl, "models/battery.mdl", alloc );
+   mdl_load_metadata_block( mdl, alloc );
+   mdl_async_full_load_std( mdl, NULL );
+   mdl_close( mdl );
 }
 
 void player__debugtext( ui_context *ctx, int size, const char *fmt, ... )
index 771426b5608e9d97c96a52ebafdae0d6f4835907..b04df1f8f2fb3e9d8e5e979f444658283fd7dbf7 100644 (file)
@@ -136,8 +136,10 @@ struct localplayer
     * Rendering
     */
    mdl_context skeleton_meta;
+   mdl_context battery;
    ms_context animations;
    struct skeleton skeleton;
+   i32 has_battery;
 
    u8 id_hip,
       id_chest,
index e7876ed0f8f4138a79849b71375cbde14b24a629..4899bf4c1e694636f7764e5966f4ccd55aeca52c 100644 (file)
@@ -83,7 +83,8 @@ static i32 k_glide_pause = 0;
 
 void player_glide_pre_update(void)
 {
-   if( button_down(k_srbind_use) ){
+   if( button_down(k_srbind_use) )
+   {
       localplayer.subsystem = k_player_subsystem_skate;
       localplayer.glider_orphan = 1;
 
@@ -474,9 +475,7 @@ void player_glide_bind(void)
 
    /* allocate effects */
    for( u32 i=0; i<VG_ARRAY_LEN(trails_glider); i ++ )
-   {
       trail_alloc( &trails_glider[i], 200 );
-   }
 }
 
 void player_glide_transition(void)
@@ -505,14 +504,11 @@ void player_glide_transition(void)
    player__begin_holdout( (v3f){0,0,0} );
 }
 
-void render_glider_model( vg_camera *cam, world_instance *world,
-                          m4x3f mmdl, enum board_shader shader )
+void render_glider_model( vg_camera *cam, world_instance *world, m4x3f mmdl, enum board_shader shader, mdl_context *mdl )
 {
    u32 current_mat = 0xffffffff;
    glActiveTexture( GL_TEXTURE0 );
-
-   mdl_context *mdl = &player_glide.glider;
-   mesh_bind( &player_glide.glider.mesh );
+   mesh_bind( &mdl->mesh );
 
    for( u32 i=0; i<mdl->mesh_count; i ++ )
    {
@@ -572,8 +568,7 @@ void render_glider_model( vg_camera *cam, world_instance *world,
  *        that can hold that information instead so we can save it into 
  *        the replay
  */
-void player_glide_render( vg_camera *cam, world_instance *world,
-                          player_pose *pose )
+void player_glide_render( vg_camera *cam, world_instance *world, player_pose *pose )
 {
    if( !((localplayer.subsystem == k_player_subsystem_glide) ||
          (localplayer.observing_system == k_player_subsystem_glide) ||
@@ -595,7 +590,8 @@ void player_glide_render( vg_camera *cam, world_instance *world,
    WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, model_board_view );
 
    ms_keyframe kf_res;
-   if( localplayer.glider_orphan ){
+   if( localplayer.glider_orphan )
+   {
       rb_extrapolate( &player_glide.rb, kf_res.co, kf_res.q );
       v3_fill( kf_res.s, 1.0f );
 
@@ -603,7 +599,8 @@ void player_glide_render( vg_camera *cam, world_instance *world,
       q_mulv( kf_res.q, (v3f){0,-0.5f,0}, temp );
       v3_add( temp, kf_res.co, kf_res.co );
    }
-   else {
+   else 
+   {
       f32 target;
       if( localplayer.subsystem == k_player_subsystem_glide ) target = 1.0f;
       else target = 0.0f;
@@ -613,11 +610,8 @@ void player_glide_render( vg_camera *cam, world_instance *world,
          vg_slewf( &player_glide.t, target, vg.time_frame_delta * 4.0f );
 
       ms_keyframe kf_backpack;
-
       struct skeleton *sk = &localplayer.skeleton;
-      m4x3_mulv( localplayer.final_mtx[localplayer.id_chest ],
-            sk->bones[localplayer.id_chest].co, 
-            kf_backpack.co );
+      m4x3_mulv( localplayer.final_mtx[localplayer.id_chest ], sk->bones[localplayer.id_chest].co, kf_backpack.co );
 
       v4f qyaw, qpitch, qchest, q;
       q_axis_angle( qyaw,   (v3f){0,1,0}, VG_TAUf*0.25f );
@@ -629,7 +623,8 @@ void player_glide_render( vg_camera *cam, world_instance *world,
       q_normalize( kf_backpack.q );
 
       f32 scale;
-      if( player_glide.t <= 0.0f ){
+      if( player_glide.t <= 0.0f )
+      {
          f32 st  = player_glide.t + 1.0f,
              sst = vg_smoothstepf(st),
              isst= 1.0f - sst;
@@ -639,18 +634,12 @@ void player_glide_render( vg_camera *cam, world_instance *world,
          q_axis_angle( qspin, (v3f){0,0,1}, VG_TAUf * isst * 0.5f );
          q_mul( kf_backpack.q, qspin, kf_backpack.q );
          kf_backpack.co[1] += isst * 1.0f;
-         v3_muladds( kf_backpack.co, 
-                     localplayer.final_mtx[ localplayer.id_chest ][0],
-                     isst * 0.25f,
-                     kf_backpack.co );
+         v3_muladds( kf_backpack.co, localplayer.final_mtx[ localplayer.id_chest ][0], isst * 0.25f, kf_backpack.co );
       }
-      else{
+      else
          scale = vg_lerpf( 0.2f, 1.0f, vg_smoothstepf(player_glide.t) );
-      }
-
 
       v3_fill( kf_backpack.s, scale );
-
       v3_copy( pose->root_co, kf_res.co );
       v4_copy( pose->root_q, kf_res.q );
       v3_fill( kf_res.s, scale );
@@ -664,7 +653,7 @@ void player_glide_render( vg_camera *cam, world_instance *world,
    m3x3_scale( mmdl, kf_res.s );
    v3_copy( kf_res.co, mmdl[3] );
 
-   render_glider_model( cam, world, mmdl, k_board_shader_player );
+   render_glider_model( cam, world, mmdl, k_board_shader_player, &player_glide.glider );
 
    /* totally FUCKED */
    v4_copy( kf_res.q, player_glide.remote_animator.root_q );
index 2a6676416d8b34e403a36c243e2ee7c99da17b12..8d10d176e33c5c989976ba06026bd0d28833b3af 100644 (file)
@@ -50,7 +50,7 @@ struct player_glide
    u32 trail_count;
    v3f trail_positions[2];
 
-   mdl_context glider;
+   mdl_context glider, battery;
 }
 extern player_glide;
 extern struct player_subsystem_interface player_subsystem_glide;
@@ -69,8 +69,7 @@ bool glider_physics( v2f steer );
 void player_glide_animator_exchange( bitpack_ctx *ctx, void *data );
 void player_glide_render( vg_camera *cam, world_instance *world,
                           player_pose *pose );
-void render_glider_model( vg_camera *cam, world_instance *world,
-                          m4x3f mmdl, enum board_shader shader );
+void render_glider_model( vg_camera *cam, world_instance *world, m4x3f mmdl, enum board_shader shader, mdl_context *mdl );
 void player_glide_remote_animator_exchange( bitpack_ctx *ctx, void *data );
 void player_glide_equip_glider(void);
 void player_glide_render_effects( vg_camera *cam );
index 618b66368a70b96d5e523d83af66761a1d57f056..7bb2a46fda1a1f626243c5cee59695adba2c80b9 100644 (file)
@@ -753,12 +753,13 @@ void render_remote_players( world_instance *world, vg_camera *cam )
       u32 index = draw_list[j];
 
       struct network_player *player = &netplayers.list[index];
-      if( !player->render_glider ) continue;
+      if( !player->render_glider ) 
+         continue;
 
       if( player->render_glider )
       {
          v3f *glider_mtx = netplayers.glider_mtx[ index ];
-         render_glider_model( cam, world, glider_mtx, k_board_shader_entity );
+         render_glider_model( cam, world, glider_mtx, k_board_shader_entity, &player_glide.glider );
       }
    }
 }
index 904b77f7b9099716dc507ef4bd6a7910e7a5d31a..ab42b481d9ecf30bbd7f58e29bf4d9f14ecd6cd9 100644 (file)
@@ -322,88 +322,6 @@ void player__observe_system( enum player_subsystem id )
    }
 }
 
-#if 0
-void player__animate_from_replay( replay_buffer *replay )
-{
-   VG_ASSERT(0);
-   replay_frame *frame = replay->cursor_frame,
-                *next = NULL;
-   if( frame )
-   {
-      next = frame->r;
-
-      struct player_subsystem_interface *sys0 = player_subsystems[frame->system];
-      void *a0 = replay_frame_data( frame, k_replay_framedata_animator );
-
-      struct replay_glider_data 
-         *g0 = replay_frame_data( frame, k_replay_framedata_glider ),
-         *g1;
-
-      f32 t = 0.0f;
-
-      if( next )
-      {
-         t = replay_subframe_time( replay );
-
-         player_pose pose0, pose1;
-         struct player_subsystem_interface *sys1 = player_subsystems[next->system];
-         void *a1 = replay_frame_data( next, k_replay_framedata_animator );
-
-         sys0->pose( a0, &pose0 );
-         sys1->pose( a1, &pose1 );
-
-         lerp_player_pose( &pose0, &pose1, t, &localplayer.pose );
-         g1 = replay_frame_data( next,  k_replay_framedata_glider );
-      }
-      else
-      {
-         sys0->pose( a0, &localplayer.pose );
-         g1 = NULL;
-      }
-
-      player__observe_system( frame->system );
-      if( sys0->sfx_comp ) 
-         sys0->sfx_comp( a0 );
-
-      if( g0 )
-      {
-         if( g0->glider_orphan )
-         {
-            if( g1 )
-            {
-               v3_lerp( g0->co, g1->co, t, player_glide.rb.co );
-               q_nlerp( g0->q,  g1->q,  t, player_glide.rb.q );
-            }
-            else 
-            {
-               v3_copy( g0->co, player_glide.rb.co );
-               v4_copy( g0->q,  player_glide.rb.q );
-            }
-
-            rb_update_matrices( &player_glide.rb );
-         }
-
-         if( g1 )
-            player_glide.t = vg_lerpf( g0->t, g1->t, t );
-         else
-            player_glide.t = g0->t;
-
-         localplayer.have_glider   = g0->have_glider;
-         localplayer.glider_orphan = g0->glider_orphan;
-      }
-      else /* no glider data in g1, or edge case we dont care about */ 
-      {
-         localplayer.have_glider = 0;
-         localplayer.glider_orphan = 0;
-         player_glide.t = 0.0f;
-      }
-   }
-   else return;
-
-   apply_full_skeleton_pose( &localplayer.skeleton, &localplayer.pose, localplayer.final_mtx );
-}
-#endif
-
 void player__pre_render(void)
 {
    /* shadowing/ao info */
@@ -601,6 +519,29 @@ void player__render( vg_camera *cam )
 
    glEnable( GL_CULL_FACE );
    player_glide_render( cam, world, &localplayer.pose );
+
+   if( localplayer.has_battery )
+   {
+      ms_keyframe kf_backpack;
+      struct skeleton *sk = &localplayer.skeleton;
+      m4x3_mulv( localplayer.final_mtx[localplayer.id_chest ], sk->bones[localplayer.id_chest].co, kf_backpack.co );
+
+      v4f qyaw, qpitch, qchest, q;
+      q_axis_angle( qyaw,   (v3f){0,1,0}, VG_TAUf*0.25f );
+      q_axis_angle( qpitch, (v3f){1,0,0}, VG_TAUf*0.25f );
+      m3x3_q( localplayer.final_mtx[ localplayer.id_chest ], qchest );
+      q_mul( qyaw, qpitch, q );
+      q_mul( qchest, q, kf_backpack.q );
+      q_normalize( kf_backpack.q );
+      v3_fill( kf_backpack.s, 0.2f );
+
+      m4x3f mmdl;
+      q_m3x3( kf_backpack.q, mmdl );
+      m3x3_scale( mmdl, kf_backpack.s );
+      v3_copy( kf_backpack.co, mmdl[3] );
+      render_glider_model( cam, world, mmdl, k_board_shader_player, &localplayer.battery );
+   }
+
    glDisable( GL_CULL_FACE );
 }
 
index 0c6271989739d69c0c3d1455b792a393cf6293c6..f6b4957289e359e77c77b272ecbdb1b62d68b566 100644 (file)
@@ -49,6 +49,14 @@ static void respawn_map_draw_icon( vg_camera *cam, enum gui_icon icon, v3f pos,
    m4x4_mulv( cam->mtx.pv, v, v );
    v2_divs( v, v[3], v );
 
+   u32 selected_type = mdl_entity_id_type( world_map.selected_entity_id ),
+       selected_index = mdl_entity_id_id( world_map.selected_entity_id );
+   if( (selected_type == k_ent_spawn) && (world_map.spawn_timer > 0.0f) )
+   {
+      f32 t = vg_smoothstepf( world_map.spawn_timer );
+      size *= t;
+   }
+
    gui_draw_icon( icon, (v2f){ v[0]*0.5f+0.5f,v[1]*0.5f+0.5f }, size );
 }
 
index 24429e34e87aefd8b943cee03fbd4e534de302f7..7a451b0c3dfa04feb1f9aa659c326c4db944b439 100644 (file)
@@ -1065,7 +1065,7 @@ static void render_other_entities( world_instance *world, vg_camera *cam )
           scale = vg_smoothstepf( vg_clampf( 5.0f-dist*5.0f, 0.0f,1.0f ) );
       m3x3_scalef( mdl, scale );
 
-      render_glider_model( cam, world, mdl, k_board_shader_entity );
+      render_glider_model( cam, world, mdl, k_board_shader_entity, &player_glide.glider );
    }
 
    cutscene_render( world, cam );