X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.c;h=8d7e546c7aeb666e8b1eb23d0c8450d30a5b0b98;hb=ca1798f62b65b72703e960d132dd0170728b7709;hp=1d2256b4f6ddf88d7cefc696b68ece318e23e585;hpb=1a7f4a35e88698bdb45c90f646f1645589d5511c;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.c b/world_render.c index 1d2256b..8d7e546 100644 --- a/world_render.c +++ b/world_render.c @@ -10,6 +10,8 @@ #include "font.h" #include "gui.h" #include "respawn.h" +#include "ent_miniworld.h" +#include "player_remote.h" static int ccmd_set_time( int argc, const char *argv[] ){ world_instance *world = world_current_instance(); @@ -364,11 +366,11 @@ static void render_world_standard( world_instance *world, camera *cam ){ } static void render_world_cubemapped( world_instance *world, camera *cam, - int layer_depth ){ + int enabled ){ if( !mdl_arrcount( &world->ent_cubemap ) ) return; - if( layer_depth == -1 ){ + if( !enabled ){ world_shader_standard_bind( world, cam ); struct world_pass pass = { @@ -448,7 +450,7 @@ static void render_world_alphatest( world_instance *world, camera *cam ){ static void world_render_challenges( world_instance *world, struct world_pass *pass, - v3f pos, int layer_depth ){ + v3f pos ){ if( !world ) return; if( skaterift.activity == k_skaterift_replay ) return; if( world != world_current_instance() ) return; @@ -608,8 +610,7 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, } } -static void render_world_fxglow( world_instance *world, camera *cam, - int layer_depth ){ +static void render_world_fxglow( world_instance *world, camera *cam ){ shader_scene_fxglow_use(); shader_scene_fxglow_uUvOffset( (v2f){ 0.0f, 0.0f } ); shader_scene_fxglow_uTexMain(1); @@ -635,7 +636,7 @@ static void render_world_fxglow( world_instance *world, camera *cam, }; world_render_both_stages( world, &pass ); - world_render_challenges( world, &pass, cam->pos, layer_depth ); + world_render_challenges( world, &pass, cam->pos ); glEnable(GL_CULL_FACE); } @@ -696,13 +697,18 @@ static void render_sky( world_instance *world, camera *cam ){ m4x4_copy( cam->mtx.v, v ); m4x4_copy( cam->mtx_prev.v, v_prev ); + + for( int i=0; i<3; i++ ){ + v3_normalize(v[i]); + v3_normalize(v_prev[i]); + } v3_zero( v[3] ); v3_zero( v_prev[3] ); m4x4_copy( cam->mtx.p, pv ); m4x4_copy( cam->mtx_prev.p, pv_prev ); - m4x4_reset_clipping( pv, cam->farz, cam->nearz ); - m4x4_reset_clipping( pv_prev, cam->farz, cam->nearz ); + m4x4_reset_clipping( pv, 100.0f, 0.1f ); + m4x4_reset_clipping( pv_prev, 100.0f, 0.1f ); m4x4_mul( pv, v, pv ); m4x4_mul( pv_prev, v_prev, pv_prev ); @@ -750,9 +756,7 @@ static void render_sky( world_instance *world, camera *cam ){ glDepthMask( GL_TRUE ); } -static void render_world_gates( world_instance *world, camera *cam, - int layer_depth ) -{ +static void render_world_gates( world_instance *world, camera *cam ){ float closest = INFINITY; struct ent_gate *gate = NULL; @@ -775,7 +779,7 @@ static void render_world_gates( world_instance *world, camera *cam, world->rendering_gate = gate; if( gate ) - render_gate( world, world, gate, cam, layer_depth ); + render_gate( world, world, gate, cam ); } static void world_prerender( world_instance *world ){ @@ -794,11 +798,7 @@ static void world_prerender( world_instance *world ){ state->g_debug_indices = k_debug_light_indices; state->g_light_preview = k_light_preview; state->g_debug_complexity = k_debug_light_complexity; - - if( skaterift.activity == k_skaterift_respawning ) - state->g_time_of_day = 0.1f; - else - state->g_time_of_day = vg_fractf( world->time ); + state->g_time_of_day = vg_fractf( world->time ); state->g_day_phase = cosf( state->g_time_of_day * VG_PIf * 2.0f ); state->g_sunset_phase= cosf( state->g_time_of_day * VG_PIf * 4.0f + VG_PIf ); @@ -826,20 +826,34 @@ static void world_prerender( world_instance *world ){ } static void render_world( world_instance *world, camera *cam, - int layer_depth ) -{ + int stenciled, int viewing_from_gate, + int with_water, int with_cubemaps ){ + if( stenciled ){ + glClear( GL_DEPTH_BUFFER_BIT ); + glStencilFunc( GL_EQUAL, 1, 0xFF ); + glStencilMask( 0x00 ); + glEnable( GL_CULL_FACE ); + glEnable( GL_STENCIL_TEST ); + } + else { + glStencilMask( 0xFF ); + glStencilFunc( GL_ALWAYS, 1, 0xFF ); + glDisable( GL_STENCIL_TEST ); + } + render_sky( world, cam ); - render_world_routes( world, cam, layer_depth ); + m4x3f identity; + m4x3_identity(identity); + render_world_routes( world, world, identity, cam, viewing_from_gate, 0 ); render_world_standard( world, cam ); - render_world_cubemapped( world, cam, layer_depth ); + render_world_cubemapped( world, cam, with_cubemaps ); render_world_vb( world, cam ); render_world_alphatest( world, cam ); render_terrain( world, cam ); - if( layer_depth == -1 ) return; - if( layer_depth == 0 ){ + if( !viewing_from_gate ){ world_entity_focus_render(); /* Render SFD's */ @@ -862,30 +876,57 @@ static void render_world( world_instance *world, camera *cam, } } - f32 greyout = 0.0f; - if( mdl_entity_id_type(world_static.focused_entity) == k_ent_challenge ) - greyout = world_static.focus_strength; - - if( greyout > 0.0f ){ - glDrawBuffers( 1, (GLenum[]){ GL_COLOR_ATTACHMENT0 } ); - glEnable(GL_BLEND); - glDisable(GL_DEPTH_TEST); - glDepthMask(GL_FALSE); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBlendEquation(GL_FUNC_ADD); - - shader_blitcolour_use(); - shader_blitcolour_uColour( (v4f){ 0.5f, 0.5f, 0.5f, greyout*0.56f } ); - render_fsquad(); - - glDisable(GL_BLEND); - glEnable(GL_DEPTH_TEST); - glDepthMask(GL_TRUE); - glDrawBuffers( 2, (GLenum[]){ GL_COLOR_ATTACHMENT0, - GL_COLOR_ATTACHMENT1 } ); + if( !viewing_from_gate ){ + f32 greyout = 0.0f; + if( mdl_entity_id_type(world_static.focused_entity) == k_ent_challenge ) + greyout = world_static.focus_strength; + + if( greyout > 0.0f ){ + glDrawBuffers( 1, (GLenum[]){ GL_COLOR_ATTACHMENT0 } ); + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + shader_blitcolour_use(); + shader_blitcolour_uColour( (v4f){ 0.5f, 0.5f, 0.5f, greyout*0.56f } ); + render_fsquad(); + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + glDepthMask(GL_TRUE); + glDrawBuffers( 2, (GLenum[]){ GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1 } ); + } + + render_world_fxglow( world, cam ); + } + + if( with_water ){ + render_water_texture( world, cam ); + render_fb_bind( gpipeline.fb_main, 1 ); + } + + if( stenciled ){ + glStencilFunc( GL_EQUAL, 1, 0xFF ); + glStencilMask( 0x00 ); + glEnable( GL_CULL_FACE ); + glEnable( GL_STENCIL_TEST ); + } + + if( with_water ){ + render_water_surface( world, cam ); } - render_world_fxglow( world, cam, layer_depth ); + render_remote_players( world, cam ); + ent_miniworld_render( world, cam ); + + if( stenciled ){ + glStencilMask( 0xFF ); + glStencilFunc( GL_ALWAYS, 1, 0xFF ); + glDisable( GL_STENCIL_TEST ); + } } @@ -917,9 +958,11 @@ static void render_world_override_pass( world_instance *world, static void render_world_override( world_instance *world, world_instance *lighting_source, - m4x3f mmdl ){ + m4x3f mmdl, + camera *cam, + ent_spawn *dest_spawn ){ struct world_pass pass = { - .cam = &skaterift.cam, + .cam = cam, .fn_bind_textures = bindpoint_override, .fn_set_mdl = shader_scene_override_uMdl, .fn_set_uPvmPrev = shader_scene_override_uPvmPrev, @@ -928,9 +971,6 @@ static void render_world_override( world_instance *world, }; shader_scene_override_use(); -#if 0 - respawn_chooser_shader_uniforms(); -#endif shader_scene_override_uTexGarbage(0); shader_scene_override_uTexMain(1); shader_scene_override_uPv( pass.cam->mtx.pv ); @@ -942,7 +982,7 @@ static void render_world_override( world_instance *world, m4x4f mpvm_prev; m4x3_expand( mmdl, mpvm_prev ); - m4x4_mul( skaterift.cam.mtx_prev.pv, mpvm_prev, mpvm_prev ); + m4x4_mul( cam->mtx_prev.pv, mpvm_prev, mpvm_prev ); m3x3f mnormal; m3x3_inv( mmdl, mnormal ); @@ -957,13 +997,10 @@ static void render_world_override( world_instance *world, v3_copy( world->player_co, uPlayerPos ); - m4x3f mmdl_inv; - m4x3_invert_full( mmdl, mmdl_inv ); - v3f localized; - m4x3_mulv( mmdl_inv, localplayer.rb.co, localized ); - ent_spawn *spawn = world_find_closest_spawn( world, localized ); - if( spawn ) - v3_copy( spawn->transform.co, uSpawnPos ); + if( dest_spawn && (v3_dist2(dest_spawn->transform.co,uPlayerPos) > 0.1f) ) + v3_copy( dest_spawn->transform.co, uSpawnPos ); + else + v3_add( uPlayerPos, (v3f){0,-1,0}, uSpawnPos ); uPlayerPos[3] = v3_dist(uPlayerPos,uSpawnPos); uSpawnPos[3] = 1.0f/uPlayerPos[3]; @@ -972,7 +1009,6 @@ static void render_world_override( world_instance *world, shader_scene_override_uSpawnPos( uSpawnPos ); - glDisable( GL_CULL_FACE ); mesh_bind( &world->mesh_geo ); pass.geo_type = k_world_geo_type_solid; @@ -1026,7 +1062,7 @@ static void render_cubemap_side( world_instance *world, ent_cubemap *cm, camera_finalize( &cam ); camera_finalize( &cam ); - render_world( world, &cam, -1 ); + render_world( world, &cam, 0, 1, 1, 0 ); } static void render_world_cubemaps( world_instance *world ){