X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=water.h;h=bcd0c6847d44ca840d66b8694840bbe6fbad2351;hb=dfee9022b3513fddec36f7ea70867ee5961a44da;hp=94c7b34d0a332c782e58b581f46bca735367e9a7;hpb=1f1d636056450dcd23cce55c0795ec6276272531;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/water.h b/water.h index 94c7b34..bcd0c68 100644 --- a/water.h +++ b/water.h @@ -1,50 +1,142 @@ +#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" vg_tex2d tex_water_surf = { .path = "textures/water_surf.qoi" }; static struct { - GLuint fb, rgb, rb; + struct framebuffer fbreflect, fbdepth; glmesh mdl; + GLuint depthmap; + boxf depthbounds; + int depth_computed; + float height; + int enabled; +} +wrender = +{ + .fbreflect = { .format = GL_RGB, .div = 2 }, + .fbdepth = { .format = GL_RGBA, .div = 2 } +}; + +static float water_height(void) +{ + return wrender.height; } -wrender; static void water_register(void) { shader_water_register(); } -static void water_init( void (*newfb)(GLuint*,GLuint*,GLuint*)) +static void water_init(void) { - newfb( &wrender.fb, &wrender.rgb, &wrender.rb ); + /* TODO: probably dont do this every time */ + wrender.enabled = 1; + + fb_init( &wrender.fbreflect ); + fb_init( &wrender.fbdepth ); } -static void water_set_surface( glmesh *surf, float height ) +static void water_fb_resize(void) { - wrender.mdl = *surf; - wrender.height = height; + if( !wrender.enabled ) + return; + + fb_resize( &wrender.fbreflect ); + fb_resize( &wrender.fbdepth ); +} + +static void water_compute_depth( boxf bounds ) +{ + if( !wrender.enabled ) + return; + +#ifdef VG_RELEASE + int const kres = 512; +#else + int const kres = 64; +#endif + + vg_info( "Computing depth map\n" ); + u8 *img = malloc( kres*kres ); + + v3f volume; + v3_sub( bounds[1], bounds[0], volume ); + box_copy( bounds, wrender.depthbounds ); + + for( int y=0; y