well yeah i guess
[carveJwlIkooP6JGAAIwe30JlM.git] / world_gate.h
index 083d68be351fd983effc4017362a3f4167509dfc..b57c799fd33b68f31eb9a513fb8fc5f009253a52 100644 (file)
@@ -1,34 +1,19 @@
+/*
+ * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
+ */
+
 #ifndef WORLD_GATE_H
 #define WORLD_GATE_H
 
 #include "common.h"
 #include "model.h"
 #include "render.h"
-#include "shaders/gate.h"
+
 #include "shaders/gatelq.h"
 #include "world_water.h"
 
-typedef struct teleport_gate teleport_gate;
-
-static struct
-{
-   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. */
-}
-grender =
-{
-   .high_qual = 0,
-   .fb = {
-      .format = GL_RGB,
-      .div = 1
-   }
-};
 
-static void gate_transform_update( teleport_gate *gate )
+VG_STATIC void gate_transform_update( teleport_gate *gate )
 {
    m4x3f to_local;
 
@@ -42,33 +27,23 @@ static void gate_transform_update( teleport_gate *gate )
    m4x3_mul( gate->recv_to_world, to_local, gate->transport );
 }
 
-static void world_gates_init(void)
+VG_STATIC void world_gates_init(void)
 {
    vg_info( "world_gates_init\n" );
-   shader_gate_register();
+
    shader_gatelq_register();
 
-   mdl_header *mgate = mdl_load( "models/rs_gate.mdl" );
+   vg_linear_clear( vg_mem.scratch );
+   mdl_context *mgate = mdl_load_full( vg_mem.scratch, "models/rs_gate.mdl" );
 
    vg_acquire_thread_sync();
    {
-      fb_init( &grender.fb );
-      mdl_unpack_glmesh( mgate, &grender.mdl );
+      mdl_unpack_glmesh( mgate, &world.mesh_gate_surface );
    }
    vg_release_thread_sync();
 }
 
-static void world_gates_free(void*_)
-{
-   fb_free( &grender.fb );
-}
-
-static void gate_fb_resize(void)
-{
-   fb_resize( &grender.fb );
-}
-
-static int render_gate( teleport_gate *gate, v3f viewpos, m4x3f camera )
+VG_STATIC int render_gate( teleport_gate *gate, v3f viewpos, m4x3f camera )
 {
    v3f viewdir, gatedir;
    m3x3_mulv( camera, (v3f){0.0f,0.0f,-1.0f}, viewdir );
@@ -126,30 +101,23 @@ static int render_gate( teleport_gate *gate, v3f viewpos, m4x3f camera )
 
    m4x4_mul( projection, view, projection );
 
-   if( grender.high_qual )
-   {
-      fb_use( &grender.fb );
-      glClearColor( 0.11f, 0.35f, 0.37f, 1.0f );
-      glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
-   }
-   else
    {
       shader_gatelq_use();
-      shader_gatelq_uPv( vg_pv );
+      shader_gatelq_uPv( vg.pv );
       shader_gatelq_uMdl( gate_xform );
       shader_gatelq_uCam( viewpos );
-      shader_gatelq_uTime( vg_time*0.25f );
+      shader_gatelq_uTime( vg.time*0.25f );
       shader_gatelq_uInvRes( (v2f){
-            1.0f / (float)vg_window_x,
-            1.0f / (float)vg_window_y });
+            1.0f / (float)vg.window_x,
+            1.0f / (float)vg.window_y });
 
       glEnable( GL_STENCIL_TEST );
       glStencilOp( GL_KEEP, GL_KEEP, GL_REPLACE );  
       glStencilFunc( GL_ALWAYS, 1, 0xFF ); 
       glStencilMask( 0xFF );
 
-      mesh_bind( &grender.mdl );
-      mesh_draw( &grender.mdl );
+      mesh_bind( &world.mesh_gate_surface );
+      mesh_draw( &world.mesh_gate_surface );
 
       glClear( GL_DEPTH_BUFFER_BIT );
       glStencilFunc( GL_EQUAL, 1, 0xFF );
@@ -158,44 +126,6 @@ static int render_gate( teleport_gate *gate, v3f viewpos, m4x3f camera )
 
    render_world( projection, cam_new );
 
-   if( grender.high_qual )
-   {
-      /*
-       * TODO: Need to find a way to draw a stencil buffer into the water 
-       *       rendering 
-       */
-
-      render_water_texture( cam_new );
-      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 );
-
-      fb_bindtex( &grender.fb, 0 );
-
-      shader_gate_uCam( viewpos );
-      shader_gate_uTexMain( 0 );
-      shader_gate_uTexWater( 1 );
-      shader_gate_uTime( vg_time*0.25f );
-      shader_gate_uInvRes( (v2f){
-            1.0f / (float)vg_window_x,
-            1.0f / (float)vg_window_y });
-      
-      glEnable(GL_BLEND);
-      glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-      glBlendEquation(GL_FUNC_ADD);
-
-      mesh_bind( &grender.mdl );
-      mesh_draw( &grender.mdl );
-
-      glDisable(GL_BLEND);
-   }
-   else
    {
       glDisable( GL_STENCIL_TEST );
 
@@ -213,7 +143,7 @@ static int render_gate( teleport_gate *gate, v3f viewpos, m4x3f camera )
    return 1;
 }
 
-static int gate_intersect( teleport_gate *gate, v3f pos, v3f last )
+VG_STATIC int gate_intersect( teleport_gate *gate, v3f pos, v3f last )
 {
    v4f surface;
    m3x3_mulv( gate->to_world, (v3f){0.0f,0.0f,-1.0f}, surface );