fov slider input maps menu stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / world_water.h
index 656f1b2350afa588117d1a80f8a47a3dddab1093..4281981c5549376742e930e0883eb2ee22b5b240 100644 (file)
@@ -8,6 +8,7 @@
 #include "world.h"
 #include "render.h"
 #include "shaders/water.h"
+#include "shaders/water_fast.h"
 #include "scene.h"
 
 vg_tex2d tex_water_surf = { .path = "textures/water_surf.qoi" };
@@ -16,6 +17,7 @@ VG_STATIC void world_water_init(void)
 {
    vg_info( "world_water_init\n" );
    shader_water_register();
+   shader_water_fast_register();
 
    vg_acquire_thread_sync();
    {
@@ -51,7 +53,7 @@ VG_STATIC void water_set_surface( float height )
 
 VG_STATIC void render_water_texture( m4x3f camera )
 {
-   if( !world.water.enabled )
+   if( !world.water.enabled || (vg.quality_profile == k_quality_profile_low) )
       return;
 
    /* Draw reflection buffa */
@@ -125,42 +127,92 @@ VG_STATIC void render_water_surface( m4x4f pv, m4x3f camera )
    if( !world.water.enabled )
       return;
 
-   /* Draw surface */
-   shader_water_use();
-   
-   fb_bindtex( &world.water.fbreflect, 0 );
-   shader_water_uTexMain( 0 );
+   if( vg.quality_profile == k_quality_profile_high )
+   {
+      /* Draw surface */
+      shader_water_use();
+      
+      fb_bindtex( &world.water.fbreflect, 0 );
+      shader_water_uTexMain( 0 );
+
+      vg_tex2d_bind( &tex_water_surf, 1 );
+      shader_water_uTexDudv( 1 );
+      shader_water_uInvRes( (v2f){
+            1.0f / (float)vg.window_x,
+            1.0f / (float)vg.window_y });
+
+      shader_link_standard_ub( _shader_water.id, 2 );
+
+      fb_bindtex( &world.water.fbdepth, 3 );
+      shader_water_uTexBack( 3 );
+      shader_water_uTime( world.time );
+      shader_water_uCamera( camera[3] );
+      shader_water_uSurfaceY( world.water.height );
+
+      shader_water_uPv( pv );
+
+      m4x3f full;
+      m4x3_identity( full );
+      shader_water_uMdl( full );
 
-   vg_tex2d_bind( &tex_water_surf, 1 );
-   shader_water_uTexDudv( 1 );
-   shader_water_uInvRes( (v2f){
-         1.0f / (float)vg.window_x,
-         1.0f / (float)vg.window_y });
+      glEnable(GL_BLEND);
+      glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+      glBlendEquation(GL_FUNC_ADD);
 
-   shader_link_standard_ub( _shader_water.id, 2 );
+      mesh_bind( &world.mesh_no_collide );
 
-   fb_bindtex( &world.water.fbdepth, 3 );
-   shader_water_uTexBack( 3 );
-   shader_water_uTime( world.time );
-   shader_water_uCamera( camera[3] );
-   shader_water_uSurfaceY( world.water.height );
+      for( int i=0; i<world.material_count; i++ )
+      {
+         struct world_material *mat = &world.materials[i];
 
-   shader_water_uPv( pv );
+         if( mat->info.shader == k_shader_water )
+         {
+            shader_water_uShoreColour( mat->info.colour );
+            shader_water_uOceanColour( mat->info.colour1 );
 
-   m4x3f full;
-   m4x3_identity( full );
-   full[3][1] = world.water.height;
+            mdl_draw_submesh( &mat->sm_no_collide );
+         }
+      }
 
-   shader_water_uMdl( full );
+      glDisable(GL_BLEND);
+   }
+   else if( vg.quality_profile == k_quality_profile_low )
+   {
+      shader_water_fast_use();
+
+      vg_tex2d_bind( &tex_water_surf, 1 );
+      shader_water_fast_uTexDudv( 1 );
+      shader_water_fast_uTime( world.time );
+      shader_water_fast_uCamera( camera[3] );
+      shader_water_fast_uSurfaceY( world.water.height );
+      shader_link_standard_ub( _shader_water_fast.id, 2 );
+
+      m4x3f full;
+      m4x3_identity( full );
+      shader_water_fast_uMdl( full );
+      shader_water_fast_uPv( pv );
 
-   glEnable(GL_BLEND);
-   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-   glBlendEquation(GL_FUNC_ADD);
+      glEnable(GL_BLEND);
+      glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+      glBlendEquation(GL_FUNC_ADD);
 
-   mesh_bind( &world.mesh_water );
-   mesh_draw( &world.mesh_water );
+      mesh_bind( &world.mesh_no_collide );
 
-   glDisable(GL_BLEND);
+      for( int i=0; i<world.material_count; i++ )
+      {
+         struct world_material *mat = &world.materials[i];
+
+         if( mat->info.shader == k_shader_water )
+         {
+            shader_water_fast_uShoreColour( mat->info.colour );
+            shader_water_fast_uOceanColour( mat->info.colour1 );
+
+            mdl_draw_submesh( &mat->sm_no_collide );
+         }
+      }
+
+      glDisable(GL_BLEND);
+   }
 }
 
 #endif /* WATER_H */