X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=water.h;h=bcd0c6847d44ca840d66b8694840bbe6fbad2351;hb=dfee9022b3513fddec36f7ea70867ee5961a44da;hp=83a6cf82cded97e1fbd334ea525f791b24d705ac;hpb=a6e1ee0f51aa5570b20aad658365dec896f8c9b8;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/water.h b/water.h index 83a6cf8..bcd0c68 100644 --- a/water.h +++ b/water.h @@ -1,10 +1,17 @@ +#include "common.h" +#include "model.h" + +static void water_register(void); +static void water_init(void); +static void water_fb_resize(void); +static void water_compute_depth( boxf bounds ); +static void water_set_surface( glmesh *surf, float height ); +static float water_height(void); + #ifndef WATER_H #define WATER_H -#define VG_3D -#include "vg/vg.h" - -#include "model.h" +#include "world.h" #include "render.h" #include "shaders/water.h" #include "scene.h" @@ -13,7 +20,7 @@ vg_tex2d tex_water_surf = { .path = "textures/water_surf.qoi" }; static struct { - GLuint fb, rgb, rb; + struct framebuffer fbreflect, fbdepth; glmesh mdl; GLuint depthmap; @@ -23,7 +30,16 @@ static struct float height; int enabled; } -wrender; +wrender = +{ + .fbreflect = { .format = GL_RGB, .div = 2 }, + .fbdepth = { .format = GL_RGBA, .div = 2 } +}; + +static float water_height(void) +{ + return wrender.height; +} static void water_register(void) { @@ -33,11 +49,21 @@ static void water_register(void) static void water_init(void) { /* TODO: probably dont do this every time */ - create_renderbuffer_std( &wrender.fb, &wrender.rgb, &wrender.rb ); wrender.enabled = 1; + + fb_init( &wrender.fbreflect ); + fb_init( &wrender.fbdepth ); +} + +static void water_fb_resize(void) +{ + if( !wrender.enabled ) + return; + + fb_resize( &wrender.fbreflect ); + fb_resize( &wrender.fbdepth ); } -static int ray_world( v3f pos, v3f dir, ray_hit *hit ); static void water_compute_depth( boxf bounds ) { if( !wrender.enabled ) @@ -104,22 +130,13 @@ static void water_set_surface( glmesh *surf, float height ) wrender.height = height; } -static void water_fb_resize(void) -{ - if( !wrender.enabled ) - return; - - resize_renderbuffer_std( &wrender.fb, &wrender.rgb, &wrender.rb ); -} - static void render_water_texture( m4x3f camera ) { if( !wrender.enabled ) return; /* Draw reflection buffa */ - glBindFramebuffer( GL_FRAMEBUFFER, wrender.fb ); - glClearColor( 0.11f, 0.35f, 0.37f, 1.0f ); + fb_use( &wrender.fbreflect ); glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ); m4x3f new_cam, inverse; @@ -158,9 +175,34 @@ static void render_water_texture( m4x3f camera ) glCullFace( GL_FRONT ); render_world( projection, new_cam ); glCullFace( GL_BACK ); + + + /* Draw beneath texture */ + fb_use( &wrender.fbdepth ); + glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ); + + m4x3_invert_affine( camera, inverse ); + m4x3_expand( inverse, view ); + + v4f clippb = { 0.0f, -1.0f, 0.0f, -(wrender.height) }; + m4x3_mulp( inverse, clippb, clippb ); + clippb[3] *= -1.0f; + + float depth_loss = camera[3][1]-wrender.height; + + m4x4_projection( projection, + gpipeline.fov, + (float)vg_window_x / (float)vg_window_y, + 0.1f, 900.0f ); + + plane_clip_projection( projection, clippb ); + m4x4_mul( projection, view, projection ); + render_world( projection, camera ); + + glViewport( 0, 0, vg_window_x, vg_window_y ); } -static void render_water_surface( m4x4f pv ) +static void render_water_surface( m4x4f pv, m4x3f camera ) { if( !wrender.enabled ) return; @@ -168,8 +210,7 @@ static void render_water_surface( m4x4f pv ) /* Draw surface */ shader_water_use(); - glActiveTexture( GL_TEXTURE0 ); - glBindTexture( GL_TEXTURE_2D, wrender.rgb ); + fb_bindtex( &wrender.fbreflect, 0 ); shader_water_uTexMain( 0 ); vg_tex2d_bind( &tex_water_surf, 1 ); @@ -187,7 +228,13 @@ static void render_water_surface( m4x4f pv ) 1.0f/ (wrender.depthbounds[1][0]-wrender.depthbounds[0][0]), 1.0f/ (wrender.depthbounds[1][2]-wrender.depthbounds[0][2])} ); + fb_bindtex( &wrender.fbdepth, 3 ); + shader_water_uTexBack( 3 ); + shader_water_uTime( vg_time ); + shader_water_uCamera( camera[3] ); + shader_water_uSurfaceY( wrender.height ); + shader_water_uPv( pv ); m4x3f full;