X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.h;h=6a415e631ac4c48882b4472d36f98f28d2547811;hb=456d49acc5e8a2601b8a86317af78355324d8971;hp=f61974e37e791f0b7384b17ef384416086c791b6;hpb=89113e9bc9544336b5ac4f53696c3de2d30698a2;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.h b/world_render.h index f61974e..6a415e6 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_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 ); - } - } - 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,7 +104,8 @@ 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 ); } struct world_pass{ @@ -203,7 +202,8 @@ 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_uCamera( cam->transform[3] ); @@ -308,7 +308,8 @@ 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_uCamera( cam->transform[3] ); @@ -360,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 ); @@ -376,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++ ){ @@ -453,6 +454,7 @@ state->g_time_of_day = vg_fractf( g_time ); 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 ) { @@ -464,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(); - if( !mdl_arrcount( &world->ent_route ) ) - return; + /* Render SFD's */ + u32 closest = 0; + float min_dist = INFINITY; - 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( !mdl_arrcount( &world->ent_route ) ) + return; - if( dist < min_dist ){ - min_dist = dist; - closest = i; + 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; + } } - } - 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 )