+ /* TODO: probably dont do this every time */
+ 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 );
+}
+
+#if 0
+static void water_compute_depth( boxf bounds )
+{
+ if( !wrender.enabled )
+ return;
+
+#ifdef VG_RELEASE
+ int const kres = 512;
+#else
+ int const kres = 1024;
+#endif
+
+ vg_info( "Computing depth map\n" );
+ 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( interior[1], interior[0], volume );
+ box_copy( interior, wrender.depthbounds );
+
+ for( int y=0; y<kres; y++ )
+ {
+ for( int x=0; x<kres; x++ )
+ {
+ v3f pos = { x, 0.0f, y };
+ pos[0] += 0.5f;
+ pos[2] += 0.5f;
+ v3_divs( pos, kres+1, pos );
+ v3_muladd( interior[0], pos, volume, pos );
+ pos[1] = 2000.0f;
+
+ ray_hit hit;
+ hit.dist = INFINITY;
+ float *dst = &img[ y*kres+x ];
+
+ if( ray_world( pos, (v3f){0.0f,-1.0f,0.0f}, &hit ))
+ {
+ *dst = hit.pos[1];
+ }
+ else
+ {
+ *dst = 0.0f;
+ }
+ }
+ }
+
+ if( wrender.depth_computed )
+ glDeleteTextures( 1, &wrender.depthmap );
+
+ glGenTextures( 1, &wrender.depthmap );
+ glBindTexture( GL_TEXTURE_2D, wrender.depthmap );
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_R32F, kres, kres, 0,
+ GL_RED, GL_FLOAT, img );
+
+ vg_tex2d_mipmap();
+ vg_tex2d_linear_mipmap();
+ vg_tex2d_clamp();
+
+ wrender.depth_computed = 1;
+ free( img );
+ vg_success( "Done.\n" );