X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.h;h=790f9a1b8ffb6cf7e523077bb7030e86d2693f7f;hb=a99e5f5d5c16a3e865796a96ad648e3c570d32ac;hp=4e390368e9f4f51a65283e0534b5e54ef349129a;hpb=6b9993651343af73bd48e2213910bbaadb41edaf;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.h b/world_render.h index 4e39036..790f9a1 100644 --- a/world_render.h +++ b/world_render.h @@ -8,62 +8,60 @@ #include "camera.h" #include "world.h" -/* FIXME */ -VG_STATIC vg_tex2d tex_terrain_noise = { .path = "textures/garbage.qoi", - .flags = VG_TEXTURE_NEAREST }; +VG_STATIC GLuint tex_terrain_noise; -VG_STATIC void world_render_init(void) +VG_STATIC void async_world_render_init( void *payload, u32 size ) { - vg_info( "Loading default world textures\n" ); - - vg_acquire_thread_sync(); - { - vg_tex2d_init( (vg_tex2d *[]){ &tex_terrain_noise }, 1 ); - + vg_info( "Allocate uniform buffers\n" ); + for( int i=0; i<4; i++ ){ + world_instance *world = &world_global.worlds[i]; + world->ubo_bind_point = i; + + glGenBuffers( 1, &world->ubo_lighting ); + glBindBuffer( GL_UNIFORM_BUFFER, world->ubo_lighting ); + glBufferData( GL_UNIFORM_BUFFER, sizeof(struct ub_world_lighting), + NULL, GL_DYNAMIC_DRAW ); + + glBindBufferBase( GL_UNIFORM_BUFFER, i, world->ubo_lighting ); + VG_CHECK_GL_ERR(); + } - vg_info( "Allocate uniform buffers\n" ); - for( int i=0; i<4; i++ ) - { - world_instance *world = &world_global.worlds[i]; - world->ubo_bind_point = i; + vg_info( "Allocate frame buffers\n" ); + for( int i=0; i<4; i++ ){ + world_instance *world = &world_global.worlds[i]; + struct framebuffer *fb = &world->heightmap; + + fb->display_name = NULL; + fb->link = NULL; + fb->fixed_w = 1024; + fb->fixed_h = 1024; + fb->resolution_div = 0; + + fb->attachments[0].display_name = NULL; + fb->attachments[0].purpose = k_framebuffer_attachment_type_texture; + fb->attachments[0].internalformat = GL_RG16F; + fb->attachments[0].format = GL_RG; + fb->attachments[0].type = GL_FLOAT; + fb->attachments[0].attachment = GL_COLOR_ATTACHMENT0; + + fb->attachments[1].purpose = k_framebuffer_attachment_type_none; + fb->attachments[2].purpose = k_framebuffer_attachment_type_none; + fb->attachments[3].purpose = k_framebuffer_attachment_type_none; + fb->attachments[4].purpose = k_framebuffer_attachment_type_none; + + render_fb_allocate( fb ); + } +} - glGenBuffers( 1, &world->ubo_lighting ); - glBindBuffer( GL_UNIFORM_BUFFER, world->ubo_lighting ); - glBufferData( GL_UNIFORM_BUFFER, sizeof(struct ub_world_lighting), - NULL, GL_DYNAMIC_DRAW ); +VG_STATIC void world_render_init(void) +{ + vg_info( "Loading default world textures\n" ); - glBindBufferBase( GL_UNIFORM_BUFFER, i, world->ubo_lighting ); - VG_CHECK_GL_ERR(); - } + vg_tex2d_load_qoi_async_file( "textures/garbage.qoi", + VG_TEX2D_NEAREST|VG_TEX2D_REPEAT, + &tex_terrain_noise ); - vg_info( "Allocate frame buffers\n" ); - for( int i=0; i<4; i++ ) - { - world_instance *world = &world_global.worlds[i]; - struct framebuffer *fb = &world->heightmap; - - fb->display_name = NULL; - fb->link = NULL; - fb->fixed_w = 1024; - fb->fixed_h = 1024; - fb->resolution_div = 0; - - fb->attachments[0].display_name = NULL; - fb->attachments[0].purpose = k_framebuffer_attachment_type_colour; - fb->attachments[0].internalformat = GL_RG16F; - fb->attachments[0].format = GL_RG; - fb->attachments[0].type = GL_FLOAT; - fb->attachments[0].attachment = GL_COLOR_ATTACHMENT0; - - fb->attachments[1].purpose = k_framebuffer_attachment_type_none; - fb->attachments[2].purpose = k_framebuffer_attachment_type_none; - fb->attachments[3].purpose = k_framebuffer_attachment_type_none; - fb->attachments[4].purpose = k_framebuffer_attachment_type_none; - - render_fb_allocate( fb ); - } - } - vg_release_thread_sync(); + vg_async_call( async_world_render_init, NULL, 0 ); } VG_STATIC void world_link_lighting_ub( world_instance *world, GLuint shader ) @@ -106,27 +104,30 @@ VG_STATIC void render_world_depth( world_instance *world, camera *cam ); VG_STATIC void bind_terrain_noise(void) { - vg_tex2d_bind( &tex_terrain_noise, 0 ); + glActiveTexture( GL_TEXTURE0 ); + glBindTexture( GL_TEXTURE_2D, tex_terrain_noise ); } -typedef void (*func_bind_point)( world_instance *world, - struct world_surface *mat ); +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, - enum mdl_shader shader, - enum geo_type geo_type, - func_bind_point bind_point ) +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 +135,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 +191,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); @@ -177,27 +202,29 @@ VG_STATIC void render_world_vb( world_instance *world, camera *cam ) world_bind_light_index( world, _shader_scene_vertex_blend.id, _uniform_scene_vertex_blend_uLightsIndex, 4 ); - vg_tex2d_bind( &tex_terrain_noise, 0 ); + glActiveTexture( GL_TEXTURE0 ); + glBindTexture( GL_TEXTURE_2D, tex_terrain_noise ); 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); @@ -276,15 +308,21 @@ VG_STATIC void render_terrain( world_instance *world, camera *cam ) world_bind_light_index( world, _shader_scene_terrain.id, _uniform_scene_terrain_uLightsIndex, 4 ); - vg_tex2d_bind( &tex_terrain_noise, 0 ); + glActiveTexture( GL_TEXTURE0 ); + glBindTexture( GL_TEXTURE_2D, tex_terrain_noise ); 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 ) @@ -323,7 +361,8 @@ VG_STATIC void render_sky( world_instance *world, camera *cam ) shader_model_sky_uTexGarbage(0); world_link_lighting_ub( world, _shader_model_sky.id ); - vg_tex2d_bind( &tex_terrain_noise, 0 ); + glActiveTexture( GL_TEXTURE0 ); + glBindTexture( GL_TEXTURE_2D, tex_terrain_noise ); glDepthMask( GL_FALSE ); glDisable( GL_DEPTH_TEST ); @@ -339,7 +378,6 @@ VG_STATIC void render_world_gates( world_instance *world, camera *cam, int layer_depth ) { float closest = INFINITY; - struct ent_gate *gate = NULL; for( u32 i=0; ient_gate); i++ ){ @@ -387,7 +425,6 @@ 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_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 ); @@ -417,6 +454,7 @@ VG_STATIC void world_prerender( world_instance *world ) sizeof(struct ub_world_lighting), &world->ub_lighting ); } +VG_STATIC void skateshop_render(void); VG_STATIC void render_world( world_instance *world, camera *cam, int layer_depth ) { @@ -428,25 +466,29 @@ VG_STATIC void render_world( world_instance *world, camera *cam, render_world_alphatest( world, cam ); render_terrain( world, cam ); - /* Render SFD's */ - u32 closest = 0; - float min_dist = INFINITY; + if( layer_depth == 0 ){ + skateshop_render(); + + /* Render SFD's */ + u32 closest = 0; + float min_dist = INFINITY; - if( !mdl_arrcount( &world->ent_route ) ) - return; + if( !mdl_arrcount( &world->ent_route ) ) + return; - for( u32 i=0; ient_route ); i++ ){ - ent_route *route = mdl_arritm( &world->ent_route, i ); - float dist = v3_dist2( route->board_transform[3], cam->pos ); + for( u32 i=0; ient_route ); i++ ){ + ent_route *route = mdl_arritm( &world->ent_route, i ); + float dist = v3_dist2( route->board_transform[3], cam->pos ); - if( dist < min_dist ){ - min_dist = dist; - closest = i; + if( dist < min_dist ){ + min_dist = dist; + closest = i; + } } - } - ent_route *route = mdl_arritm( &world->ent_route, closest ); - sfd_render( world, cam, route->board_transform ); + ent_route *route = mdl_arritm( &world->ent_route, closest ); + sfd_render( world, cam, route->board_transform ); + } } VG_STATIC void render_world_depth( world_instance *world, camera *cam )