k_framebuffer_quality_high_only
}
quality;
-
+
GLenum internalformat,
format,
type,
attachment;
GLuint id;
+
+ /* Runtime */
+ int debug_view;
}
attachments[5];
GLuint fb;
}
}
+VG_STATIC int render_framebuffer_control( int argc, char const *argv[] );
VG_STATIC void render_init_fs_quad(void)
{
vg_info( "[render] Allocate quad\n" );
- float quad[] = { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
+ float quad[] =
+ {
+ 0.00f,0.00f, 1.00f,1.00f, 0.00f,1.00f,
+ 0.00f,0.00f, 1.00f,0.00f, 1.00f,1.00f,
+
+ 0.20f,0.00f, 0.80f,1.00f, 0.20f,1.00f,
+ 0.20f,0.00f, 0.80f,0.00f, 0.80f,1.00f,
+
+ /* 9x9 debug grid */
+ /* row0 */
+ 0.00f,0.00f, 0.30f,0.30f, 0.00f,0.30f,
+ 0.00f,0.00f, 0.30f,0.00f, 0.30f,0.30f,
+ 0.30f,0.00f, 0.60f,0.30f, 0.30f,0.30f,
+ 0.30f,0.00f, 0.60f,0.00f, 0.60f,0.30f,
+ 0.60f,0.00f, 0.90f,0.30f, 0.60f,0.30f,
+ 0.60f,0.00f, 0.90f,0.00f, 0.90f,0.30f,
+ /* row1 */
+ 0.00f,0.30f, 0.30f,0.60f, 0.00f,0.60f,
+ 0.00f,0.30f, 0.30f,0.30f, 0.30f,0.60f,
+ 0.30f,0.30f, 0.60f,0.60f, 0.30f,0.60f,
+ 0.30f,0.30f, 0.60f,0.30f, 0.60f,0.60f,
+ 0.60f,0.30f, 0.90f,0.60f, 0.60f,0.60f,
+ 0.60f,0.30f, 0.90f,0.30f, 0.90f,0.60f,
+ /* row2 */
+ 0.00f,0.60f, 0.30f,0.90f, 0.00f,0.90f,
+ 0.00f,0.60f, 0.30f,0.60f, 0.30f,0.90f,
+ 0.30f,0.60f, 0.60f,0.90f, 0.30f,0.90f,
+ 0.30f,0.60f, 0.60f,0.60f, 0.60f,0.90f,
+ 0.60f,0.60f, 0.90f,0.90f, 0.60f,0.90f,
+ 0.60f,0.60f, 0.90f,0.60f, 0.90f,0.90f,
+ };
- 0.2f, 0.0f, 0.8f, 1.0f, 0.2f, 1.0f,
- 0.2f, 0.0f, 0.8f, 0.0f, 0.8f, 1.0f };
+ vg_function_push( (struct vg_cmd)
+ {
+ .name = "fb",
+ .function = render_framebuffer_control
+ });
glGenVertexArrays( 1, &gpipeline.fsquad.vao );
glGenBuffers( 1, &gpipeline.fsquad.vbo );
glDrawArrays( GL_TRIANGLES, 6, 6 );
}
+/*
+ * Call this inside the UI function
+ */
+VG_STATIC void render_view_framebuffer_ui(void)
+{
+ int viewing_count = 0;
+
+ glBindVertexArray( gpipeline.fsquad.vao );
+ shader_blit_use();
+ shader_blit_uTexMain( 0 );
+
+ for( int i=0; i<vg_list_size(framebuffers); i++ )
+ {
+ struct framebuffer *fb = &framebuffers[i];
+
+ for( int j=0; j<vg_list_size(fb->attachments); j++ )
+ {
+ struct framebuffer_attachment *at = &fb->attachments[j];
+
+ if( !at->debug_view )
+ continue;
+
+ v2f corner,
+ window = { vg.window_x, vg.window_y };
+
+ corner[0] = viewing_count % 3;
+ corner[1] = 1 + (viewing_count / 3);
+ v2_mul( corner, window, corner );
+ v2_muls( corner, 0.3f, corner );
+ corner[1] = vg.window_y - corner[1];
+
+ ui_text( (ui_rect){ corner[0], corner[1], 0.0f, 0.0f },
+ fb->display_name, 2, k_text_align_left );
+ ui_text( (ui_rect){ corner[0], corner[1] + 32, 0.0f, 0.0f, },
+ at->display_name, 1, k_text_align_left );
+
+ if( at->purpose == k_framebuffer_attachment_type_renderbuffer )
+ {
+ v2f center;
+ v2_muladds( corner, window, 0.15f, center );
+
+ ui_text( (ui_rect){ center[0], center[1], 0.0f, 0.0f },
+ "<hardware texture>", 1, k_text_align_center );
+ }
+ else
+ {
+ render_fb_bind_texture( fb, j, 0 );
+
+ int start = (viewing_count+2) * 6,
+ count = 6;
+ glDrawArrays( GL_TRIANGLES, start, count );
+ }
+
+ viewing_count ++;
+ }
+ }
+}
+
+VG_STATIC void render_framebuffer_show( struct framebuffer *fb,
+ struct framebuffer_attachment *at,
+ int operation )
+{
+ at->debug_view = operation;
+ vg_info( "%s %s:%s\n", (operation?"shown": "hidden"),
+ fb->display_name, at->display_name );
+}
+
+/*
+ * arg0: command "show"/"hide"
+ * arg1: framebuffer name <name>/"all"
+ * arg2: subname <name>/none
+ */
+VG_STATIC int render_framebuffer_control( int argc, char const *argv[] )
+{
+ if( argc < 2 )
+ {
+ vg_error( "Usage: fb \"show/hide\" <name>/\"all\" <name>/none\n" );
+ return 0;
+ }
+
+ int modify_all = 0,
+ operation = 0;
+
+ if( !strcmp( argv[0], "show" ) )
+ operation = 1;
+ else if( !strcmp( argv[0], "hide" ) )
+ operation = 0;
+ else
+ {
+ vg_error( "Unknown framebuffer operation: '%s'\n", argv[0] );
+ return 0;
+ }
+
+ if( !strcmp( argv[1], "all" ) )
+ modify_all = 1;
+
+ for( int i=0; i<vg_list_size(framebuffers); i++ )
+ {
+ struct framebuffer *fb = &framebuffers[i];
+
+ for( int j=0; j<vg_list_size(fb->attachments); j++ )
+ {
+ struct framebuffer_attachment *at = &fb->attachments[j];
+
+ if( at->purpose == k_framebuffer_attachment_type_none )
+ continue;
+
+ if( modify_all )
+ {
+ render_framebuffer_show( fb, at, operation );
+ }
+ else
+ {
+ if( !strcmp( fb->display_name, argv[1] ) )
+ {
+ if( argc == 2 )
+ render_framebuffer_show( fb, at, operation );
+ else if( !strcmp( at->display_name, argv[2] ) )
+ render_framebuffer_show( fb, at, operation );
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
#endif /* RENDER_H */
/* 'systems' are completely loaded now */
strcpy( world.world_name, "maps/mp_mtzero.mdl" );
- strcpy( world.world_name, "maps/mp_gridmap.mdl" );
+ //strcpy( world.world_name, "maps/mp_gridmap.mdl" );
world_load();
vg_console_load_autos();
}
shader_blitblur_uTexMotion( 1 );
shader_blitblur_uBlurStrength( cl_blur_strength / (vg.frame_delta*60.0f) );
+ v2f menu_blurring;
+ v2_muls( (v2f){ 0.04f, 0.001f }, menu_opacity, menu_blurring );
+ shader_blitblur_uOverrideDir( menu_blurring );
+
if( cl_view_id == 0 )
render_fb_bind_texture( gpipeline.fb_main, 0, 0 );
else if( cl_view_id == 1 )
render_fsquad();
}
+VG_STATIC void render_player_transparent(void)
+{
+ camera small_cam;
+ m4x3_copy( main_camera.transform, small_cam.transform );
+
+ small_cam.fov = main_camera.fov;
+ small_cam.nearz = 0.05f;
+ small_cam.farz = 60.0f;
+
+ camera_update_view( &small_cam );
+ camera_update_projection( &small_cam );
+ camera_finalize( &small_cam );
+
+ /* Draw player to window buffer and blend background ontop */
+
+ glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+ draw_player( &small_cam );
+}
+
VG_STATIC void render_scene(void)
{
render_fb_bind( gpipeline.fb_main );
glEnable( GL_DEPTH_TEST );
render_world( &main_camera );
+
+ int player_transparent = !(player.is_dead || freecam),
+ player_draw = !cl_menu;
+
+ if( !player_transparent && player_draw )
+ draw_player( &main_camera );
+
render_water_texture( &main_camera );
render_fb_bind( gpipeline.fb_main );
render_water_surface( &main_camera );
render_world_gates( &main_camera );
+
+ if( player_transparent && player_draw )
+ render_player_transparent();
}
VG_STATIC void render_menu(void)
menu_render( &main_camera );
}
-VG_STATIC void render_player_into_world(void)
-{
- render_fb_bind( gpipeline.fb_main );
- draw_player( &main_camera );
-}
-
-VG_STATIC void render_player_transparent(void)
-{
- camera small_cam;
- m4x3_copy( main_camera.transform, small_cam.transform );
-
- small_cam.fov = main_camera.fov;
- small_cam.nearz = 0.05f;
- small_cam.farz = 60.0f;
-
- camera_update_view( &small_cam );
- camera_update_projection( &small_cam );
- camera_finalize( &small_cam );
-
- /* Draw player to window buffer and blend background ontop */
-
- glBindFramebuffer( GL_FRAMEBUFFER, 0 );
- draw_player( &small_cam );
-}
-
VG_STATIC void render_main_game(void)
{
static float fov = 60.0f;
/* ========== Begin Frame ========== */
render_scene();
-
- if( !cl_menu )
- {
- if( player.is_dead | freecam )
- render_player_into_world();
- else
- render_player_transparent();
- }
-
present_view_with_post_processing();
if( cl_menu )
//glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
audio_debug_soundscapes();
+ render_view_framebuffer_ui();
}
#if 0