water fog material prop; ragdoll float only on drowned
authorhgn <hgodden00@gmail.com>
Fri, 29 Mar 2024 13:00:35 +0000 (13:00 +0000)
committerhgn <hgodden00@gmail.com>
Fri, 29 Mar 2024 13:00:35 +0000 (13:00 +0000)
maps_src/mp_line1/main.mdl
player.c
player.h
player_ragdoll.c
player_replay.c
player_replay.h
world.h
world_gen.c
world_load.c
world_water.c

index 21dc6eed471718ae673e7b728ee5cf367d419a42..681c8b9b1a4ee9a3a54cbc9765f7ed1ef510d0e2 100644 (file)
Binary files a/maps_src/mp_line1/main.mdl and b/maps_src/mp_line1/main.mdl differ
index 8321fee13448d4f5684a0d4bc79da66ba5f908ca..a60c8c2613aae02452ee8aae98bd0be3724847ab 100644 (file)
--- a/player.c
+++ b/player.c
@@ -330,6 +330,7 @@ void player__reset(void)
    localplayer.gate_waiting = NULL;
    localplayer.have_glider = 0;
    localplayer.glider_orphan = 0;
+   localplayer.drowned = 0;
 
    v3_copy( localplayer.rb.co, localplayer.cam_control.tpv_lpf );
    player__clean_refs();
index 69da5094133bfcaff8afec76f7962d8d141ffccc..ea4ef46605d5a7ad5a0e03359fa42610eda2d398 100644 (file)
--- a/player.h
+++ b/player.h
@@ -63,7 +63,7 @@ struct localplayer
    rigidbody rb;
    v3f angles;
 
-   bool have_glider, glider_orphan;
+   bool have_glider, glider_orphan, drowned;
 
    /*
     * Camera management
index 84908ffee0fe946a4dca9d249673abbaadfcc463..6f9d430c56cefff23fe7ca69ed577f8e0597327b 100644 (file)
@@ -433,11 +433,14 @@ void player_ragdoll_iter( struct player_ragdoll *rd )
       }
    }
 
-   if( world->water.enabled ){
-      for( int j=0; j<rd->part_count; j++ ){
+   if( localplayer.drowned )
+   {
+      for( int j=0; j<rd->part_count; j++ )
+      {
          struct ragdoll_part *pj = &rd->parts[j];
 
-         if( run_sim ){
+         if( run_sim )
+         {
             rb_effect_simple_bouyency( &pj->rb, world->water.plane,
                                         k_ragdoll_floatyiness,
                                         k_ragdoll_floatydrag );
index 15bbd477ca2597c95dd6542b25435fe5dc43395a..7abd993d5659cf370b661004acc70cfaefd96b98 100644 (file)
@@ -442,6 +442,7 @@ void skaterift_record_frame( replay_buffer *replay, int force_gamestate )
          replay_frame_data( frame, k_replay_framedata_internal_gamestate );
 
       gs->current_run_version = world_static.current_run_version;
+      gs->drowned = localplayer.drowned;
 
       /* permanent block */
       memcpy( &gs->rb, &localplayer.rb, sizeof(rigidbody) );
@@ -521,13 +522,14 @@ void skaterift_record_frame( replay_buffer *replay, int force_gamestate )
    localplayer.local_sfx_buffer_count = 0;
 }
 
-static
-void skaterift_restore_frame( replay_frame *frame ){
+static void skaterift_restore_frame( replay_frame *frame )
+{
    replay_gamestate *gs = 
       replay_frame_data( frame, k_replay_framedata_internal_gamestate );
    void *src = replay_frame_data( frame, k_replay_framedata_gamestate );
    u16 src_size = frame->data_table[ k_replay_framedata_gamestate ][1];
    world_static.current_run_version = gs->current_run_version;
+   localplayer.drowned = gs->drowned;
 
    if(frame->system == k_player_subsystem_walk ){
       memcpy( &player_walk.state, src, src_size );
index d6e229372da30654926756111a22f8378bd2ce7b..e97584cceee54949a2f01480af7f132bc65c088c 100644 (file)
@@ -59,6 +59,7 @@ struct replay_gamestate
    v3f angles;
    struct player_cam_controller cam_control;
    u32 current_run_version;
+   bool drowned;
 };
 
 /* we save this per-anim-frame. if there glider is existing in any state */
diff --git a/world.h b/world.h
index d9b4439b5ac3f331d5ab5bbeb6ea57d99aab93c0..efa5f9d0e8b54b8e308a7e8a095c2e364bdd9d73 100644 (file)
--- a/world.h
+++ b/world.h
@@ -215,8 +215,7 @@ struct world_instance {
    /* graphics */
    glmesh mesh_route_lines;
    glmesh mesh_geo, 
-          mesh_no_collide,
-          mesh_water;
+          mesh_no_collide;
    u32 cubemap_cooldown, cubemap_side;
 
    /* leaderboards */
index 3d88ecd72f87312d9f6e2ef389005c73b444675f..04d6131ec51e52da759a0ddf27b57a8592327576 100644 (file)
@@ -758,6 +758,12 @@ void world_gen_load_surfaces( world_instance *world )
       surf->info = *(mdl_material *)mdl_arritm( &world->meta.materials, i );
       surf->flags = 0;
 
+      if( surf->info.shader == k_shader_water )
+      {
+         struct shader_props_water *props = surf->info.props.compiled;
+         world->ub_lighting.g_water_fog = props->fog_scale;
+      }
+
       if( surf->info.shader == k_shader_standard_cutout ||
           surf->info.shader == k_shader_foliage )
       {
index cf1032ec540a8db0ea935a38c969e02ac086b2d4..5a2861351c7d75956caebbf3bdfbc532f6392fc8 100644 (file)
@@ -471,7 +471,6 @@ void world_free( world_instance *world )
    mesh_free( &world->mesh_route_lines );
    mesh_free( &world->mesh_geo );
    mesh_free( &world->mesh_no_collide );
-   mesh_free( &world->mesh_water );
    
    /* glDeleteBuffers silently ignores 0's and names that do not correspond to 
     * existing buffer objects. 
index dc8206b57218ec989891930351bb1266256e0412..38038bf715b1c6d0817a84b1bd91086340f2c9b4 100644 (file)
@@ -227,10 +227,12 @@ void render_water_surface( world_instance *world, vg_camera *cam )
 
 static void world_water_drown(void)
 {
+   if( localplayer.drowned ) return;
    player__networked_sfx( k_player_subsystem_walk, 32, 
                           k_player_walk_soundeffect_splash,
                           localplayer.rb.co, 1.0f );
    vg_info( "player fell of due to walking into walker\n" );
+   localplayer.drowned = 1;
    player__dead_transition( k_player_die_type_generic );
 }