From c52dacb7bc07e300312e45d605d206222dcbb181 Mon Sep 17 00:00:00 2001 From: hgn Date: Fri, 4 Aug 2023 20:40:02 +0100 Subject: [PATCH] chill out cubemaps --- maps_src/mp_spawn/main.mdl | Bin 12501592 -> 12492584 bytes shaders/scene_cubemapped.fs | 3 +- shaders/scene_cubemapped.h | 3 +- skaterift.c | 9 +- world.h | 1 + world_load.c | 7 ++ world_render.c | 187 +++++++++++++++++++++--------------- 7 files changed, 127 insertions(+), 83 deletions(-) diff --git a/maps_src/mp_spawn/main.mdl b/maps_src/mp_spawn/main.mdl index df67868debe60089c287cb5e33aac8f375c65248..56751a797f1a7c42b67d422f877fe556b74b7c4c 100644 GIT binary patch delta 43623 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 diff --git a/shaders/scene_cubemapped.fs b/shaders/scene_cubemapped.fs index 92fdf10..d5a9611 100644 --- a/shaders/scene_cubemapped.fs +++ b/shaders/scene_cubemapped.fs @@ -14,6 +14,7 @@ void main() vec3 vfrag = vec3(0.5,0.5,0.5); vec4 vsamplemain = texture( uTexMain, aUv ); + vec4 wgarbage = texture( uTexGarbage, aCo.xz * 0.0015 + aCo.yx*0.002 ); vec3 qnorm = aNorm.xyz; vfrag = vsamplemain.rgb; @@ -28,5 +29,5 @@ void main() vec3 reflectdir = reflect( halfdir, qnorm ); oColour = mix( oColour, vec4(texture(uTexCubemap,reflectdir).rgb * uColour.rgb, 1.0), - uColour.a ); + uColour.a*wgarbage.b ); } diff --git a/shaders/scene_cubemapped.h b/shaders/scene_cubemapped.h index 8532834..0ffb7ae 100644 --- a/shaders/scene_cubemapped.h +++ b/shaders/scene_cubemapped.h @@ -434,6 +434,7 @@ static struct vg_shader _shader_scene_cubemapped = { "\n" " vec3 vfrag = vec3(0.5,0.5,0.5);\n" " vec4 vsamplemain = texture( uTexMain, aUv );\n" +" vec4 wgarbage = texture( uTexGarbage, aCo.xz * 0.0015 + aCo.yx*0.002 );\n" " vec3 qnorm = aNorm.xyz;\n" " vfrag = vsamplemain.rgb;\n" "\n" @@ -448,7 +449,7 @@ static struct vg_shader _shader_scene_cubemapped = { " vec3 reflectdir = reflect( halfdir, qnorm );\n" " oColour = mix( oColour, \n" " vec4(texture(uTexCubemap,reflectdir).rgb * uColour.rgb, 1.0),\n" -" uColour.a );\n" +" uColour.a*wgarbage.b );\n" "}\n" ""}, }; diff --git a/skaterift.c b/skaterift.c index 40be41e..3188fd9 100644 --- a/skaterift.c +++ b/skaterift.c @@ -507,10 +507,17 @@ VG_STATIC void render_main_game(void){ /* --------------------------------------------------------------------- */ - /* cubemaps TODO: Need a cubemap mark dirty thing for pordals */ world_instance *view_world = localplayer.viewable_world; if( view_world != NULL ){ render_world_cubemaps( view_world ); + + ent_gate *gate = view_world->rendering_gate; + if( gate ){ + if( gate->flags & k_ent_gate_nonlocal ){ + world_instance *dest = &world_static.instances[ gate->target ]; + render_world_cubemaps( dest ); + } + } } /* variable res target */ diff --git a/world.h b/world.h index d3bc388..9c1a1cf 100644 --- a/world.h +++ b/world.h @@ -191,6 +191,7 @@ struct world_instance { glmesh mesh_geo, mesh_no_collide, mesh_water; + u32 cubemap_cooldown, cubemap_side; rb_object rb_geo; diff --git a/world_load.c b/world_load.c index 983feee..b91246f 100644 --- a/world_load.c +++ b/world_load.c @@ -372,6 +372,13 @@ static void world_free( world_instance *world ) vg_linear_header(world->heap) ); } + for( u32 i=0; ient_cubemap); i++ ){ + ent_cubemap *cm = mdl_arritm(&world->ent_cubemap,i); + glDeleteTextures( 1, &cm->texture_id ); + glDeleteFramebuffers( 1, &cm->framebuffer_id ); + glDeleteRenderbuffers( 1, &cm->renderbuffer_id ); + } + world->status = k_world_status_unloaded; } diff --git a/world_render.c b/world_render.c index 525d6da..87f307e 100644 --- a/world_render.c +++ b/world_render.c @@ -294,7 +294,7 @@ VG_STATIC void render_world_vb( world_instance *world, camera *cam ) world_render_both_stages( world, &pass ); } -VG_STATIC void render_world_standard( world_instance *world, camera *cam ){ +VG_STATIC void world_shader_standard_bind( world_instance *world, camera *cam ){ shader_scene_standard_use(); shader_scene_standard_uTexGarbage(0); shader_scene_standard_uTexMain(1); @@ -310,7 +310,10 @@ VG_STATIC void render_world_standard( world_instance *world, camera *cam ){ bind_terrain_noise(); shader_scene_standard_uCamera( cam->transform[3] ); - +} + +VG_STATIC void render_world_standard( world_instance *world, camera *cam ){ + world_shader_standard_bind( world, cam ); struct world_pass pass = { .shader = k_shader_standard, .cam = cam, @@ -322,36 +325,52 @@ VG_STATIC void render_world_standard( world_instance *world, camera *cam ){ world_render_both_stages( world, &pass ); } -VG_STATIC void render_world_cubemapped( world_instance *world, camera *cam ){ +VG_STATIC void render_world_cubemapped( world_instance *world, camera *cam, + int layer_depth ){ if( !mdl_arrcount( &world->ent_cubemap ) ) return; - shader_scene_cubemapped_use(); - shader_scene_cubemapped_uTexGarbage(0); - shader_scene_cubemapped_uTexMain(1); - shader_scene_cubemapped_uTexCubemap(10); - shader_scene_cubemapped_uPv( cam->mtx.pv ); + if( layer_depth == -1 ){ + world_shader_standard_bind( world, cam ); - world_link_lighting_ub( world, _shader_scene_cubemapped.id ); - world_bind_position_texture( world, _shader_scene_cubemapped.id, - _uniform_scene_cubemapped_g_world_depth, 2 ); - world_bind_light_array( world, _shader_scene_cubemapped.id, - _uniform_scene_cubemapped_uLightsArray, 3 ); - world_bind_light_index( world, _shader_scene_cubemapped.id, - _uniform_scene_cubemapped_uLightsIndex, 4 ); + struct world_pass pass = { + .shader = k_shader_cubemap, + .cam = cam, + .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_set_mdl = shader_scene_standard_uMdl, + .fn_set_uPvmPrev = shader_scene_standard_uPvmPrev, + }; - bind_terrain_noise(); - shader_scene_cubemapped_uCamera( cam->transform[3] ); - - struct world_pass pass = { - .shader = k_shader_cubemap, - .cam = cam, - .fn_bind_textures = bindpoint_diffuse1_and_cubemap10, - .fn_set_mdl = shader_scene_cubemapped_uMdl, - .fn_set_uPvmPrev = shader_scene_cubemapped_uPvmPrev, - }; - - world_render_both_stages( world, &pass ); + world_render_both_stages( world, &pass ); + } + else { + shader_scene_cubemapped_use(); + shader_scene_cubemapped_uTexGarbage(0); + shader_scene_cubemapped_uTexMain(1); + shader_scene_cubemapped_uTexCubemap(10); + shader_scene_cubemapped_uPv( cam->mtx.pv ); + + world_link_lighting_ub( world, _shader_scene_cubemapped.id ); + world_bind_position_texture( world, _shader_scene_cubemapped.id, + _uniform_scene_cubemapped_g_world_depth, 2 ); + world_bind_light_array( world, _shader_scene_cubemapped.id, + _uniform_scene_cubemapped_uLightsArray, 3 ); + world_bind_light_index( world, _shader_scene_cubemapped.id, + _uniform_scene_cubemapped_uLightsIndex, 4 ); + + bind_terrain_noise(); + shader_scene_cubemapped_uCamera( cam->transform[3] ); + + struct world_pass pass = { + .shader = k_shader_cubemap, + .cam = cam, + .fn_bind_textures = bindpoint_diffuse1_and_cubemap10, + .fn_set_mdl = shader_scene_cubemapped_uMdl, + .fn_set_uPvmPrev = shader_scene_cubemapped_uPvmPrev, + }; + + world_render_both_stages( world, &pass ); + } } VG_STATIC void render_world_alphatest( world_instance *world, camera *cam ){ @@ -654,11 +673,7 @@ VG_STATIC void render_world( world_instance *world, camera *cam, render_world_routes( world, cam, layer_depth ); render_world_standard( world, cam ); - - if( layer_depth != -1 ){ - /* TODO: RENDER ONLY BASETEXTURE */ - render_world_cubemapped( world, cam ); - } + render_world_cubemapped( world, cam, layer_depth ); render_world_vb( world, cam ); render_world_alphatest( world, cam ); @@ -690,56 +705,68 @@ VG_STATIC void render_world( world_instance *world, camera *cam, } } -VG_STATIC void render_world_cubemaps( world_instance *world ){ - glViewport( 0, 0, WORLD_CUBEMAP_RES, WORLD_CUBEMAP_RES ); +VG_STATIC void render_cubemap_side( world_instance *world, ent_cubemap *cm, + u32 side ){ camera cam; - for( u32 i=0; ient_cubemap ); i++ ){ - ent_cubemap *cm = mdl_arritm( &world->ent_cubemap, i ); + glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_CUBE_MAP_POSITIVE_X + side, cm->texture_id, 0 ); + glClear( GL_DEPTH_BUFFER_BIT ); + + v3f forward[6] = { + { -1.0f, 0.0f, 0.0f }, + { 1.0f, 0.0f, 0.0f }, + { 0.0f, -1.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f }, + { 0.0f, 0.0f, -1.0f }, + { 0.0f, 0.0f, 1.0f } + }; + v3f up[6] = { + { 0.0f, -1.0f, 0.0f }, + { 0.0f, -1.0f, 0.0f }, + { 0.0f, 0.0f, 1.0f }, + { 0.0f, 0.0f, -1.0f }, + { 0.0f, -1.0f, 0.0f }, + { 0.0f, -1.0f, 0.0f } + }; - glBindFramebuffer( GL_FRAMEBUFFER, cm->framebuffer_id ); - - for( u32 j=0; j<6; j++ ){ - glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_CUBE_MAP_POSITIVE_X + j, cm->texture_id, 0 ); - glClear( GL_DEPTH_BUFFER_BIT ); - - v3f forward[6] = { - { -1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 0.0f, -1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 0.0f, -1.0f }, - { 0.0f, 0.0f, 1.0f } - }; - v3f up[6] = { - { 0.0f, -1.0f, 0.0f }, - { 0.0f, -1.0f, 0.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, -1.0f }, - { 0.0f, -1.0f, 0.0f }, - { 0.0f, -1.0f, 0.0f } - }; - - v3_zero( cam.angles ); - v3_copy( cm->co, cam.pos ); - - v3_copy( forward[j], cam.transform[2] ); - v3_copy( up[j], cam.transform[1] ); - v3_cross( up[j], forward[j], cam.transform[0] ); - v3_copy( cm->co, cam.transform[3] ); - m4x3_invert_affine( cam.transform, cam.transform_inverse ); - - camera_update_view( &cam ); - - cam.nearz = 0.1f; - cam.farz = 1000.0f; - cam.fov = 90.0f; - m4x4_copy( cam.mtx.p, cam.mtx_prev.p ); - m4x4_projection( cam.mtx.p, cam.fov, 1.0f, cam.nearz, cam.farz ); - camera_finalize( &cam ); - camera_finalize( &cam ); - - render_world( world, &cam, -1 ); + v3_zero( cam.angles ); + v3_copy( cm->co, cam.pos ); + + v3_copy( forward[side], cam.transform[2] ); + v3_copy( up[side], cam.transform[1] ); + v3_cross( up[side], forward[side], cam.transform[0] ); + v3_copy( cm->co, cam.transform[3] ); + m4x3_invert_affine( cam.transform, cam.transform_inverse ); + + camera_update_view( &cam ); + + cam.nearz = 0.1f; + cam.farz = 1000.0f; + cam.fov = 90.0f; + m4x4_copy( cam.mtx.p, cam.mtx_prev.p ); + m4x4_projection( cam.mtx.p, cam.fov, 1.0f, cam.nearz, cam.farz ); + camera_finalize( &cam ); + camera_finalize( &cam ); + + render_world( world, &cam, -1 ); +} + +VG_STATIC void render_world_cubemaps( world_instance *world ){ + if( world->cubemap_cooldown ) + world->cubemap_cooldown --; + else{ + world->cubemap_cooldown = 60; + + glViewport( 0, 0, WORLD_CUBEMAP_RES, WORLD_CUBEMAP_RES ); + for( u32 i=0; ient_cubemap ); i++ ){ + ent_cubemap *cm = mdl_arritm( &world->ent_cubemap, i ); + glBindFramebuffer( GL_FRAMEBUFFER, cm->framebuffer_id ); + + world->cubemap_side ++; + if( world->cubemap_side >= 6 ) + world->cubemap_side = 0; + + render_cubemap_side( world, cm, world->cubemap_side ); } } } -- 2.25.1