X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_water.c;h=38038bf715b1c6d0817a84b1bd91086340f2c9b4;hb=refs%2Fheads%2Fmaster;hp=0c6ac541064b2b353623dcd8a639490f89824d59;hpb=5f6a4f9df6c8accc89f1920bfe9ace3cbac4c4b6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_water.c b/world_water.c index 0c6ac54..38038bf 100644 --- a/world_water.c +++ b/world_water.c @@ -2,15 +2,15 @@ * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved */ -#ifndef WATER_C -#define WATER_C - #include "world_water.h" #include "world_render.h" #include "render.h" #include "shaders/scene_water.h" #include "shaders/scene_water_fast.h" #include "scene.h" +#include "player.h" +#include "player_walk.h" +#include "player_dead.h" struct world_water world_water; @@ -161,12 +161,18 @@ void render_water_surface( world_instance *world, vg_camera *cam ) mesh_bind( &world->mesh_no_collide ); - for( int i=0; isurface_count; i++ ){ + for( int i=0; isurface_count; i++ ) + { struct world_surface *mat = &world->surfaces[i]; + struct shader_props_water *props = mat->info.props.compiled; - if( mat->info.shader == k_shader_water ){ - shader_scene_water_uShoreColour( mat->info.colour ); - shader_scene_water_uOceanColour( mat->info.colour1 ); + if( mat->info.shader == k_shader_water ) + { + shader_scene_water_uShoreColour( props->shore_colour ); + shader_scene_water_uOceanColour( props->deep_colour ); + shader_scene_water_uFresnel( props->fresnel ); + shader_scene_water_uWaterScale( props->water_sale ); + shader_scene_water_uWaveSpeed( props->wave_speed ); mdl_draw_submesh( &mat->sm_no_collide ); } @@ -175,7 +181,8 @@ void render_water_surface( world_instance *world, vg_camera *cam ) glDisable(GL_BLEND); } else if( (vg.quality_profile == k_quality_profile_low) || - (vg.quality_profile == k_quality_profile_min) ){ + (vg.quality_profile == k_quality_profile_min) ) + { shader_scene_water_fast_use(); glActiveTexture( GL_TEXTURE1 ); @@ -200,12 +207,15 @@ void render_water_surface( world_instance *world, vg_camera *cam ) mesh_bind( &world->mesh_no_collide ); - for( int i=0; isurface_count; i++ ){ + for( int i=0; isurface_count; i++ ) + { struct world_surface *mat = &world->surfaces[i]; + struct shader_props_water *props = mat->info.props.compiled; - if( mat->info.shader == k_shader_water ){ - shader_scene_water_fast_uShoreColour( mat->info.colour ); - shader_scene_water_fast_uOceanColour( mat->info.colour1 ); + if( mat->info.shader == k_shader_water ) + { + shader_scene_water_fast_uShoreColour( props->shore_colour ); + shader_scene_water_fast_uOceanColour( props->deep_colour ); mdl_draw_submesh( &mat->sm_no_collide ); } @@ -215,4 +225,38 @@ void render_water_surface( world_instance *world, vg_camera *cam ) } } -#endif /* WATER_C */ +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 ); +} + +bool world_water_player_safe( world_instance *world, f32 allowance ) +{ + if( !world->water.enabled ) return 1; + if( world->info.flags & 0x2 ) return 1; + + if( localplayer.rb.co[1]+allowance < world->water.height ) + { + world_water_drown(); + return 0; + } + + return 1; +} + +entity_call_result ent_water_call( world_instance *world, ent_call *call ) +{ + if( call->function == 0 ) + { + world_water_drown(); + return k_entity_call_result_OK; + } + + return k_entity_call_result_unhandled; +}