X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.c;h=950e35fe8855aa08ca12b1e649ecde3bd827a58f;hb=09fc72b08113fa157a3abb2ded6086babedd10cf;hp=8255d5355b35ffa31bbc418d17851ad08c51ef3c;hpb=342fcbf6fda017bdd38d56ce0fa7c9e59e589f3b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.c b/world_render.c index 8255d53..950e35f 100644 --- a/world_render.c +++ b/world_render.c @@ -8,6 +8,17 @@ #include "world.h" #include "world_render.h" +static int ccmd_set_time( int argc, const char *argv[] ){ + if( argc == 1 ){ + world_instance *world = world_current_instance(); + world->time = atof( argv[0] ); + } + else { + vg_error( "Usage set_time <0-1.0>\n" ); + } + return 0; +} + VG_STATIC void async_world_render_init( void *payload, u32 size ) { vg_info( "Allocate uniform buffers\n" ); @@ -53,14 +64,33 @@ VG_STATIC void async_world_render_init( void *payload, u32 size ) VG_STATIC void world_render_init(void) { + VG_VAR_F32( k_day_length ); + VG_VAR_I32( k_debug_light_indices ); + VG_VAR_I32( k_debug_light_complexity ); + VG_VAR_I32( k_light_preview ); + vg_console_reg_cmd( "set_time", ccmd_set_time, NULL ); + + world_render.sky_rate = 1.0; + world_render.sky_target_rate = 1.0; + shader_scene_standard_register(); shader_scene_standard_alphatest_register(); + shader_scene_fxglow_register(); shader_scene_vertex_blend_register(); shader_scene_terrain_register(); shader_scene_depth_register(); shader_scene_position_register(); shader_model_sky_register(); + vg_info( "Loading world resources\n" ); + vg_linear_clear( vg_mem.scratch ); + + mdl_context msky; + mdl_open( &msky, "models/rs_skydome.mdl", vg_mem.scratch ); + mdl_load_metadata_block( &msky, vg_mem.scratch ); + mdl_async_load_glmesh( &msky, &world_render.skydome ); + mdl_close( &msky ); + vg_info( "Loading default world textures\n" ); vg_tex2d_load_qoi_async_file( "textures/garbage.qoi", VG_TEX2D_NEAREST|VG_TEX2D_REPEAT, @@ -124,7 +154,10 @@ struct world_pass{ void (*fn_set_uPvmPrev)( m4x4f pvm ); }; -VG_STATIC void world_render_if( world_instance *world, struct world_pass *pass ) +/* TODO: high level control pass renders. */ + +VG_STATIC +void world_render_if( world_instance *world, struct world_pass *pass ) { for( int i=0; isurface_count; i++ ){ struct world_surface *mat = &world->surfaces[i]; @@ -172,6 +205,20 @@ VG_STATIC void world_render_if( world_instance *world, struct world_pass *pass ) } } +VG_STATIC +void world_render_challenges( world_instance *world ){ + if( !world ) return; + + shader_scene_fxglow_use(); + for( u32 i=0; ient_challenge); i++ ){ + ent_challenge *challenge = mdl_arritm(&world->ent_challenge,i); + + m4x3f mmdl; + mdl_transform_m4x3( &challenge->transform, mmdl ); + shader_scene_fxglow_uMdl( mmdl ); + } +} + VG_STATIC void world_render_both_stages( world_instance *world, struct world_pass *pass ) { @@ -289,6 +336,38 @@ VG_STATIC void render_world_alphatest( world_instance *world, camera *cam ) glEnable(GL_CULL_FACE); } +VG_STATIC void render_world_fxglow( world_instance *world, camera *cam ){ + //glDrawBuffers( 1, (GLenum[]){ GL_COLOR_ATTACHMENT0 } ); + + shader_scene_fxglow_use(); + shader_scene_fxglow_uTexMain(1); + shader_scene_fxglow_uPv( cam->mtx.pv ); + + world_link_lighting_ub( world, _shader_scene_fxglow.id ); + world_bind_position_texture( world, _shader_scene_fxglow.id, + _uniform_scene_fxglow_g_world_depth, 2 ); + world_bind_light_array( world, _shader_scene_fxglow.id, + _uniform_scene_fxglow_uLightsArray, 3 ); + world_bind_light_index( world, _shader_scene_fxglow.id, + _uniform_scene_fxglow_uLightsIndex, 4 ); + + shader_scene_fxglow_uCamera( cam->transform[3] ); + glDisable(GL_CULL_FACE); + + struct world_pass pass = { + .shader = k_shader_fxglow, + .cam = cam, + .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_set_mdl = shader_scene_fxglow_uMdl, + .fn_set_uPvmPrev = shader_scene_fxglow_uPvmPrev, + }; + + world_render_both_stages( world, &pass ); + + glEnable(GL_CULL_FACE); + //glDrawBuffers( 2, (GLenum[]){ GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 } ); +} + VG_STATIC void bindpoint_terrain( world_instance *world, struct world_surface *mat ) { @@ -393,7 +472,7 @@ VG_STATIC void render_world_gates( world_instance *world, camera *cam, float dist = v3_dist2( gi->co[0], cam->transform[3] ); - vg_line_pt3( gi->co[0], 0.25f, VG__BLUE ); + vg_line_point( gi->co[0], 0.25f, VG__BLUE ); if( dist < closest ){ closest = dist; @@ -410,11 +489,13 @@ VG_STATIC void render_world_gates( world_instance *world, camera *cam, render_gate( world, gate, cam, layer_depth ); } else if( gate->type == k_gate_type_nonlocel ){ - if( skaterift.async_op != k_async_op_world_loading && - skaterift.async_op != k_async_op_world_preloading ){ - world_instance *dest_world = &world_static.worlds[ gate->target ]; - render_gate( dest_world, gate, cam, layer_depth ); + if( world_loader.state != k_world_loader_none ){ + world->rendering_gate = NULL; + return; } + + world_instance *dest_world = &world_static.worlds[ gate->target ]; + render_gate( dest_world, gate, cam, layer_depth ); } else world->rendering_gate = NULL; @@ -423,7 +504,14 @@ VG_STATIC void render_world_gates( world_instance *world, camera *cam, VG_STATIC void world_prerender( world_instance *world ) { - world->time += vg.time_delta * (1.0/(k_day_length*60.0)); + + if( mdl_arrcount( &world->ent_light ) ){ + f32 rate = vg_maxf(0.1f, fabsf(k_day_length)) * vg_signf(k_day_length); + world->time += vg.time_delta * (1.0/(rate*60.0)); + } + else{ + world->time = 0.834; + } struct ub_world_lighting *state = &world->ub_lighting; @@ -468,6 +556,7 @@ VG_STATIC void render_world( world_instance *world, camera *cam, render_world_standard( world, cam ); render_world_vb( world, cam ); render_world_alphatest( world, cam ); + render_world_fxglow( world, cam ); render_terrain( world, cam ); if( layer_depth == 0 ){