+/*
+ * 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;
m4x3_mul( gate->recv_to_world, to_local, gate->transport );
}
-static int 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" );
-
- if( vg_acquire_thread_sync(1) )
- {
- if( !fb_init( &grender.fb ) )
- {
- free( mgate );
- vg_release_thread_sync(1);
- return 0;
- }
+ shader_gatelq_register();
- if( !mdl_unpack_glmesh( mgate, &grender.mdl ) )
- {
- free( mgate );
- fb_free( &grender.fb );
- vg_release_thread_sync(1);
- return 0;
- }
+ vg_linear_clear( vg_mem.scratch );
+ mdl_context *mgate = mdl_load_full( vg_mem.scratch, "models/rs_gate.mdl" );
- vg_release_thread_sync(1);
- }
- else
+ vg_acquire_thread_sync();
{
- free( mgate );
- return 0;
+ mdl_unpack_glmesh( mgate, &world.mesh_gate_surface );
}
-
- return 1;
+ 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 );
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 );
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 );
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 );