glEnable(GL_CULL_FACE);
}
-static
-void world_render_challenges( world_instance *world, struct world_pass *pass,
- v3f pos ){
+static void world_render_challenges( world_instance *world,
+ struct world_pass *pass, v3f pos ){
if( !world ) return;
if( skaterift.activity == k_skaterift_replay ) return;
if( world != world_current_instance() ) return;
}
}
-static void render_world_fxglow( world_instance *world, camera *cam ){
+static void render_world_fxglow( world_instance *host_world,
+ world_instance *world, camera *cam,
+ m4x3f world_mmdl,
+ int generic, int challenges, int regions ){
shader_scene_fxglow_use();
shader_scene_fxglow_uUvOffset( (v2f){ 0.0f, 0.0f } );
shader_scene_fxglow_uTexMain(1);
shader_scene_fxglow_uPv( cam->mtx.pv );
- world_link_lighting_ub( world, _shader_scene_fxglow.id );
- world_bind_position_texture( world, _shader_scene_fxglow.id,
+ world_link_lighting_ub( host_world, _shader_scene_fxglow.id );
+ world_bind_position_texture( host_world, _shader_scene_fxglow.id,
_uniform_scene_fxglow_g_world_depth, 2 );
- world_bind_light_array( world, _shader_scene_fxglow.id,
+ world_bind_light_array( host_world, _shader_scene_fxglow.id,
_uniform_scene_fxglow_uLightsArray, 3 );
- world_bind_light_index( world, _shader_scene_fxglow.id,
+ world_bind_light_index( host_world, _shader_scene_fxglow.id,
_uniform_scene_fxglow_uLightsIndex, 4 );
shader_scene_fxglow_uCamera( cam->transform[3] );
.fn_set_uPvmPrev = shader_scene_fxglow_uPvmPrev,
};
- world_render_both_stages( world, &pass );
- world_render_challenges( world, &pass, cam->pos );
+ if( generic )
+ world_render_both_stages( world, &pass );
+
+ if( regions ){
+ mesh_bind( &world->mesh_no_collide );
+
+ u32 last_material = 0;
+ for( u32 i=0; i<mdl_arrcount(&world->ent_region); i ++ ){
+ shader_scene_fxglow_uUvOffset( (v2f){ 0.0f, 0.0f } );
+ ent_region *region = mdl_arritm( &world->ent_region, i );
+
+ f32 offset = 0.0f;
+ if( region->flags & k_ent_route_flag_achieve_gold )
+ offset = 2.0f;
+ else if( region->flags & k_ent_route_flag_achieve_silver )
+ offset = 1.0f;
+
+ shader_scene_fxglow_uUvOffset( (v2f){ (8.0f/256.0f)*offset, 0.0f } );
+
+ m4x3f mmdl;
+ mdl_transform_m4x3( ®ion->transform, mmdl );
+ m4x3_mul( world_mmdl, mmdl, mmdl );
+ shader_scene_fxglow_uMdl( mmdl );
+
+ for( u32 j=0; j<region->submesh_count; j++ ){
+ mdl_submesh *sm = mdl_arritm( &world->meta.submeshs,
+ region->submesh_start + j );
+
+ if( sm->material_id != last_material ){
+ last_material = sm->material_id;
+ pass.fn_bind_textures(world,&world->surfaces[sm->material_id]);
+ }
+ mdl_draw_submesh( sm );
+ }
+ }
+ }
+
+ if( challenges )
+ world_render_challenges( world, &pass, cam->pos );
glEnable(GL_CULL_FACE);
}
GL_COLOR_ATTACHMENT1 } );
}
- render_world_fxglow( world, cam );
+ render_world_fxglow( world, world, cam, NULL, 1, 1, 0 );
}
if( with_water ){
pass.geo_type = k_world_geo_type_nonsolid;
render_world_override_pass( world, &pass, mmdl, mnormal, mpvm_prev );
glEnable( GL_CULL_FACE );
+
+ render_world_fxglow( world, world, cam, mmdl, 0, 0, 1 );
}
static void render_cubemap_side( world_instance *world, ent_cubemap *cm,