X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=render.h;h=a4005ddbcec76028b77fd873c6b9b8dca479a7b1;hb=8c376ed2e4021a18b0a6c6e800109d67ad09d198;hp=712961ea3f196dc6956aeefe0b3c5164e2aef45c;hpb=b888cce683d95cc01d0b4be9bbe92a0dd47452ac;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/render.h b/render.h index 712961e..a4005dd 100644 --- a/render.h +++ b/render.h @@ -31,8 +31,7 @@ typedef struct framebuffer framebuffer; /* * All standard buffers used in rendering */ -VG_STATIC struct pipeline -{ +VG_STATIC struct pipeline{ glmesh fsquad; framebuffer *fb_main, @@ -45,8 +44,7 @@ VG_STATIC struct pipeline } gpipeline = { .view_render_scale = 1.0f }; -struct framebuffer -{ +struct framebuffer{ const char *display_name; int resolution_div, /* definition */ fixed_w, @@ -55,20 +53,18 @@ struct framebuffer render_w, /* runtime */ render_h; - struct framebuffer_attachment - { + struct framebuffer_attachment{ const char *display_name; - enum framebuffer_attachment_type - { + enum framebuffer_attachment_type{ k_framebuffer_attachment_type_none, - k_framebuffer_attachment_type_colour, - k_framebuffer_attachment_type_renderbuffer + k_framebuffer_attachment_type_texture, + k_framebuffer_attachment_type_renderbuffer, + k_framebuffer_attachment_type_texture_depth } purpose; - enum framebuffer_quality_profile - { + enum framebuffer_quality_profile{ k_framebuffer_quality_all, k_framebuffer_quality_high_only } @@ -100,7 +96,7 @@ framebuffers[] = .attachments = { { - "colour", k_framebuffer_attachment_type_colour, + "colour", k_framebuffer_attachment_type_texture, .internalformat = GL_RGB, .format = GL_RGB, @@ -108,7 +104,7 @@ framebuffers[] = .attachment = GL_COLOR_ATTACHMENT0 }, { - "motion", k_framebuffer_attachment_type_colour, + "motion", k_framebuffer_attachment_type_texture, .quality = k_framebuffer_quality_high_only, .internalformat = GL_RG16F, @@ -117,9 +113,16 @@ framebuffers[] = .attachment = GL_COLOR_ATTACHMENT1 }, { +#if 0 "depth_stencil", k_framebuffer_attachment_type_renderbuffer, .internalformat = GL_DEPTH24_STENCIL8, +#else + "depth_stencil", k_framebuffer_attachment_type_texture_depth, + .internalformat = GL_DEPTH24_STENCIL8, + .format = GL_DEPTH_STENCIL, + .type = GL_UNSIGNED_INT_24_8, +#endif .attachment = GL_DEPTH_STENCIL_ATTACHMENT } } @@ -134,7 +137,7 @@ framebuffers[] = .attachments = { { - "colour", k_framebuffer_attachment_type_colour, + "colour", k_framebuffer_attachment_type_texture, .internalformat = GL_RGB, .format = GL_RGB, .type = GL_UNSIGNED_BYTE, @@ -159,7 +162,7 @@ framebuffers[] = .attachments = { { - "colour", k_framebuffer_attachment_type_colour, + "colour", k_framebuffer_attachment_type_texture, .internalformat = GL_RED, .format = GL_RED, .type = GL_UNSIGNED_BYTE, @@ -193,13 +196,18 @@ VG_STATIC void render_fb_get_current_res( struct framebuffer *fb, VG_STATIC void render_fb_inverse_ratio( framebuffer *fb, v2f inverse ) { - int x, y; - render_fb_get_current_res( fb, &x, &y ); + if( fb ){ + int x, y; + render_fb_get_current_res( fb, &x, &y ); - v2f render = { fb->render_w, fb->render_h }, - original = { x, y }; + v2f render = { fb->render_w, fb->render_h }, + original = { x, y }; - v2_div( render, original, inverse ); + v2_div( render, original, inverse ); + } + else{ + v2_div( (v2f){1.0f,1.0f}, (v2f){ vg.window_x, vg.window_y }, inverse ); + } } /* @@ -233,9 +241,10 @@ VG_STATIC void render_fb_bind_texture( framebuffer *fb, { struct framebuffer_attachment *at = &fb->attachments[attachment]; - if( at->purpose != k_framebuffer_attachment_type_colour ) + if( (at->purpose != k_framebuffer_attachment_type_texture) && + (at->purpose != k_framebuffer_attachment_type_texture_depth) ) { - vg_fatal_exit_loop( "illegal operation: bind non-colour framebuffer" + vg_fatal_exit_loop( "illegal operation: bind non-texture framebuffer" " attachment to texture slot" ); } @@ -378,12 +387,12 @@ VG_STATIC void render_fb_allocate_texture( struct framebuffer *fb, int rx, ry; render_fb_get_current_res( fb, &rx, &ry ); - if( a->purpose == k_framebuffer_attachment_type_renderbuffer ) - { + if( a->purpose == k_framebuffer_attachment_type_renderbuffer ){ glBindRenderbuffer( GL_RENDERBUFFER, a->id ); - glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, rx, ry ); + glRenderbufferStorage( GL_RENDERBUFFER, a->internalformat, rx, ry ); } - else if( a->purpose == k_framebuffer_attachment_type_colour ) + else if( a->purpose == k_framebuffer_attachment_type_texture || + a->purpose == k_framebuffer_attachment_type_texture_depth ) { glBindTexture( GL_TEXTURE_2D, a->id ); glTexImage2D( GL_TEXTURE_2D, 0, a->internalformat, rx, ry, @@ -408,8 +417,7 @@ VG_STATIC void render_fb_allocate( struct framebuffer *fb ) GLenum colour_attachments[4]; u32 colour_count = 0; - for( int j=0; jattachments); j++ ) - { + for( int j=0; jattachments); j++ ){ struct framebuffer_attachment *attachment = &fb->attachments[j]; if( attachment->purpose == k_framebuffer_attachment_type_none ) @@ -419,15 +427,15 @@ VG_STATIC void render_fb_allocate( struct framebuffer *fb ) render_fb_attachment_str( attachment->attachment ), render_fb_format_str( attachment->internalformat ) ); - if( attachment->purpose == k_framebuffer_attachment_type_renderbuffer ) - { + if( attachment->purpose == k_framebuffer_attachment_type_renderbuffer ){ glGenRenderbuffers( 1, &attachment->id ); render_fb_allocate_texture( fb, attachment ); glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, attachment->id ); } - else if( attachment->purpose == k_framebuffer_attachment_type_colour ) + else if( attachment->purpose == k_framebuffer_attachment_type_texture || + attachment->purpose == k_framebuffer_attachment_type_texture_depth ) { glGenTextures( 1, &attachment->id ); render_fb_allocate_texture( fb, attachment ); @@ -439,7 +447,8 @@ VG_STATIC void render_fb_allocate( struct framebuffer *fb ) glFramebufferTexture2D( GL_FRAMEBUFFER, attachment->attachment, GL_TEXTURE_2D, attachment->id, 0 ); - colour_attachments[ colour_count ++ ] = attachment->attachment; + if( attachment->purpose == k_framebuffer_attachment_type_texture ) + colour_attachments[ colour_count ++ ] = attachment->attachment; } } @@ -450,8 +459,7 @@ VG_STATIC void render_fb_allocate( struct framebuffer *fb ) */ GLenum result = glCheckFramebufferStatus( GL_FRAMEBUFFER ); - if( result == GL_FRAMEBUFFER_COMPLETE ) - { + if( result == GL_FRAMEBUFFER_COMPLETE ){ /* * Attatch to gpipeline */ @@ -461,8 +469,7 @@ VG_STATIC void render_fb_allocate( struct framebuffer *fb ) vg_success( " status: complete\n" ); vg_info( "}\n" ); } - else - { + else{ if( result == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT ) vg_error( " status: Incomplete attachment" ); else if( result == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT ) @@ -485,11 +492,9 @@ VG_STATIC void render_fb_resize(void) if( !gpipeline.ready ) return; - for( int i=0; iattachments); j++ ) - { + for( int j=0; jattachments); j++ ){ struct framebuffer_attachment *attachment = &fb->attachments[j]; render_fb_allocate_texture( fb, attachment ); } @@ -502,8 +507,7 @@ VG_STATIC void render_init_fs_quad(void) { vg_info( "[render] Allocate quad\n" ); - float quad[] = - { + 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, @@ -534,12 +538,8 @@ VG_STATIC void render_init_fs_quad(void) 0.60f,0.60f, 0.90f,0.60f, 0.90f,0.90f, }; - vg_function_push( (struct vg_cmd) - { - .name = "fb", - .function = render_framebuffer_control, - .poll_suggest = render_framebuffer_poll - }); + vg_console_reg_cmd( "fb", render_framebuffer_control, + render_framebuffer_poll ); glGenVertexArrays( 1, &gpipeline.fsquad.vao ); glGenBuffers( 1, &gpipeline.fsquad.vbo ); @@ -565,8 +565,7 @@ VG_STATIC void render_init(void) /* * Complete Framebuffers */ - for( int i=0; i/\"all\" /none\n" ); return 0; } @@ -681,8 +679,7 @@ VG_STATIC int render_framebuffer_control( int argc, char const *argv[] ) operation = 1; else if( !strcmp( argv[0], "hide" ) ) operation = 0; - else - { + else{ vg_error( "Unknown framebuffer operation: '%s'\n", argv[0] ); return 0; } @@ -690,25 +687,20 @@ VG_STATIC int render_framebuffer_control( int argc, char const *argv[] ) if( !strcmp( argv[1], "all" ) ) modify_all = 1; - for( int i=0; iattachments); j++ ) - { + for( int j=0; jattachments); j++ ){ struct framebuffer_attachment *at = &fb->attachments[j]; if( at->purpose == k_framebuffer_attachment_type_none ) continue; - if( modify_all ) - { + if( modify_all ){ render_framebuffer_show( fb, at, operation ); } - else - { - if( !strcmp( fb->display_name, argv[1] ) ) - { + 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] ) ) @@ -725,45 +717,37 @@ VG_STATIC void render_framebuffer_poll( int argc, char const *argv[] ) { const char *term = argv[argc-1]; - if( argc == 1 ) - { + if( argc == 1 ){ console_suggest_score_text( "show", term, 0 ); console_suggest_score_text( "hide", term, 0 ); } - else if( argc == 2 ) - { + else if( argc == 2 ){ console_suggest_score_text( "all", term, 0 ); - for( int i=0; idisplay_name, term, 0 ); } } - else if( argc == 3 ) - { + else if( argc == 3 ){ int modify_all = 0; if( !strcmp( argv[1], "all" ) ) modify_all = 1; - for( int i=0; iattachments); j++ ) - { + for( int j=0; jattachments); j++ ){ struct framebuffer_attachment *at = &fb->attachments[j]; if( at->purpose == k_framebuffer_attachment_type_none ) continue; - if( modify_all ) - { + if( modify_all ){ console_suggest_score_text( at->display_name, term, 0 ); } - else if( !strcmp( fb->display_name, argv[1] ) ) - { + else if( !strcmp( fb->display_name, argv[1] ) ){ console_suggest_score_text( at->display_name, term, 0 ); } }