X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.c;h=e6c709afb0d141438a9726256d4889cf06f74a46;hb=137d40d96fe923600d8378b8e138e3c276f27ff4;hp=a7bb6939c6b5d02b07f76e6c5eb29fd2d997afc1;hpb=f2c3e6ffba0231be14961f0149106cecbade8124;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.c b/world_render.c index a7bb693..e6c709a 100644 --- a/world_render.c +++ b/world_render.c @@ -22,10 +22,10 @@ static int ccmd_set_time( int argc, const char *argv[] ){ return 0; } -VG_STATIC void async_world_render_init( void *payload, u32 size ) +static void async_world_render_init( void *payload, u32 size ) { vg_info( "Allocate uniform buffers\n" ); - for( int i=0; i<4; i++ ){ + for( int i=0; iubo_bind_point = i; @@ -39,7 +39,7 @@ VG_STATIC void async_world_render_init( void *payload, u32 size ) } vg_info( "Allocate frame buffers\n" ); - for( int i=0; i<4; i++ ){ + for( int i=0; iheightmap; @@ -65,7 +65,7 @@ VG_STATIC void async_world_render_init( void *payload, u32 size ) } } -VG_STATIC void world_render_init(void) +static void world_render_init(void) { VG_VAR_F32( k_day_length ); VG_VAR_I32( k_debug_light_indices ); @@ -104,46 +104,41 @@ VG_STATIC void world_render_init(void) vg_async_call( async_world_render_init, NULL, 0 ); } -VG_STATIC void world_link_lighting_ub( world_instance *world, GLuint shader ) -{ +static void world_link_lighting_ub( world_instance *world, GLuint shader ){ GLuint idx = glGetUniformBlockIndex( shader, "ub_world_lighting" ); glUniformBlockBinding( shader, idx, world->ubo_bind_point ); } -VG_STATIC void world_bind_position_texture( world_instance *world, +static void world_bind_position_texture( world_instance *world, GLuint shader, GLuint location, - int slot ) -{ + int slot ){ render_fb_bind_texture( &world->heightmap, 0, slot ); glUniform1i( location, slot ); } -VG_STATIC void world_bind_light_array( world_instance *world, +static void world_bind_light_array( world_instance *world, GLuint shader, GLuint location, - int slot ) -{ + int slot ){ glActiveTexture( GL_TEXTURE0 + slot ); glBindTexture( GL_TEXTURE_BUFFER, world->tex_light_entities ); glUniform1i( location, slot ); } -VG_STATIC void world_bind_light_index( world_instance *world, +static void world_bind_light_index( world_instance *world, GLuint shader, GLuint location, - int slot ) -{ + int slot ){ glActiveTexture( GL_TEXTURE0 + slot ); glBindTexture( GL_TEXTURE_3D, world->tex_light_cubes ); glUniform1i( location, slot ); } -VG_STATIC void render_world_depth( world_instance *world, camera *cam ); +static void render_world_depth( world_instance *world, camera *cam ); /* * Rendering */ -VG_STATIC void bind_terrain_noise(void) -{ +static void bind_terrain_noise(void){ glActiveTexture( GL_TEXTURE0 ); glBindTexture( GL_TEXTURE_2D, world_render.tex_terrain_noise ); } @@ -159,7 +154,7 @@ struct world_pass{ void (*fn_set_uPvmPrev)( m4x4f pvm ); }; -VG_STATIC +static void world_render_traffic( world_instance *world, u32 material_id, struct world_pass *pass ){ if( !mdl_arrcount( &world->ent_traffic ) ) return; @@ -197,7 +192,7 @@ void world_render_traffic( world_instance *world, u32 material_id, } } -VG_STATIC +static void world_render_pass( world_instance *world, struct world_pass *pass ){ for( int i=0; isurface_count; i++ ){ struct world_surface *mat = &world->surfaces[i]; @@ -227,7 +222,7 @@ void world_render_pass( world_instance *world, struct world_pass *pass ){ } } -VG_STATIC +static void world_render_both_stages( world_instance *world, struct world_pass *pass ) { mesh_bind( &world->mesh_geo ); @@ -241,7 +236,7 @@ void world_render_both_stages( world_instance *world, struct world_pass *pass ) glEnable( GL_CULL_FACE ); } -VG_STATIC void bindpoint_diffuse_texture1( world_instance *world, +static void bindpoint_diffuse_texture1( world_instance *world, struct world_surface *mat ) { @@ -249,7 +244,7 @@ VG_STATIC void bindpoint_diffuse_texture1( world_instance *world, glBindTexture( GL_TEXTURE_2D, world->textures[ mat->info.tex_diffuse ] ); } -VG_STATIC void bindpoint_diffuse1_and_cubemap10( world_instance *world, +static void bindpoint_diffuse1_and_cubemap10( world_instance *world, struct world_surface *mat ){ glActiveTexture( GL_TEXTURE1 ); glBindTexture( GL_TEXTURE_2D, world->textures[ mat->info.tex_diffuse ] ); @@ -268,8 +263,7 @@ VG_STATIC void bindpoint_diffuse1_and_cubemap10( world_instance *world, shader_scene_cubemapped_uColour( mat->info.colour ); } -VG_STATIC void render_world_vb( world_instance *world, camera *cam ) -{ +static void render_world_vb( world_instance *world, camera *cam ){ shader_scene_vertex_blend_use(); shader_scene_vertex_blend_uTexGarbage(0); shader_scene_vertex_blend_uTexGradients(1); @@ -298,7 +292,7 @@ VG_STATIC void render_world_vb( world_instance *world, camera *cam ) world_render_both_stages( world, &pass ); } -VG_STATIC void world_shader_standard_bind( world_instance *world, camera *cam ){ +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); @@ -316,7 +310,7 @@ VG_STATIC void world_shader_standard_bind( world_instance *world, camera *cam ){ shader_scene_standard_uCamera( cam->transform[3] ); } -VG_STATIC void render_world_standard( world_instance *world, camera *cam ){ +static void render_world_standard( world_instance *world, camera *cam ){ world_shader_standard_bind( world, cam ); struct world_pass pass = { .shader = k_shader_standard, @@ -329,7 +323,7 @@ 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, +static void render_world_cubemapped( world_instance *world, camera *cam, int layer_depth ){ if( !mdl_arrcount( &world->ent_cubemap ) ) return; @@ -377,7 +371,7 @@ VG_STATIC void render_world_cubemapped( world_instance *world, camera *cam, } } -VG_STATIC void render_world_alphatest( world_instance *world, camera *cam ){ +static void render_world_alphatest( world_instance *world, camera *cam ){ shader_scene_standard_alphatest_use(); shader_scene_standard_alphatest_uTexGarbage(0); shader_scene_standard_alphatest_uTexMain(1); @@ -412,11 +406,12 @@ VG_STATIC void render_world_alphatest( world_instance *world, camera *cam ){ glEnable(GL_CULL_FACE); } -VG_STATIC +static void world_render_challenges( world_instance *world, struct world_pass *pass, v3f pos, int layer_depth ){ if( !world ) return; if( skaterift.activity == k_skaterift_replay ) return; + if( world != world_current_instance() ) return; /* sort lists */ f32 radius = 40.0f; @@ -453,7 +448,7 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, while( mdl_entity_id_type(next) == k_ent_objective ){ u32 index = mdl_entity_id_id( next ); objective_list[ objective_count ++ ] = index; - + ent_objective *objective = mdl_arritm( &world->ent_objective, index ); next = objective->id_next; } @@ -528,30 +523,7 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, } /* render texts */ - shader_scene_font_use(); - shader_scene_font_uTexGarbage(0); - shader_scene_font_uTexMain(1); - - shader_scene_font_uPv( skaterift.cam.mtx.pv ); - shader_scene_font_uTime( vg.time ); - - /* TODO: Code dupe... */ - world_link_lighting_ub( world, _shader_scene_font.id ); - world_bind_position_texture( world, _shader_scene_font.id, - _uniform_scene_font_g_world_depth, 2 ); - world_bind_light_array( world, _shader_scene_font.id, - _uniform_scene_font_uLightsArray, 3 ); - world_bind_light_index( world, _shader_scene_font.id, - _uniform_scene_font_uLightsIndex, 4 ); - - bind_terrain_noise(); - shader_scene_font_uCamera( skaterift.cam.transform[3] ); - - //shader_scene_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} ); - glActiveTexture( GL_TEXTURE1 ); - glBindTexture( GL_TEXTURE_2D, gui.font.texture ); - - mesh_bind( &gui.font.mesh ); + font3d_bind( &gui.font, k_font_shader_world, 0, world, &skaterift.cam ); char buf[32]; u32 count = 0; @@ -567,7 +539,7 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, c+=highscore_intl( buf+c, mdl_arrcount(&world->ent_challenge), 3 ); buf[c++] = '\0'; - f32 w = font3d_string_width( &gui.font, 1, buf ); + f32 w = font3d_string_width( 1, buf ); m4x3f mlocal; m3x3_identity( mlocal ); mlocal[3][0] = -w*0.5f; @@ -592,19 +564,11 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, shader_scene_font_uOpacity( scale ); shader_scene_font_uColourize( colour ); - - struct font3d_render render = { - .font = &gui.font, - .variant_id = 1, - .shader = k_font_shader_world - }; - - font3d_begin( buf, &skaterift.cam, mmdl, &render ); - font3d_draw( &render ); + font3d_simple_draw( 1, buf, &skaterift.cam, mmdl ); } } -VG_STATIC void render_world_fxglow( world_instance *world, camera *cam, +static void render_world_fxglow( world_instance *world, camera *cam, int layer_depth ){ shader_scene_fxglow_use(); shader_scene_fxglow_uUvOffset( (v2f){ 0.0f, 0.0f } ); @@ -636,7 +600,7 @@ VG_STATIC void render_world_fxglow( world_instance *world, camera *cam, glEnable(GL_CULL_FACE); } -VG_STATIC void bindpoint_terrain( world_instance *world, +static void bindpoint_terrain( world_instance *world, struct world_surface *mat ) { glActiveTexture( GL_TEXTURE1 ); @@ -646,25 +610,24 @@ VG_STATIC void bindpoint_terrain( world_instance *world, shader_scene_terrain_uBlendOffset( mat->info.colour1 ); } -VG_STATIC void bindpoint_none( world_instance *world, - struct world_surface *mat ){ - +static void bindpoint_override( world_instance *world, + struct world_surface *mat ){ + if( mat->info.flags & k_material_flag_collision ){ + shader_scene_override_uAlphatest(0); + } + else{ + glActiveTexture( GL_TEXTURE1 ); + glBindTexture( GL_TEXTURE_2D, world->textures[ mat->info.tex_diffuse ] ); + shader_scene_override_uAlphatest(1); + } } -VG_STATIC void render_terrain( world_instance *world, camera *cam ) -{ +static void render_terrain( world_instance *world, camera *cam ){ shader_scene_terrain_use(); shader_scene_terrain_uTexGarbage(0); shader_scene_terrain_uTexGradients(1); - world_link_lighting_ub( world, _shader_scene_terrain.id ); - world_bind_position_texture( world, _shader_scene_terrain.id, - _uniform_scene_terrain_g_world_depth, 2 ); - world_bind_light_array( world, _shader_scene_terrain.id, - _uniform_scene_terrain_uLightsArray, 3 ); - world_bind_light_index( world, _shader_scene_terrain.id, - _uniform_scene_terrain_uLightsIndex, 4 ); - + WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, scene_terrain ); glActiveTexture( GL_TEXTURE0 ); glBindTexture( GL_TEXTURE_2D, world_render.tex_terrain_noise ); @@ -682,7 +645,7 @@ VG_STATIC void render_terrain( world_instance *world, camera *cam ) world_render_both_stages( world, &pass ); } -VG_STATIC void render_sky( world_instance *world, camera *cam ) +static void render_sky( world_instance *world, camera *cam ) { /* * Modify matrix to remove clipping and view translation @@ -731,7 +694,7 @@ VG_STATIC void render_sky( world_instance *world, camera *cam ) glDepthMask( GL_TRUE ); } -VG_STATIC void render_world_gates( world_instance *world, camera *cam, +static void render_world_gates( world_instance *world, camera *cam, int layer_depth ) { float closest = INFINITY; @@ -772,7 +735,7 @@ VG_STATIC void render_world_gates( world_instance *world, camera *cam, } } -VG_STATIC void world_prerender( world_instance *world ) +static void world_prerender( world_instance *world ) { if( mdl_arrcount( &world->ent_light ) ){ @@ -821,7 +784,7 @@ VG_STATIC void world_prerender( world_instance *world ) sizeof(struct ub_world_lighting), &world->ub_lighting ); } -VG_STATIC void render_world( world_instance *world, camera *cam, +static void render_world( world_instance *world, camera *cam, int layer_depth ) { render_sky( world, cam ); @@ -885,7 +848,7 @@ VG_STATIC void render_world( world_instance *world, camera *cam, } -VG_STATIC +static void render_world_override_pass( world_instance *world, struct world_pass *pass ){ for( int i=0; isurface_count; i++ ){ @@ -911,10 +874,10 @@ void render_world_override_pass( world_instance *world, } } -VG_STATIC void render_world_override( world_instance *world ){ +static void render_world_override( world_instance *world ){ struct world_pass pass = { .cam = &skaterift.cam, - .fn_bind_textures = bindpoint_none, + .fn_bind_textures = bindpoint_override, .fn_set_mdl = shader_scene_override_uMdl, .fn_set_uPvmPrev = shader_scene_override_uPvmPrev, .shader = k_shader_override @@ -926,14 +889,7 @@ VG_STATIC void render_world_override( world_instance *world ){ shader_scene_override_uTexMain(1); shader_scene_override_uPv( pass.cam->mtx.pv ); - world_link_lighting_ub( world, _shader_scene_override.id ); - world_bind_position_texture( world, _shader_scene_override.id, - _uniform_scene_override_g_world_depth, 2 ); - world_bind_light_array( world, _shader_scene_override.id, - _uniform_scene_override_uLightsArray, 3 ); - world_bind_light_index( world, _shader_scene_override.id, - _uniform_scene_override_uLightsIndex, 4 ); - + WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, scene_override ); bind_terrain_noise(); shader_scene_override_uCamera( pass.cam->transform[3] ); @@ -947,7 +903,7 @@ VG_STATIC void render_world_override( world_instance *world ){ glEnable( GL_CULL_FACE ); } -VG_STATIC void render_cubemap_side( world_instance *world, ent_cubemap *cm, +static void render_cubemap_side( world_instance *world, ent_cubemap *cm, u32 side ){ camera cam; glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, @@ -993,7 +949,7 @@ VG_STATIC void render_cubemap_side( world_instance *world, ent_cubemap *cm, render_world( world, &cam, -1 ); } -VG_STATIC void render_world_cubemaps( world_instance *world ){ +static void render_world_cubemaps( world_instance *world ){ if( world->cubemap_cooldown ) world->cubemap_cooldown --; else{ @@ -1013,8 +969,7 @@ VG_STATIC void render_world_cubemaps( world_instance *world ){ } } -VG_STATIC void render_world_depth( world_instance *world, camera *cam ) -{ +static void render_world_depth( world_instance *world, camera *cam ){ m4x3f identity_matrix; m4x3_identity( identity_matrix ); @@ -1029,8 +984,7 @@ VG_STATIC void render_world_depth( world_instance *world, camera *cam ) mesh_draw( &world->mesh_geo ); } -VG_STATIC void render_world_position( world_instance *world, camera *cam ) -{ +static void render_world_position( world_instance *world, camera *cam ){ m4x3f identity_matrix; m4x3_identity( identity_matrix );