X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.c;h=4d5321bc2a2db50a019b8b141845b093a4603c56;hb=23ba25574349652d86979fc787ec4b0214001333;hp=096de9a99a624717425a5383061430b3d1f273e2;hpb=810a45773a2ade051c5ffb50321dab89bd2a45e9;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.c b/world_render.c index 096de9a..4d5321b 100644 --- a/world_render.c +++ b/world_render.c @@ -453,9 +453,8 @@ static void render_world_alphatest( world_instance *world, camera *cam ){ 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; @@ -615,18 +614,21 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, } } -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] ); @@ -640,8 +642,45 @@ static void render_world_fxglow( world_instance *world, camera *cam ){ .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; ient_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; jsubmesh_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); } @@ -922,7 +961,7 @@ static void render_world( world_instance *world, camera *cam, GL_COLOR_ATTACHMENT1 } ); } - render_world_fxglow( world, cam ); + render_world_fxglow( world, world, cam, NULL, 1, 1, 0 ); } if( with_water ){ @@ -1040,6 +1079,8 @@ static void render_world_override( world_instance *world, 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,