switch to textured render
authorhgn <hgodden00@gmail.com>
Wed, 20 Oct 2021 20:32:15 +0000 (21:32 +0100)
committerhgn <hgodden00@gmail.com>
Wed, 20 Oct 2021 20:32:15 +0000 (21:32 +0100)
fishladder.c
textures/ball_metallic.png [new file with mode: 0644]
textures/tileset.png

index 9e02a95ed1829b4ceb1418f183ff0da6bba28218..4e41b5ad924ba80ba678ed55eb7fd3ec6162cde8 100644 (file)
@@ -27,6 +27,41 @@ SHADER_DEFINE( shader_tile_colour,
        UNIFORMS({ "uPv", "uOffset", "uColour" })
 )
 
+SHADER_DEFINE( shader_ball,
+       // VERTEX
+       "layout (location=0) in vec2 a_co;"
+       "uniform vec2 uOffset;"
+       "uniform mat3 uPv;"
+       ""
+       "out vec2 aTexCoords;"
+       ""
+       "void main()"
+       "{"
+               // Create texture coords
+               "aTexCoords = a_co;"
+               
+               // Vertex transform
+               "vec3 worldpos = vec3( a_co * 0.25 - 0.125 + uOffset, 1.0 );"
+               "gl_Position = vec4( uPv * worldpos, 1.0 );"
+       "}",
+       
+       // FRAGMENT
+       "out vec4 FragColor;"
+       ""
+       "uniform sampler2D uTexMain;"
+       "uniform vec3 uColour;"
+       ""
+       "in vec2 aTexCoords;"
+       ""
+       "void main()"
+       "{"
+               "vec4 glyph = texture( uTexMain, aTexCoords );"
+               "FragColor = vec4( glyph.rgb * uColour, glyph.a );"
+       "}"
+       ,
+       UNIFORMS({ "uTexMain", "uColour", "uOffset", "uPv" })
+)
+
 SHADER_DEFINE( shader_tile_main,
        // VERTEX
        "layout (location=0) in vec2 a_co;"
@@ -34,7 +69,7 @@ SHADER_DEFINE( shader_tile_main,
        "uniform mat3 uPv;"
        "uniform mat2 uSubTransform;"
        ""
-               "out vec4 aTexCoords;"
+       "out vec4 aTexCoords;"
        ""
        "vec2 hash22(vec2 p)"
        "{"
@@ -141,6 +176,7 @@ const char *level_pack[] =
 GLuint tex_tile_data;
 GLuint tex_tile_detail;
 GLuint tex_wood;
+GLuint tex_ball;
 
 m3x3f m_projection;
 m3x3f m_view;
@@ -432,6 +468,7 @@ void vg_register(void)
 {
        SHADER_INIT( shader_tile_colour );
        SHADER_INIT( shader_tile_main );
+       SHADER_INIT( shader_ball );
 }
 
 void vg_start(void)
@@ -499,6 +536,11 @@ void vg_start(void)
                vg_tex2d_mipmap();
                vg_tex2d_linear_mipmap();
                vg_tex2d_repeat();
+               
+               tex_ball = vg_tex2d_rgba( "textures/ball_metallic.png" );
+               vg_tex2d_mipmap();
+               vg_tex2d_linear_mipmap();
+               vg_tex2d_clamp();
        }
        
        map_load( level_pack[ 0 ] );
@@ -514,6 +556,7 @@ void vg_free(void)
        glDeleteTextures( 1, &tex_tile_data );
        glDeleteTextures( 1, &tex_tile_detail );
        glDeleteTextures( 1, &tex_wood );
+       glDeleteTextures( 1, &tex_ball );
 }
 
 static int cell_interactive( v2i co )
@@ -995,76 +1038,25 @@ void vg_render(void)
                }
        }
        
-       glDisable(GL_BLEND);
-
-       SHADER_USE( shader_tile_colour );
-       glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_colour, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
-       use_mesh( &world.circle );
+       //glDisable(GL_BLEND);
        
