world regions
[carveJwlIkooP6JGAAIwe30JlM.git] / world_render.c
index 096de9a99a624717425a5383061430b3d1f273e2..4d5321bc2a2db50a019b8b141845b093a4603c56 100644 (file)
@@ -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; 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( &region->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);
 }
@@ -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,