X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=water.h;h=1de2554abf8e459175a30438cb6146e0f24b09a3;hb=d57b7661518800479c00300ce57407378696eec9;hp=83a6cf82cded97e1fbd334ea525f791b24d705ac;hpb=e36cb7e44611855d39ba84710a7007ca659e9cd5;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/water.h b/water.h index 83a6cf8..1de2554 100644 --- a/water.h +++ b/water.h @@ -1,10 +1,16 @@ +#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_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,17 +19,26 @@ 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; + v4f plane; +} +wrender = +{ + .fbreflect = { .format = GL_RGB, .div = 3 }, + .fbdepth = { .format = GL_RGBA, .div = 4 } +}; + +static float water_height(void) +{ + return wrender.height; } -wrender; static void water_register(void) { @@ -33,11 +48,22 @@ 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 ); +#if 0 static void water_compute_depth( boxf bounds ) { if( !wrender.enabled ) @@ -46,38 +72,43 @@ static void water_compute_depth( boxf bounds ) #ifdef VG_RELEASE int const kres = 512; #else - int const kres = 64; + int const kres = 1024; #endif vg_info( "Computing depth map\n" ); - u8 *img = malloc( kres*kres ); + float *img = malloc( kres*kres*sizeof(float) ); + + boxf interior; + v3_add(bounds[0],(v3f){1.0f,1.0f,1.0f},interior[0]); + v3_sub(bounds[1],(v3f){1.0f,1.0f,1.0f},interior[1]); v3f volume; - v3_sub( bounds[1], bounds[0], volume ); - box_copy( bounds, wrender.depthbounds ); + v3_sub( interior[1], interior[0], volume ); + box_copy( interior, wrender.depthbounds ); for( int y=0; y