-       // Draw i/o arrays
-       for( int i = 0; i < arrlen( world.io ); i ++ )
-       {
-               struct cell_terminal *term = &world.io[ i ];
-               int posx = term->id % world.w;
-               int posy = (term->id - posx)/world.w;
-               int is_input = world.data[ term->id ].state & FLAG_INPUT;
-               
-               int const filled_start = 0;
-               int const filled_count = 32;
-               int const empty_start = 32;
-               int const empty_count = 32*2;
-               
-               v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f };
-               
-               for( int j = 0; j < arrlen( term->conditions ); j ++ )
-               {
-                       glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), (float)posx + 0.2f + 0.2f * (float)j, (float)posy + 0.2f, 0.1f );
-                       
-                       if( is_input )
-                       {
-                               colour_code_v3( term->conditions[j], dot_colour );
-                               glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
-                       
-                               // Draw filled if tick not passed, draw empty if empty
-                               if( world.sim_frame > j )
-                                       draw_mesh( empty_start, empty_count );
-                               else
-                                       draw_mesh( filled_start, filled_count );
-                       }
-                       else
-                       {
-                               if( term->recv_count > j )
-                               {
-                                       colour_code_v3( term->recv[j], dot_colour );
-                                       v3_muls( dot_colour, 0.8f, dot_colour );
-                                       glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
-                                       
-                                       draw_mesh( filled_start, filled_count );
-                               }
-                               
-                               colour_code_v3( term->conditions[j], dot_colour );
-                               glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
-                               
-                               draw_mesh( empty_start, empty_count );
-                       }
-               }
-       }
+       SHADER_USE( shader_ball );
+       glUniformMatrix3fv( SHADER_UNIFORM( shader_ball, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
+       
+       glActiveTexture( GL_TEXTURE0 );
+       glBindTexture( GL_TEXTURE_2D, tex_ball );
+       glUniform1i( SHADER_UNIFORM( shader_ball, "uTexMain" ), 0 );
        
        // Draw 'fish'
        if( world.simulating )
        {
-               v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f };
-               
                for( int i = 0; i < world.num_fishes; i ++ )
                {
                        struct fish *fish = &world.fishes[i];
                        
                        if( !fish->alive )
                                continue;
-                       
-                       colour_code_v3( fish->payload, dot_colour );
-                       glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
-                       
+
                        // Evaluate position
                        struct cell *cell = pcell(fish->pos);
                        v2f fish_pos;
@@ -1122,14 +1114,70 @@ void vg_render(void)
                                fish_pos[1] = origin[1] + (float)fish->dir[1]*t;
                        }
                        
-                       //vg_line_box( (v2f){fish->pos[0],fish->pos[1]}, 
-                       //(v2f){ (float)fish->pos[0]+1.0f, (float)fish->pos[1]+1.0f }, 0xffffffff );
+                       v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f };
+                       colour_code_v3( fish->payload, dot_colour );
                        
-                       glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), fish_pos[0], fish_pos[1], 0.125f );
+                       glUniform3fv( SHADER_UNIFORM( shader_ball, "uColour" ), 1, dot_colour );
+                       glUniform2f( SHADER_UNIFORM( shader_ball, "uOffset" ), fish_pos[0], fish_pos[1] );
                        draw_mesh( 0, 32 );
                }
        }
        
+       glDisable(GL_BLEND);
+
+       SHADER_USE( shader_tile_colour );
+       glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_colour, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
+       use_mesh( &world.circle );
+       
+       // Draw i/o arrays
+       for( int i = 0; i < arrlen( world.io ); i ++ )
+       {
+               struct cell_terminal *term = &world.io[ i ];
+               int posx = term->id % world.w;
+               int posy = (term->id - posx)/world.w;
+               int is_input = world.data[ term->id ].state & FLAG_INPUT;
+               
+               int const filled_start = 0;
+               int const filled_count = 32;
+               int const empty_start = 32;
+               int const empty_count = 32*2;
+               
+               v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f };
+               
+               for( int j = 0; j < arrlen( term->conditions ); j ++ )
+               {
+                       glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), (float)posx + 0.2f + 0.2f * (float)j, (float)posy + 0.2f, 0.1f );
+                       
+                       if( is_input )
+                       {
+                               colour_code_v3( term->conditions[j], dot_colour );
+                               glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
+                       
+                               // Draw filled if tick not passed, draw empty if empty
+                               if( world.sim_frame > j )
+                                       draw_mesh( empty_start, empty_count );
+                               else
+                                       draw_mesh( filled_start, filled_count );
+                       }
+                       else
+                       {
+                               if( term->recv_count > j )
+                               {
+                                       colour_code_v3( term->recv[j], dot_colour );
+                                       v3_muls( dot_colour, 0.8f, dot_colour );
+                                       glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
+                                       
+                                       draw_mesh( filled_start, filled_count );
+                               }
+                               
+                               colour_code_v3( term->conditions[j], dot_colour );
+                               glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
+                               
+                               draw_mesh( empty_start, empty_count );
+                       }
+               }
+       }
+       
        if( world.simulating )
        {
                glUniform4f( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 0.0f, 0.0f, 0.0f, 1.0f );
diff --git a/textures/ball_metallic.png b/textures/ball_metallic.png
new file mode 100644 (file)
index 0000000..09fe6ec
Binary files /dev/null and b/textures/ball_metallic.png differ
index 1d905ab53d39a08daa983a615d2bdf4e1af61d0f..973ebd7717a25f7dc8f9e2bca8c9fda7490ff8ed 100644 (file)
Binary files a/textures/tileset.png and b/textures/tileset.png differ