UNIFORMS({ "uPv", "uTexTiles", "uTexRipples", "uTime", "uOrigin" })
)
+SHADER_DEFINE( fish_shader,
+ // VERTEX
+ "layout (location=0) in vec2 a_co;" // XY UV
+
+ "uniform mat4 uPv;"
+ "uniform vec3 uPosition;"
+
+ "out vec2 aTexCoords;"
+
+ "void main()"
+ "{"
+ "vec2 world_coord = a_co + uPosition.xy;"
+ "gl_Position = uPv * vec4( world_coord.x, 0.0, world_coord.y, 1.0 );"
+ "aTexCoords = vec2( (a_co.x + uPosition.z) * 0.125, a_co.y );"
+ "}",
+ // FRAGMENT
+ "uniform sampler2D uTexMain;"
+ "uniform vec3 uColour;"
+
+ "in vec2 aTexCoords;"
+ "out vec4 FragColor;"
+
+ "void main()"
+ "{"
+ "vec4 maintex = texture( uTexMain, aTexCoords );"
+ "vec3 comp = mix( vec3(0.0,0.03,0.04), uColour, maintex.r );"
+ "FragColor = vec4( comp, maintex.g * 0.7 );"
+ "}",
+ UNIFORMS({ "uPv", "uTexMain", "uColour", "uPosition" })
+)
+
mat4 m_projection;
mat4 m_view;
mat4 m_mdl;
GLuint tile_vao;
GLuint tile_vbo;
+GLuint fish_texture;
void vg_render(void)
{
glClearColor( 0.94f, 0.94f, 0.94f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
- /*
- glBindVertexArray( tile_vao );
-
- SHADER_USE( colour_shader );
- glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
-
- for( int y = 0; y < map.y; y ++ )
- {
- for( int x = 0; x < map.x; x ++ )
- {
- glm_mat4_identity( m_mdl );
- glm_translate( m_mdl,
- (vec3){
- map.origin[0] + (float)x,
- 0.f,
- map.origin[2] + (float)y
- }
- );
- glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uMdl" ), 1, GL_FALSE, (float *)m_mdl );
-
- struct cell *cell = &map.cells[ y*map.x+x ];
-
- vec4 colour = { 0.7f, 0.7f, 0.7f, 1.f };
-
- if( cell->flags & CELL_FLAG_INPUT ) glm_vec3_copy( (vec3){ 0.9f,0.5f,0.5f }, colour );
- else if( cell->flags & CELL_FLAG_OUTPUT ) glm_vec3_copy( (vec3){ 0.5f,0.9f,0.5f }, colour );
- else if( cell->flags & CELL_FLAG_WALL ) glm_vec3_copy( (vec3){ 0.1f,0.1f,0.1f }, colour );
- else if( cell->flags & CELL_FLAG_CANAL ) glm_vec3_copy( (vec3){ 0.5f,0.5f,0.8f }, colour );
-
- if( cell->flags & CELL_FLAG_SPLIT )
- glm_vec3_copy( (vec3){ 0.6f, 0.f, 0.9f }, colour );
- else if( cell->flags & CELL_FLAG_MERGE )
- glm_vec3_copy( (vec3){ 0.f, 0.6f, 0.8f }, colour );
-
- if( map.selected == cell )
- {
- if( !map.select_valid )
- glm_vec3_copy( (vec3){ 1.f, 0.f, 0.f }, colour );
-
- float flash = sinf( vg_time*2.5f ) * 0.25f + 0.75f;
- glm_vec3_scale( colour, flash, colour );
- }
-
- glUniform4fv( SHADER_UNIFORM( colour_shader, "uColour" ), 1, colour );
- glDrawArrays( GL_TRIANGLES, 0, 6 );
- }
- }
-
- glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 1.f, 0.f, 1.f, 1.f );
-
- for( int i = 0; i < map.num_fishes; i ++ )
- {
- struct fish *fish = map.fishes + i;
-
- if( fish->alive )
- {
- glm_mat4_identity( m_mdl );
- glm_translate( m_mdl,
- (vec3){
- map.origin[0] + (float)fish->co[0] + 0.5f,
- 0.1f,
- map.origin[2] + (float)fish->co[1] + 0.5f
- }
- );
- glm_scale_uni( m_mdl, 0.2f );
- glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uMdl" ), 1, GL_FALSE, (float *)m_mdl );
- glDrawArrays( GL_TRIANGLES, 0, 6 );
- }
- }
- */
-
glBindVertexArray( map.tiles_vao );
map_update_visual();
glUniform1f( SHADER_UNIFORM( tilemap_shader, "uTime" ), vg_time * 0.5f );
glDrawArraysInstanced( GL_TRIANGLES, 0, 6, map.x*map.y );
+
+ SHADER_USE( fish_shader );
+ glUniformMatrix4fv( SHADER_UNIFORM( fish_shader, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
+ glUniform1i( SHADER_UNIFORM( fish_shader, "uTexMain" ), 0 );
+ glActiveTexture( GL_TEXTURE0 );
+ glBindTexture( GL_TEXTURE_2D, fish_texture );
+ glUniform3f( SHADER_UNIFORM( fish_shader, "uPosition" ), 0.0f, 0.0f, floorf( vg_time*20.0f ) );
+ glUniform3f( SHADER_UNIFORM( fish_shader, "uColour" ), 1.0f, 0.1f, 0.1f );
+
+ glEnable( GL_BLEND );
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+ glBlendEquation( GL_FUNC_ADD );
+
+ glDrawArrays( GL_TRIANGLES, 0, 6 );
+
+ glDisable( GL_BLEND );
}
void vg_register(void)
{
SHADER_INIT( colour_shader );
SHADER_INIT( tilemap_shader );
+ SHADER_INIT( fish_shader );
}
void vg_start(void)
vg_tex2d_nearest();
vg_tex2d_repeat();
+ fish_texture = vg_tex2d_rgba( "textures/fishe_swim.tga" );
+ vg_tex2d_nearest();
+ vg_tex2d_repeat();
+
map_load
(
"##-#####-##;aaa,aa\n"