respawn UI
[carveJwlIkooP6JGAAIwe30JlM.git] / world_render.c
index 12728799bf2cbd4b0d1ae33b559bde16720793c9..a7bb6939c6b5d02b07f76e6c5eb29fd2d997afc1 100644 (file)
@@ -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; i<world->surface_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;