routes
[carveJwlIkooP6JGAAIwe30JlM.git] / gate.h
diff --git a/gate.h b/gate.h
index 6e9b95f9b8d27fcebe255fe496d1a52b78cda74b..a370d81dde091a61c7c0f34235a158af48df33ef 100644 (file)
--- a/gate.h
+++ b/gate.h
@@ -13,16 +13,20 @@ typedef struct teleport_gate teleport_gate;
 
 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
@@ -56,16 +60,16 @@ static void gate_register(void)
 
 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 )
@@ -129,7 +133,7 @@ static void render_gate( teleport_gate *gate, m4x3f camera )
 
    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 );
    }
@@ -158,7 +162,7 @@ static void render_gate( teleport_gate *gate, m4x3f camera )
    }
 
    render_world( projection, cam_new );
-   
+
    if( grender.high_qual )
    {
       /*
@@ -167,17 +171,18 @@ static void render_gate( teleport_gate *gate, m4x3f camera )
        */
 
       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 );
@@ -197,6 +202,14 @@ static void render_gate( teleport_gate *gate, m4x3f camera )
    }
    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 );