option between water plane / water trigger
[carveJwlIkooP6JGAAIwe30JlM.git] / world_water.c
index 0c6ac541064b2b353623dcd8a639490f89824d59..dc8206b57218ec989891930351bb1266256e0412 100644 (file)
@@ -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; 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 );
          }
@@ -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; 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 );
          }
@@ -215,4 +225,36 @@ void render_water_surface( world_instance *world, vg_camera *cam )
    }
 }
 
-#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;
+}