X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.c;h=e1a30886b8de504afacda8052fbef4e9eba4c2ef;hb=93790b71d3a89724255dc73239e38c08ad4bbac7;hp=1b1a9c08399d1d68020c58e37d673e18dc5748a2;hpb=8d336ea2cde7c596296dbaf0d3ce27a82c6c6cf0;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.c b/world_render.c index 1b1a9c0..e1a3088 100644 --- a/world_render.c +++ b/world_render.c @@ -145,25 +145,27 @@ static GLuint world_get_texture( world_instance *world, u32 id ){ else return world->textures[ id ]; } +#if 0 static void bindpoint_diffuse_texture1( world_instance *world, - struct world_surface *mat ){ + struct world_surface *mat ){ glActiveTexture( GL_TEXTURE1 ); glBindTexture( GL_TEXTURE_2D, world_get_texture(world,mat->info.tex_diffuse) ); } +#endif /* * Passes Rendering * ---------------------------------------------------------------------------- */ -struct world_pass{ +struct world_pass +{ vg_camera *cam; enum mdl_shader shader; enum world_geo_type geo_type; - void (*fn_bind_textures)( world_instance *world, - struct world_surface *mat ); + void (*fn_bind)( world_instance *world, struct world_surface *mat ); void (*fn_set_mdl)( m4x3f mdl ); void (*fn_set_uPvmPrev)( m4x4f pvm ); void (*fn_set_uNormalMtx)( m3x3f mnorm ); @@ -177,10 +179,13 @@ void render_world_depth( world_instance *world, vg_camera *cam ); static void world_render_submeshes( world_instance *world, struct world_pass *pass, mdl_transform *transform, - u32 start, u32 count, u32 material_id ){ - for( u32 k=0; kmeta.submeshs, start+k ); - if( sm->material_id != material_id ) continue; + if( sm->material_id != material_id ) + continue; m4x3f mmdl; mdl_transform_m4x3( transform, mmdl ); @@ -200,11 +205,12 @@ static void world_render_submeshes( world_instance *world, * Render props attached to this material */ static void world_render_props( world_instance *world, u32 material_id, - struct world_pass *pass ){ + struct world_pass *pass ) +{ struct world_surface *mat = &world->surfaces[ material_id ]; if( !(mat->flags & WORLD_SURFACE_HAS_PROPS) ) return; - pass->fn_bind_textures( world, mat ); + pass->fn_bind( world, mat ); for( u32 j=0; jent_prop ); j++ ){ ent_prop *prop = mdl_arritm( &world->ent_prop, j ); @@ -219,11 +225,12 @@ static void world_render_props( world_instance *world, u32 material_id, * Render traffic models attactched to this material */ static void world_render_traffic( world_instance *world, u32 material_id, - struct world_pass *pass ){ + struct world_pass *pass ) +{ struct world_surface *mat = &world->surfaces[ material_id ]; if( !(mat->flags & WORLD_SURFACE_HAS_TRAFFIC) ) return; - pass->fn_bind_textures( world, mat ); + pass->fn_bind( world, mat ); for( u32 j=0; jent_traffic ); j++ ){ ent_traffic *traffic = mdl_arritm( &world->ent_traffic, j ); @@ -238,17 +245,22 @@ static void world_render_traffic( world_instance *world, u32 material_id, * Iterate and render all materials which match the passes shader and geometry * type. Includes props/traffic. */ -static void world_render_pass( world_instance *world, struct world_pass *pass ){ - for( int i=0; isurface_count; i++ ){ +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]; - if( mat->info.shader == pass->shader ){ + if( mat->info.shader == pass->shader ) + { mdl_submesh *sm; - if( pass->geo_type == k_world_geo_type_solid ){ + if( pass->geo_type == k_world_geo_type_solid ) + { sm = &mat->sm_geo; } - else{ + else + { world_render_traffic( world, i, pass ); world_render_props( world, i, pass ); sm = &mat->sm_no_collide; @@ -261,8 +273,7 @@ static void world_render_pass( world_instance *world, struct world_pass *pass ){ m4x3_identity( mmdl ); pass->fn_set_mdl( mmdl ); pass->fn_set_uPvmPrev( pass->cam->mtx_prev.pv ); - - pass->fn_bind_textures( world, mat ); + pass->fn_bind( world, mat ); mdl_draw_submesh( sm ); } } @@ -274,7 +285,8 @@ static void world_render_pass( world_instance *world, struct world_pass *pass ){ */ static void world_render_both_stages( world_instance *world, - struct world_pass *pass ){ + struct world_pass *pass ) +{ mesh_bind( &world->mesh_geo ); pass->geo_type = k_world_geo_type_solid; world_render_pass( world, pass ); @@ -286,7 +298,21 @@ static void world_render_both_stages( world_instance *world, glEnable( GL_CULL_FACE ); } -static void render_world_vb( world_instance *world, vg_camera *cam ){ +static void bindpoint_world_vb( world_instance *world, + struct world_surface *mat ) +{ + struct shader_props_vertex_blend *props = mat->info.props.compiled; + + glActiveTexture( GL_TEXTURE1 ); + glBindTexture( GL_TEXTURE_2D, world_get_texture(world, props->tex_diffuse) ); + +#if 0 + shader_scene_vertex_blend_uOffset( props->blend_offset ); +#endif +} + +static void render_world_vb( world_instance *world, vg_camera *cam ) +{ shader_scene_vertex_blend_use(); shader_scene_vertex_blend_uTexGarbage(0); shader_scene_vertex_blend_uTexGradients(1); @@ -298,10 +324,11 @@ static void render_world_vb( world_instance *world, vg_camera *cam ){ shader_scene_vertex_blend_uPv( cam->mtx.pv ); shader_scene_vertex_blend_uCamera( cam->transform[3] ); - struct world_pass pass = { + struct world_pass pass = + { .shader = k_shader_standard_vertex_blend, .cam = cam, - .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_bind = bindpoint_world_vb, .fn_set_mdl = shader_scene_vertex_blend_uMdl, .fn_set_uPvmPrev = shader_scene_vertex_blend_uPvmPrev, }; @@ -309,7 +336,8 @@ static void render_world_vb( world_instance *world, vg_camera *cam ){ world_render_both_stages( world, &pass ); } -static void world_shader_standard_bind( world_instance *world, vg_camera *cam ){ +static void world_shader_standard_bind( world_instance *world, vg_camera *cam ) +{ shader_scene_standard_use(); shader_scene_standard_uTexGarbage(0); shader_scene_standard_uTexMain(1); @@ -320,12 +348,23 @@ static void world_shader_standard_bind( world_instance *world, vg_camera *cam ){ shader_scene_standard_uCamera( cam->transform[3] ); } -static void render_world_standard( world_instance *world, vg_camera *cam ){ +static void bindpoint_standard( world_instance *world, + struct world_surface *mat ) +{ + struct shader_props_standard *props = mat->info.props.compiled; + + glActiveTexture( GL_TEXTURE1 ); + glBindTexture( GL_TEXTURE_2D, world_get_texture(world, props->tex_diffuse) ); +} + +static void render_world_standard( world_instance *world, vg_camera *cam ) +{ world_shader_standard_bind( world, cam ); - struct world_pass pass = { + struct world_pass pass = + { .shader = k_shader_standard, .cam = cam, - .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_bind = bindpoint_standard, .fn_set_mdl = shader_scene_standard_uMdl, .fn_set_uPvmPrev = shader_scene_standard_uPvmPrev, }; @@ -333,16 +372,20 @@ static void render_world_standard( world_instance *world, vg_camera *cam ){ world_render_both_stages( world, &pass ); } -static void bindpoint_diffuse1_and_cubemap10( world_instance *world, - struct world_surface *mat ){ +static void bindpoint_world_cubemapped( world_instance *world, + struct world_surface *mat ) +{ + struct shader_props_cubemapped *props = mat->info.props.compiled; + glActiveTexture( GL_TEXTURE1 ); glBindTexture( GL_TEXTURE_2D, - world_get_texture(world,mat->info.tex_diffuse) ); + world_get_texture( world,props->tex_diffuse ) ); - u32 cubemap_id = mat->info.tex_none0, + u32 cubemap_id = props->cubemap_entity, cubemap_index = 0; - if( mdl_entity_id_type( cubemap_id ) == k_ent_cubemap ){ + if( mdl_entity_id_type( cubemap_id ) == k_ent_cubemap ) + { cubemap_index = mdl_entity_id_id( cubemap_id ); } @@ -350,28 +393,42 @@ static void bindpoint_diffuse1_and_cubemap10( world_instance *world, glActiveTexture( GL_TEXTURE10 ); glBindTexture( GL_TEXTURE_CUBE_MAP, cm->texture_id ); - shader_scene_cubemapped_uColour( mat->info.colour ); + shader_scene_cubemapped_uColour( props->tint ); +} + +static void bindpoint_world_cubemapped_disabled( world_instance *world, + struct world_surface *mat ) +{ + struct shader_props_cubemapped *props = mat->info.props.compiled; + + glActiveTexture( GL_TEXTURE1 ); + glBindTexture( GL_TEXTURE_2D, + world_get_texture( world, props->tex_diffuse ) ); } static void render_world_cubemapped( world_instance *world, vg_camera *cam, - int enabled ){ + int enabled ) +{ if( !mdl_arrcount( &world->ent_cubemap ) ) return; - if( !enabled ){ + if( !enabled ) + { world_shader_standard_bind( world, cam ); - struct world_pass pass = { + struct world_pass pass = + { .shader = k_shader_cubemap, .cam = cam, - .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_bind = bindpoint_world_cubemapped_disabled, .fn_set_mdl = shader_scene_standard_uMdl, .fn_set_uPvmPrev = shader_scene_standard_uPvmPrev, }; world_render_both_stages( world, &pass ); } - else { + else + { shader_scene_cubemapped_use(); shader_scene_cubemapped_uTexGarbage(0); shader_scene_cubemapped_uTexMain(1); @@ -383,10 +440,11 @@ static void render_world_cubemapped( world_instance *world, vg_camera *cam, bind_terrain_noise(); shader_scene_cubemapped_uCamera( cam->transform[3] ); - struct world_pass pass = { + struct world_pass pass = + { .shader = k_shader_cubemap, .cam = cam, - .fn_bind_textures = bindpoint_diffuse1_and_cubemap10, + .fn_bind = bindpoint_world_cubemapped, .fn_set_mdl = shader_scene_cubemapped_uMdl, .fn_set_uPvmPrev = shader_scene_cubemapped_uPvmPrev, }; @@ -395,7 +453,8 @@ static void render_world_cubemapped( world_instance *world, vg_camera *cam, } } -static void render_world_alphatest( world_instance *world, vg_camera *cam ){ +static void render_world_alphatest( world_instance *world, vg_camera *cam ) +{ shader_scene_standard_alphatest_use(); shader_scene_standard_alphatest_uTexGarbage(0); shader_scene_standard_alphatest_uTexMain(1); @@ -407,10 +466,11 @@ static void render_world_alphatest( world_instance *world, vg_camera *cam ){ shader_scene_standard_alphatest_uCamera( cam->transform[3] ); glDisable(GL_CULL_FACE); - struct world_pass pass = { + struct world_pass pass = + { .shader = k_shader_standard_cutout, .cam = cam, - .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_bind = bindpoint_standard, .fn_set_mdl = shader_scene_standard_alphatest_uMdl, .fn_set_uPvmPrev = shader_scene_standard_alphatest_uPvmPrev, }; @@ -419,7 +479,8 @@ static void render_world_alphatest( world_instance *world, vg_camera *cam ){ glEnable(GL_CULL_FACE); } -static void render_world_foliage( world_instance *world, vg_camera *cam ){ +static void render_world_foliage( world_instance *world, vg_camera *cam ) +{ shader_scene_foliage_use(); shader_scene_foliage_uTexGarbage(0); shader_scene_foliage_uTexMain(1); @@ -431,10 +492,11 @@ static void render_world_foliage( world_instance *world, vg_camera *cam ){ shader_scene_foliage_uCamera( cam->transform[3] ); glDisable(GL_CULL_FACE); - struct world_pass pass = { + struct world_pass pass = + { .shader = k_shader_foliage, .cam = cam, - .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_bind = bindpoint_standard, .fn_set_mdl = shader_scene_foliage_uMdl, .fn_set_uPvmPrev = shader_scene_foliage_uPvmPrev, }; @@ -443,7 +505,8 @@ static void render_world_foliage( world_instance *world, vg_camera *cam ){ } static void world_render_challenges( world_instance *world, - struct world_pass *pass, v3f pos ){ + struct world_pass *pass, v3f pos ) +{ if( !world ) return; if( skaterift.activity == k_skaterift_replay ) return; if( world != world_current_instance() ) return; @@ -515,7 +578,8 @@ static void world_render_challenges( world_instance *world, glDisable( GL_CULL_FACE ); mesh_bind( &world->mesh_no_collide ); u32 last_material = 0; - for( u32 i=0; ient_objective, index ); if( (objective->flags & k_ent_objective_hidden) && @@ -523,7 +587,8 @@ static void world_render_challenges( world_instance *world, f32 scale = 1.0f; - if( running ){ + if( running ) + { u32 passed = objective->flags & k_ent_objective_passed; f32 target = passed? 0.0f: 1.0f; vg_slewf(&objective->transform.s[0], target, vg.time_frame_delta*4.0f); @@ -534,7 +599,8 @@ static void world_render_challenges( world_instance *world, else shader_scene_fxglow_uUvOffset( (v2f){ 8.0f/256.0f, 0.0f } ); } - else { + else + { f32 dist = v3_dist( objective->transform.co, pos ) * (1.0f/radius); scale = vg_smoothstepf( vg_clampf( 5.0f-dist*5.0f, 0.0f,1.0f ) ); } @@ -545,13 +611,15 @@ static void world_render_challenges( world_instance *world, v3_copy( objective->transform.co, mmdl[3] ); shader_scene_fxglow_uMdl( mmdl ); - for( u32 j=0; jsubmesh_count; j++ ){ + for( u32 j=0; jsubmesh_count; j++ ) + { mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, objective->submesh_start + j ); - if( sm->material_id != last_material ){ + if( sm->material_id != last_material ) + { last_material = sm->material_id; - pass->fn_bind_textures( world, &world->surfaces[sm->material_id] ); + pass->fn_bind( world, &world->surfaces[sm->material_id] ); } mdl_draw_submesh( sm ); } @@ -605,10 +673,20 @@ static void world_render_challenges( world_instance *world, } } +static void bindpoint_fxglow( world_instance *world, + struct world_surface *mat ) +{ + struct shader_props_standard *props = mat->info.props.compiled; + + glActiveTexture( GL_TEXTURE1 ); + glBindTexture( GL_TEXTURE_2D, world_get_texture(world, props->tex_diffuse) ); +} + static void render_world_fxglow( world_instance *host_world, world_instance *world, vg_camera *cam, m4x3f world_mmdl, - int generic, int challenges, int regions ){ + int generic, int challenges, int regions ) +{ shader_scene_fxglow_use(); shader_scene_fxglow_uUvOffset( (v2f){ 0.0f, 0.0f } ); shader_scene_fxglow_uTexMain(1); @@ -618,10 +696,11 @@ static void render_world_fxglow( world_instance *host_world, shader_scene_fxglow_uCamera( cam->transform[3] ); glDisable(GL_CULL_FACE); - struct world_pass pass = { + struct world_pass pass = + { .shader = k_shader_fxglow, .cam = cam, - .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_bind = bindpoint_fxglow, .fn_set_mdl = shader_scene_fxglow_uMdl, .fn_set_uPvmPrev = shader_scene_fxglow_uPvmPrev, }; @@ -650,13 +729,15 @@ static void render_world_fxglow( world_instance *host_world, m4x3_mul( world_mmdl, mmdl, mmdl ); shader_scene_fxglow_uMdl( mmdl ); - for( u32 j=0; jsubmesh_count; j++ ){ + for( u32 j=0; jsubmesh_count; j++ ) + { mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, region->submesh_start + j ); - if( sm->material_id != last_material ){ + if( sm->material_id != last_material ) + { last_material = sm->material_id; - pass.fn_bind_textures(world,&world->surfaces[sm->material_id]); + pass.fn_bind( world, &world->surfaces[sm->material_id] ); } mdl_draw_submesh( sm ); } @@ -670,30 +751,33 @@ static void render_world_fxglow( world_instance *host_world, } static void bindpoint_terrain( world_instance *world, - struct world_surface *mat ) + struct world_surface *mat ) { - glActiveTexture( GL_TEXTURE1 ); - glBindTexture( GL_TEXTURE_2D, - world_get_texture(world,mat->info.tex_diffuse) ); + struct shader_props_terrain *props = mat->info.props.compiled; - shader_scene_terrain_uSandColour( mat->info.colour ); - shader_scene_terrain_uBlendOffset( mat->info.colour1 ); + glActiveTexture( GL_TEXTURE1 ); + glBindTexture( GL_TEXTURE_2D, world_get_texture(world, props->tex_diffuse) ); + shader_scene_terrain_uBlendOffset( props->blend_offset ); + shader_scene_terrain_uSandColour( props->sand_colour ); } static void bindpoint_override( world_instance *world, - struct world_surface *mat ){ - if( mat->info.flags & k_material_flag_collision ){ + struct world_surface *mat ) +{ + if( mat->info.flags & k_material_flag_collision ) + { shader_scene_override_uAlphatest(0); } - else{ + else + { glActiveTexture( GL_TEXTURE1 ); - glBindTexture( GL_TEXTURE_2D, - world_get_texture(world,mat->info.tex_diffuse) ); + glBindTexture( GL_TEXTURE_2D, world_get_texture(world, mat->alpha_tex) ); shader_scene_override_uAlphatest(1); } } -static void render_terrain( world_instance *world, vg_camera *cam ){ +static void render_terrain( world_instance *world, vg_camera *cam ) +{ shader_scene_terrain_use(); shader_scene_terrain_uTexGarbage(0); shader_scene_terrain_uTexGradients(1); @@ -705,10 +789,11 @@ static void render_terrain( world_instance *world, vg_camera *cam ){ shader_scene_terrain_uPv( cam->mtx.pv ); shader_scene_terrain_uCamera( cam->transform[3] ); - struct world_pass pass = { + struct world_pass pass = + { .shader = k_shader_terrain_blend, .cam = cam, - .fn_bind_textures = bindpoint_terrain, + .fn_bind = bindpoint_terrain, .fn_set_mdl = shader_scene_terrain_uMdl, .fn_set_uPvmPrev = shader_scene_terrain_uPvmPrev, }; @@ -716,7 +801,8 @@ static void render_terrain( world_instance *world, vg_camera *cam ){ world_render_both_stages( world, &pass ); } -static void render_sky( world_instance *world, vg_camera *cam ){ +static void render_sky( world_instance *world, vg_camera *cam ) +{ /* * Modify matrix to remove clipping and view translation */ @@ -1059,8 +1145,10 @@ void render_world( world_instance *world, vg_camera *cam, static void render_world_override_pass( world_instance *world, struct world_pass *pass, m4x3f mmdl, m3x3f mnormal, - m4x4f mpvm_prev ){ - for( int i=0; isurface_count; i++ ){ + m4x4f mpvm_prev ) +{ + for( int i=0; isurface_count; i++ ) + { struct world_surface *mat = &world->surfaces[i]; if( mat->info.flags & k_material_flag_ghosts ) continue; @@ -1076,7 +1164,7 @@ static void render_world_override_pass( world_instance *world, pass->fn_set_mdl( mmdl ); pass->fn_set_uNormalMtx( mnormal ); pass->fn_set_uPvmPrev( mpvm_prev ); - pass->fn_bind_textures( world, mat ); + pass->fn_bind( world, mat ); mdl_draw_submesh( sm ); } } @@ -1087,9 +1175,10 @@ void render_world_override( world_instance *world, vg_camera *cam, ent_spawn *dest_spawn, v4f map_info ) { - struct world_pass pass = { + struct world_pass pass = + { .cam = cam, - .fn_bind_textures = bindpoint_override, + .fn_bind = bindpoint_override, .fn_set_mdl = shader_scene_override_uMdl, .fn_set_uPvmPrev = shader_scene_override_uPvmPrev, .fn_set_uNormalMtx = shader_scene_override_uNormalMtx,