X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.c;fp=world_render.c;h=a7bb6939c6b5d02b07f76e6c5eb29fd2d997afc1;hb=f2c3e6ffba0231be14961f0149106cecbade8124;hp=12728799bf2cbd4b0d1ae33b559bde16720793c9;hpb=dbbdf411d1aaf70cb995c3371cfae37fd0b7dbcc;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.c b/world_render.c index 1272879..a7bb693 100644 --- a/world_render.c +++ b/world_render.c @@ -9,6 +9,7 @@ #include "world_render.h" #include "font.h" #include "gui.h" +#include "respawn.h" static int ccmd_set_time( int argc, const char *argv[] ){ if( argc == 1 ){ @@ -77,6 +78,7 @@ VG_STATIC void world_render_init(void) shader_scene_standard_register(); shader_scene_standard_alphatest_register(); + shader_scene_override_register(); shader_scene_cubemapped_register(); shader_scene_fxglow_register(); shader_scene_vertex_blend_register(); @@ -644,6 +646,11 @@ VG_STATIC void bindpoint_terrain( world_instance *world, shader_scene_terrain_uBlendOffset( mat->info.colour1 ); } +VG_STATIC void bindpoint_none( world_instance *world, + struct world_surface *mat ){ + +} + VG_STATIC void render_terrain( world_instance *world, camera *cam ) { shader_scene_terrain_use(); @@ -779,11 +786,16 @@ VG_STATIC void world_prerender( world_instance *world ) struct ub_world_lighting *state = &world->ub_lighting; state->g_time = world->time; - state->g_realtime = vg.time; + state->g_realtime = vg.time_real; state->g_debug_indices = k_debug_light_indices; state->g_light_preview = k_light_preview; state->g_debug_complexity = k_debug_light_complexity; - state->g_time_of_day = vg_fractf( world->time ); + + 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_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 ); @@ -872,6 +884,69 @@ VG_STATIC void render_world( world_instance *world, camera *cam, render_world_fxglow( world, cam, layer_depth ); } + +VG_STATIC +void render_world_override_pass( world_instance *world, + struct world_pass *pass ){ + for( int i=0; isurface_count; i++ ){ + struct world_surface *mat = &world->surfaces[i]; + + if( mat->info.flags & k_material_flag_ghosts ) continue; + + mdl_submesh *sm; + if( pass->geo_type == k_world_geo_type_solid ) + sm = &mat->sm_geo; + else + sm = &mat->sm_no_collide; + + if( !sm->indice_count ) + continue; + + m4x3f mmdl; + m4x3_identity( mmdl ); + pass->fn_set_mdl( mmdl ); + pass->fn_set_uPvmPrev( pass->cam->mtx_prev.pv ); + pass->fn_bind_textures( world, mat ); + mdl_draw_submesh( sm ); + } +} + +VG_STATIC void render_world_override( world_instance *world ){ + struct world_pass pass = { + .cam = &skaterift.cam, + .fn_bind_textures = bindpoint_none, + .fn_set_mdl = shader_scene_override_uMdl, + .fn_set_uPvmPrev = shader_scene_override_uPvmPrev, + .shader = k_shader_override + }; + + shader_scene_override_use(); + respawn_chooser_shader_uniforms(); + shader_scene_override_uTexGarbage(0); + shader_scene_override_uTexMain(1); + shader_scene_override_uPv( pass.cam->mtx.pv ); + + world_link_lighting_ub( world, _shader_scene_override.id ); + world_bind_position_texture( world, _shader_scene_override.id, + _uniform_scene_override_g_world_depth, 2 ); + world_bind_light_array( world, _shader_scene_override.id, + _uniform_scene_override_uLightsArray, 3 ); + world_bind_light_index( world, _shader_scene_override.id, + _uniform_scene_override_uLightsIndex, 4 ); + + bind_terrain_noise(); + shader_scene_override_uCamera( pass.cam->transform[3] ); + + glDisable( GL_CULL_FACE ); + mesh_bind( &world->mesh_geo ); + pass.geo_type = k_world_geo_type_solid; + render_world_override_pass( world, &pass ); + mesh_bind( &world->mesh_no_collide ); + pass.geo_type = k_world_geo_type_nonsolid; + render_world_override_pass( world, &pass ); + glEnable( GL_CULL_FACE ); +} + VG_STATIC void render_cubemap_side( world_instance *world, ent_cubemap *cm, u32 side ){ camera cam;