update vg
[carveJwlIkooP6JGAAIwe30JlM.git] / render.h
index 712961ea3f196dc6956aeefe0b3c5164e2aef45c..a4005ddbcec76028b77fd873c6b9b8dca479a7b1 100644 (file)
--- 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; j<vg_list_size(fb->attachments); j++ )
-   {
+   for( int j=0; j<vg_list_size(fb->attachments); 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; i<vg_list_size(framebuffers); i++ )
-   {
+   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++ )
-      {
+      for( int j=0; j<vg_list_size(fb->attachments); 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<vg_list_size(framebuffers); i++ )
-      {
+      for( int i=0; i<vg_list_size(framebuffers); i++ ){
          struct framebuffer *fb = &framebuffers[i];
          render_fb_allocate( fb );
       }
@@ -668,8 +667,7 @@ VG_STATIC void render_framebuffer_show( struct framebuffer *fb,
  */
 VG_STATIC int render_framebuffer_control( int argc, char const *argv[] )
 {
-   if( argc < 2 )
-   {
+   if( argc < 2 ){
       vg_error( "Usage: fb \"show/hide\" <name>/\"all\" <name>/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; i<vg_list_size(framebuffers); i++ )
-   {
+   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++ )
-      {
+      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 )
-         {
+         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; i<vg_list_size(framebuffers); i++ )
-      {
+      for( int i=0; i<vg_list_size(framebuffers); i++ ){
          struct framebuffer *fb = &framebuffers[i];
          console_suggest_score_text( fb->display_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; i<vg_list_size(framebuffers); i++ )
-      {
+      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++ )
-         {
+         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 )
-            {
+            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 );
             }
          }