X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.h;h=25d72ee5e9df1e99a95932be02259f5a945534cd;hb=1f0e3292c021e8263716e5f4544a1efcedf3f03d;hp=a73998a778888c9a573dedf582f89195783059b2;hpb=47941822dae18a018c985847b052e70214a3ccc6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.h b/world_render.h index a73998a..25d72ee 100644 --- a/world_render.h +++ b/world_render.h @@ -45,6 +45,48 @@ VG_STATIC void bind_terrain_textures(void) vg_tex2d_bind( &tex_terrain_colours, 1 ); } +VG_STATIC void world_render_if( enum mdl_shader shader, + enum geo_type geo_type, + void (*bind_point)(struct world_material *mat)) +{ + + for( int i=0; iinfo.shader == shader ) + { + mdl_submesh *sm; + + if( geo_type == k_geo_type_solid ) + sm = &mat->sm_geo; + else + sm = &mat->sm_no_collide; + + if( !sm->indice_count ) + continue; + + bind_point( mat ); + mdl_draw_submesh( sm ); + } + } +} + +VG_STATIC void world_render_both_stages( enum mdl_shader shader, + void (*bind_point)(struct world_material *mat)) +{ + mesh_bind( &world.mesh_geo ); + world_render_if( shader, k_geo_type_solid, bind_point ); + mesh_bind( &world.mesh_no_collide ); + world_render_if( shader, k_geo_type_nonsolid, bind_point ); +} + +VG_STATIC void bindpoint_diffuse_texture1( struct world_material *mat ) +{ + glActiveTexture( GL_TEXTURE1 ); + glBindTexture( GL_TEXTURE_2D, world.textures[ mat->info.tex_diffuse ] ); +} + VG_STATIC void render_world_vb( m4x4f projection, v3f camera ) { m4x3f identity_matrix; @@ -54,16 +96,17 @@ VG_STATIC void render_world_vb( m4x4f projection, v3f camera ) shader_vblend_uTexGarbage(0); shader_vblend_uTexGradients(1); shader_link_standard_ub( _shader_vblend.id, 2 ); - bind_terrain_textures(); + vg_tex2d_bind( &tex_terrain_noise, 0 ); shader_vblend_uPv( projection ); shader_vblend_uMdl( identity_matrix ); shader_vblend_uCamera( camera ); - mesh_bind( &world.mesh_geo ); - mdl_draw_submesh( &world.sm_geo_vb ); + world_render_both_stages( k_shader_standard_vertex_blend, + bindpoint_diffuse_texture1 ); } + VG_STATIC void render_world_alphatest( m4x4f projection, v3f camera ) { m4x3f identity_matrix; @@ -75,22 +118,28 @@ VG_STATIC void render_world_alphatest( m4x4f projection, v3f camera ) shader_link_standard_ub( _shader_alphatest.id, 2 ); vg_tex2d_bind( &tex_terrain_noise, 0 ); - vg_tex2d_bind( &tex_alphatest, 1 ); shader_alphatest_uPv( projection ); shader_alphatest_uMdl( identity_matrix ); shader_alphatest_uCamera( camera ); glDisable(GL_CULL_FACE); - mesh_bind( &world.mesh_no_collide ); - mdl_draw_submesh( &world.sm_foliage_alphatest ); - - vg_tex2d_bind( &tex_graffiti, 1 ); - mdl_draw_submesh( &world.sm_graffiti ); + + world_render_both_stages( k_shader_standard_cutout, + bindpoint_diffuse_texture1 ); glEnable(GL_CULL_FACE); } +VG_STATIC void bindpoint_terrain( struct world_material *mat ) +{ + glActiveTexture( GL_TEXTURE1 ); + glBindTexture( GL_TEXTURE_2D, world.textures[ mat->info.tex_diffuse ] ); + + shader_terrain_uSandColour( mat->info.colour ); + shader_terrain_uBlendOffset( mat->info.colour1 ); +} + VG_STATIC void render_terrain( m4x4f projection, v3f camera ) { m4x3f identity_matrix; @@ -100,23 +149,14 @@ VG_STATIC void render_terrain( m4x4f projection, v3f camera ) shader_terrain_uTexGarbage(0); shader_terrain_uTexGradients(1); shader_link_standard_ub( _shader_terrain.id, 2 ); - bind_terrain_textures(); + + vg_tex2d_bind( &tex_terrain_noise, 0 ); shader_terrain_uPv( projection ); shader_terrain_uMdl( identity_matrix ); shader_terrain_uCamera( camera ); - mesh_bind( &world.mesh_geo ); - mdl_draw_submesh( &world.sm_terrain ); - mdl_draw_submesh( &world.sm_geo_std_oob ); - mdl_draw_submesh( &world.sm_geo_std ); - mdl_draw_submesh( &world.sm_subworld ); - - /* TODO: Dont draw in reflection */ - glDisable( GL_CULL_FACE ); - mesh_bind( &world.mesh_no_collide ); - mdl_draw_submesh( &world.sm_foliage_main ); - glEnable( GL_CULL_FACE ); + world_render_both_stages( k_shader_terrain_blend, bindpoint_terrain ); } VG_STATIC void render_lowerdome( m4x3f camera ) @@ -176,6 +216,9 @@ VG_STATIC void render_sky(m4x3f camera) VG_STATIC void render_world_gates( m4x4f projection, v3f playerco, m4x3f camera ) { + if( !world.gate_count ) + return; + float closest = INFINITY; int id = 0; @@ -209,6 +252,9 @@ VG_STATIC void render_world( m4x4f projection, m4x3f camera ) int closest = 0; float min_dist = INFINITY; + if( !world.route_count ) + return; + for( int i=0; i