#ifndef GATE_H
#define GATE_H
-#define VG_3D
-#include "vg/vg.h"
+#include "common.h"
#include "model.h"
#include "render.h"
#include "shaders/gate.h"
static struct
{
- GLuint fb, rgb, rb;
+ struct framebuffer fb;
glmesh mdl;
int high_qual; /* If in high performance mode, we don't use RT's, and
- instead use stencil buffers.
- There is therefore no heat warp effect. */
+ instead use stencil buffers.
+ There is therefore no heat warp effect. */
}
grender =
{
- .high_qual = 0
+ .high_qual = 0,
+ .fb = {
+ .format = GL_RGB,
+ .div = 1
+ }
};
struct teleport_gate
static void gate_init(void)
{
- create_renderbuffer_std( &grender.fb, &grender.rgb, &grender.rb );
+ fb_init( &grender.fb );
- model *mgate = vg_asset_read( "models/rs_gate.mdl" );
- model_unpack( mgate, &grender.mdl );
+ mdl_header *mgate = mdl_load( "models/rs_gate.mdl" );
+ mdl_unpack_glmesh( mgate, &grender.mdl );
free( mgate );
}
static void gate_fb_resize(void)
{
- resize_renderbuffer_std( &grender.fb, &grender.rgb, &grender.rb );
+ fb_resize( &grender.fb );
}
-static void render_gate( teleport_gate *gate, m4x3f camera )
+static int render_gate( teleport_gate *gate, v3f viewpos, m4x3f camera )
{
- v3f viewpos, viewdir, gatedir;
- v3_copy( camera[3], viewpos );
+ v3f viewdir, gatedir;
m3x3_mulv( camera, (v3f){0.0f,0.0f,-1.0f}, viewdir );
m3x3_mulv( gate->to_world, (v3f){0.0f,0.0f,-1.0f}, gatedir );
v3f v0;
v3_sub( viewpos, gate->co[0], v0 );
if( v3_dot(v0, gatedir) >= 0.0f )
- return;
+ return 0;
if( v3_dist( viewpos, gate->co[0] ) > 100.0f )
- return;
+ return 0;
v3f a,b,c,d;
if( grender.high_qual )
{
- glBindFramebuffer( GL_FRAMEBUFFER, grender.fb );
+ fb_use( &grender.fb );
glClearColor( 0.11f, 0.35f, 0.37f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
}
}
render_world( projection, cam_new );
-
+
if( grender.high_qual )
{
/*
*/
render_water_texture( cam_new );
- glBindFramebuffer( GL_FRAMEBUFFER, grender.fb );
- render_water_surface( projection );
- glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+ fb_use( &grender.fb );
+
+ render_water_surface( projection, cam_new );
+ fb_use( NULL );
shader_gate_use();
shader_gate_uPv( vg_pv );
shader_gate_uMdl( gate_xform );
- glActiveTexture( GL_TEXTURE0 );
- glBindTexture( GL_TEXTURE_2D, grender.rgb );
+ fb_bindtex( &grender.fb, 0 );
+
shader_gate_uCam( viewpos );
shader_gate_uTexMain( 0 );
shader_gate_uTexWater( 1 );
}
else
{
+ glDisable( GL_STENCIL_TEST );
+
+ render_water_texture( cam_new );
+ fb_use( NULL );
+ glEnable( GL_STENCIL_TEST );
+
+ render_water_surface( projection, cam_new );
+
glStencilMask( 0xFF );
glStencilFunc( GL_ALWAYS, 1, 0xFF );
glDisable( GL_STENCIL_TEST );
}
+
+ return 1;
}
static int gate_intersect( teleport_gate *gate, v3f pos, v3f last )
float d = v3_dot(surface, v0);
- if( fabsf(d) > 0.00001f )
+ if( d > 0.00001f )
{
float t = v3_dot(delta, surface) / d;
if( t >= 0.0f && t <= l )