X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_render.c;h=950e35fe8855aa08ca12b1e649ecde3bd827a58f;hb=ca35eceae3abfcfb9ba266d6ea8e664bc06b0a3e;hp=1c030a6b66f79a90165856589caaa6832fb49c54;hpb=c2ee05fe23699fd1de7e1d8259b9bc272b232058;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_render.c b/world_render.c index 1c030a6..950e35f 100644 --- a/world_render.c +++ b/world_render.c @@ -75,6 +75,7 @@ VG_STATIC void world_render_init(void) 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(); @@ -153,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]; @@ -201,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 ) { @@ -318,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 ) { @@ -422,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; @@ -439,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; @@ -452,8 +504,14 @@ VG_STATIC void render_world_gates( world_instance *world, camera *cam, VG_STATIC void world_prerender( world_instance *world ) { - f32 day_length = vg_maxf(0.1f, fabsf(k_day_length)) * vg_signf(k_day_length); - world->time += vg.time_delta * (1.0/(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; @@ -498,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 ){