* 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;
mesh_bind( &world->mesh_no_collide );
- for( int i=0; i<world->surface_count; i++ ){
+ for( int i=0; i<world->surface_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 );
}
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 );
mesh_bind( &world->mesh_no_collide );
- for( int i=0; i<world->surface_count; i++ ){
+ for( int i=0; i<world->surface_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 );
}
}
}
-#endif /* WATER_C */
+static void world_water_drown(void)
+{
+ 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" );
+ 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;
+}