X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.c;h=1546429235fe10b36e8643aa2132417a306dcc94;hb=70ff4a83e5a4b35436388d9bb999c939559ac23f;hp=14631421c25304a3dc4de936de1987ae999a827f;hpb=63fe317d7db724162561da52aa382c82ac3c29be;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.c b/world_render.c index 1463142..1546429 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(); @@ -154,6 +156,45 @@ struct world_pass{ void (*fn_set_uNormalMtx)( m3x3f mnorm ); }; +/* FIXME: we gotta do something about this crap, maybe batch lists. something.. + * anything but this. */ +static +void world_render_props( world_instance *world, u32 material_id, + struct world_pass *pass ){ + if( !mdl_arrcount( &world->ent_prop ) ) return; + + /* HACK: use the first material for every prop entity */ + ent_prop *first = mdl_arritm( &world->ent_prop, 0 ); + if( !first->submesh_count ) return; + + mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, first->submesh_start ); + if( sm->material_id != material_id ) return; + + struct world_surface *mat = &world->surfaces[ material_id ]; + pass->fn_bind_textures( world, mat ); + + for( u32 j=0; jent_prop ); j++ ){ + ent_prop *prop = mdl_arritm( &world->ent_prop, j ); + if( prop->flags & 0x1 ) continue; + + for( u32 k=0; ksubmesh_count; k++ ){ + sm = mdl_arritm( &world->meta.submeshs, prop->submesh_start+k ); + + m4x3f mmdl; + mdl_transform_m4x3( &prop->transform, mmdl ); + + m4x4f m4mdl; + m4x3_expand( mmdl, m4mdl ); + m4x4_mul( pass->cam->mtx_prev.pv, m4mdl, m4mdl ); + + pass->fn_set_mdl( mmdl ); + pass->fn_set_uPvmPrev( m4mdl ); + + mdl_draw_submesh( sm ); + } + } +} + static void world_render_traffic( world_instance *world, u32 material_id, struct world_pass *pass ){ @@ -205,6 +246,7 @@ void world_render_pass( world_instance *world, struct world_pass *pass ){ } else{ world_render_traffic( world, i, pass ); + world_render_props( world, i, pass ); sm = &mat->sm_no_collide; } @@ -324,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 = { @@ -408,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; @@ -568,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); @@ -595,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); } @@ -656,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 ); @@ -710,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; @@ -735,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 ){ @@ -754,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 ); @@ -786,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 */ @@ -822,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 ); + } } @@ -877,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, f32 iso_amt ){ 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, @@ -888,12 +971,10 @@ 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 ); + shader_scene_override_uIsoAmt( iso_amt ); WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( lighting_source, scene_override ); bind_terrain_noise(); @@ -902,7 +983,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 ); @@ -917,13 +998,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]; @@ -932,7 +1010,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; @@ -986,7 +1063,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 ){