X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.h;h=f61974e37e791f0b7384b17ef384416086c791b6;hb=89113e9bc9544336b5ac4f53696c3de2d30698a2;hp=b1972ba546cf7cafd4774294559c7a39eaabbfc2;hpb=1b522daa02f28128498b04def4d60b63e590d1f3;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.h b/world_render.h index b1972ba..f61974e 100644 --- a/world_render.h +++ b/world_render.h @@ -109,24 +109,26 @@ VG_STATIC void bind_terrain_noise(void) vg_tex2d_bind( &tex_terrain_noise, 0 ); } -typedef void (*func_bind_point)( world_instance *world, - struct world_surface *mat ); - -VG_STATIC void world_render_if( world_instance *world, - enum mdl_shader shader, - enum geo_type geo_type, - func_bind_point bind_point ) +struct world_pass{ + camera *cam; + enum mdl_shader shader; + enum geo_type geo_type; + + void (*fn_bind_textures)( world_instance *world, + struct world_surface *mat ); + void (*fn_set_mdl)( m4x3f mdl ); + void (*fn_set_uPvmPrev)( m4x4f pvm ); +}; + +VG_STATIC void world_render_if( world_instance *world, struct world_pass *pass ) { - - for( int i=0; isurface_count; i++ ) - { + for( int i=0; isurface_count; i++ ){ struct world_surface *mat = &world->surfaces[i]; - if( mat->info.shader == shader ) - { + if( mat->info.shader == pass->shader ){ mdl_submesh *sm; - if( geo_type == k_geo_type_solid ) + if( pass->geo_type == k_geo_type_solid ) sm = &mat->sm_geo; else sm = &mat->sm_no_collide; @@ -134,28 +136,55 @@ VG_STATIC void world_render_if( world_instance *world, if( !sm->indice_count ) continue; - bind_point( world, mat ); + m4x3f mmdl; + m4x3_identity( mmdl ); + pass->fn_set_mdl( mmdl ); + pass->fn_set_uPvmPrev( pass->cam->mtx_prev.pv ); + + pass->fn_bind_textures( world, mat ); mdl_draw_submesh( sm ); + + for( u32 j=0; jent_traffic ); j++ ){ + ent_traffic *traffic = mdl_arritm( &world->ent_traffic, j ); + + for( u32 k=0; ksubmesh_count; k++ ){ + sm = mdl_arritm( &world->meta.submeshs, + traffic->submesh_start+k ); + + q_m3x3( traffic->transform.q, mmdl ); + v3_copy( traffic->transform.co, mmdl[3] ); + + m4x4f m4mdl; + m4x3_expand( mmdl, m4mdl ); + m4x4_mul( pass->cam->mtx_prev.pv, m4mdl, m4mdl ); + + pass->fn_set_mdl( mmdl ); + pass->fn_set_uPvmPrev( m4mdl ); + + mdl_draw_submesh( sm ); + } + } } } } VG_STATIC -void world_render_both_stages( world_instance *world, - enum mdl_shader shader, - func_bind_point bind_point ) +void world_render_both_stages( world_instance *world, struct world_pass *pass ) { mesh_bind( &world->mesh_geo ); - world_render_if( world, shader, k_geo_type_solid, bind_point ); + pass->geo_type = k_geo_type_solid; + world_render_if( world, pass ); glDisable( GL_CULL_FACE ); mesh_bind( &world->mesh_no_collide ); - world_render_if( world, shader, k_geo_type_nonsolid, bind_point ); + pass->geo_type = k_geo_type_nonsolid; + world_render_if( world, pass ); glEnable( GL_CULL_FACE ); } VG_STATIC void bindpoint_diffuse_texture1( world_instance *world, struct world_surface *mat ) + { glActiveTexture( GL_TEXTURE1 ); glBindTexture( GL_TEXTURE_2D, world->textures[ mat->info.tex_diffuse ] ); @@ -163,9 +192,6 @@ VG_STATIC void bindpoint_diffuse_texture1( world_instance *world, VG_STATIC void render_world_vb( world_instance *world, camera *cam ) { - m4x3f identity_matrix; - m4x3_identity( identity_matrix ); - shader_scene_vertex_blend_use(); shader_scene_vertex_blend_uTexGarbage(0); shader_scene_vertex_blend_uTexGradients(1); @@ -180,24 +206,25 @@ VG_STATIC void render_world_vb( world_instance *world, camera *cam ) vg_tex2d_bind( &tex_terrain_noise, 0 ); shader_scene_vertex_blend_uPv( cam->mtx.pv ); - shader_scene_vertex_blend_uPvmPrev( cam->mtx_prev.pv ); - shader_scene_vertex_blend_uMdl( identity_matrix ); shader_scene_vertex_blend_uCamera( cam->transform[3] ); - world_render_both_stages( world, k_shader_standard_vertex_blend, - bindpoint_diffuse_texture1 ); + struct world_pass pass = { + .shader = k_shader_standard_vertex_blend, + .cam = cam, + .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_set_mdl = shader_scene_vertex_blend_uMdl, + .fn_set_uPvmPrev = shader_scene_vertex_blend_uPvmPrev, + }; + + world_render_both_stages( world, &pass ); } VG_STATIC void render_world_standard( world_instance *world, camera *cam ) { - m4x3f identity_matrix; - m4x3_identity( identity_matrix ); - shader_scene_standard_use(); shader_scene_standard_uTexGarbage(0); shader_scene_standard_uTexMain(1); shader_scene_standard_uPv( cam->mtx.pv ); - shader_scene_standard_uPvmPrev( cam->mtx_prev.pv ); world_link_lighting_ub( world, _shader_scene_standard.id ); world_bind_position_texture( world, _shader_scene_standard.id, @@ -208,24 +235,25 @@ VG_STATIC void render_world_standard( world_instance *world, camera *cam ) _uniform_scene_standard_uLightsIndex, 4 ); bind_terrain_noise(); - - shader_scene_standard_uMdl( identity_matrix ); shader_scene_standard_uCamera( cam->transform[3] ); - world_render_both_stages( world, k_shader_standard, - bindpoint_diffuse_texture1 ); + struct world_pass pass = { + .shader = k_shader_standard, + .cam = cam, + .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_set_mdl = shader_scene_standard_uMdl, + .fn_set_uPvmPrev = shader_scene_standard_uPvmPrev, + }; + + world_render_both_stages( world, &pass ); } VG_STATIC void render_world_alphatest( world_instance *world, camera *cam ) { - m4x3f identity_matrix; - m4x3_identity( identity_matrix ); - shader_scene_standard_alphatest_use(); shader_scene_standard_alphatest_uTexGarbage(0); shader_scene_standard_alphatest_uTexMain(1); shader_scene_standard_alphatest_uPv( cam->mtx.pv ); - shader_scene_standard_alphatest_uPvmPrev( cam->mtx_prev.pv ); world_link_lighting_ub( world, _shader_scene_standard_alphatest.id ); world_bind_position_texture( world, _shader_scene_standard_alphatest.id, @@ -238,13 +266,20 @@ VG_STATIC void render_world_alphatest( world_instance *world, camera *cam ) bind_terrain_noise(); - shader_scene_standard_alphatest_uMdl( identity_matrix ); + shader_scene_standard_alphatest_uCamera( cam->transform[3] ); glDisable(GL_CULL_FACE); - - world_render_both_stages( world, k_shader_standard_cutout, - bindpoint_diffuse_texture1 ); + + struct world_pass pass = { + .shader = k_shader_standard_cutout, + .cam = cam, + .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_set_mdl = shader_scene_standard_alphatest_uMdl, + .fn_set_uPvmPrev = shader_scene_standard_alphatest_uPvmPrev, + }; + + world_render_both_stages( world, &pass ); glEnable(GL_CULL_FACE); } @@ -261,9 +296,6 @@ VG_STATIC void bindpoint_terrain( world_instance *world, VG_STATIC void render_terrain( world_instance *world, camera *cam ) { - m4x3f identity_matrix; - m4x3_identity( identity_matrix ); - shader_scene_terrain_use(); shader_scene_terrain_uTexGarbage(0); shader_scene_terrain_uTexGradients(1); @@ -279,12 +311,17 @@ VG_STATIC void render_terrain( world_instance *world, camera *cam ) vg_tex2d_bind( &tex_terrain_noise, 0 ); shader_scene_terrain_uPv( cam->mtx.pv ); - shader_scene_terrain_uPvmPrev( cam->mtx_prev.pv ); - - shader_scene_terrain_uMdl( identity_matrix ); shader_scene_terrain_uCamera( cam->transform[3] ); - world_render_both_stages( world, k_shader_terrain_blend, bindpoint_terrain ); + struct world_pass pass = { + .shader = k_shader_terrain_blend, + .cam = cam, + .fn_bind_textures = bindpoint_terrain, + .fn_set_mdl = shader_scene_terrain_uMdl, + .fn_set_uPvmPrev = shader_scene_terrain_uPvmPrev, + }; + + world_render_both_stages( world, &pass ); } VG_STATIC void render_sky( world_instance *world, camera *cam ) @@ -387,8 +424,7 @@ VG_STATIC void world_prerender( world_instance *world ) state->g_debug_indices = k_debug_light_indices; state->g_light_preview = k_light_preview; state->g_debug_complexity = k_debug_light_complexity; - - state->g_time_of_day = vg_fractf( g_time ); +state->g_time_of_day = vg_fractf( g_time ); state->g_day_phase = cosf( state->g_time_of_day * VG_PIf * 2.0f ); state->g_sunset_phase= cosf( state->g_time_of_day * VG_PIf * 4.0f + VG_PIf );