+
+static void render_world_override_pass( world_instance *world,
+ struct world_pass *pass,
+ m4x3f mmdl, m3x3f mnormal,
+ m4x4f mpvm_prev ){
+ 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;
+
+ pass->fn_set_mdl( mmdl );
+ pass->fn_set_uNormalMtx( mnormal );
+ pass->fn_set_uPvmPrev( mpvm_prev );
+ pass->fn_bind_textures( world, mat );
+ mdl_draw_submesh( sm );
+ }
+}
+
+static void render_world_override( world_instance *world,
+ world_instance *lighting_source,
+ m4x3f mmdl,
+ camera *cam ){
+ struct world_pass pass = {
+ .cam = cam,
+ .fn_bind_textures = bindpoint_override,
+ .fn_set_mdl = shader_scene_override_uMdl,
+ .fn_set_uPvmPrev = shader_scene_override_uPvmPrev,
+ .fn_set_uNormalMtx = shader_scene_override_uNormalMtx,
+ .shader = k_shader_override
+ };
+
+ 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 );
+
+ WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( lighting_source, scene_override );
+ bind_terrain_noise();
+
+ shader_scene_override_uCamera( pass.cam->transform[3] );
+
+ m4x4f mpvm_prev;
+ m4x3_expand( mmdl, mpvm_prev );
+ m4x4_mul( cam->mtx_prev.pv, mpvm_prev, mpvm_prev );
+
+ m3x3f mnormal;
+ m3x3_inv( mmdl, mnormal );
+ m3x3_transpose( mnormal, mnormal );
+ v3_normalize( mnormal[0] );
+ v3_normalize( mnormal[1] );
+ v3_normalize( mnormal[2] );
+
+ v4f uPlayerPos, uSpawnPos;
+ v4_zero( uPlayerPos );
+ v4_zero( uSpawnPos );
+
+ 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 );
+
+ uPlayerPos[3] = v3_dist(uPlayerPos,uSpawnPos);
+ uSpawnPos[3] = 1.0f/uPlayerPos[3];
+
+ shader_scene_override_uPlayerPos( uPlayerPos );
+ shader_scene_override_uSpawnPos( uSpawnPos );
+
+
+ glDisable( GL_CULL_FACE );
+ mesh_bind( &world->mesh_geo );
+ pass.geo_type = k_world_geo_type_solid;
+ render_world_override_pass( world, &pass, mmdl, mnormal, mpvm_prev );
+ mesh_bind( &world->mesh_no_collide );
+ pass.geo_type = k_world_geo_type_nonsolid;
+ render_world_override_pass( world, &pass, mmdl, mnormal, mpvm_prev );
+ glEnable( GL_CULL_FACE );
+}
+
+static void render_cubemap_side( world_instance *world, ent_cubemap *cm,