From: hgn Date: Fri, 4 Aug 2023 19:40:02 +0000 (+0100) Subject: chill out cubemaps X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=c52dacb7bc07e300312e45d605d206222dcbb181;hp=14b3d5c13faab36bd37ae27aa8c1501ba7146f89;p=carveJwlIkooP6JGAAIwe30JlM.git chill out cubemaps --- diff --git a/maps_src/mp_spawn/main.mdl b/maps_src/mp_spawn/main.mdl index df67868..56751a7 100644 Binary files a/maps_src/mp_spawn/main.mdl and b/maps_src/mp_spawn/main.mdl differ 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 ); } } }