#define CELL_FLAG_OUTPUT 0x2
#define CELL_FLAG_IO (CELL_FLAG_INPUT|CELL_FLAG_OUTPUT)
#define CELL_FLAG_WALL 0x4
+#define CELL_FLAG_HOVER 0x8
+#define CELL_FLAG_ITER 0x10
+#define CELL_FLAG_CANAL 0x20
static struct
{
struct cell
{
u32 flags;
+ u32 model_id;
+
char *conditions;
}
* cells;
+ vec3 origin;
+ struct cell *selected;
+ int select_valid;
+
u32 *io;
+
+ struct vstack
+ {
+ struct vframe
+ {
+ int x, y;
+ int i;
+ }
+ frames[ 64 ];
+
+ int level;
+ u32 flags;
+ }
+ stack;
}
map;
map.io = NULL;
}
+static struct cell *map_tile_at( int pos[2] )
+{
+ if( pos[0] >= 0 && pos[0] < map.x && pos[1] >= 0 && pos[1] < map.y )
+ return map.cells + pos[1]*map.x + pos[0];
+ return NULL;
+}
+
static int map_load( const char *str )
{
map_free();
c ++;
}
+ // Origin top left corner
+ map.origin[0] = -((float)map.x) * 0.5f;
+ map.origin[2] = -((float)map.y) * 0.5f;
+
vg_success( "Map loaded! (%u:%u)\n", map.x, map.y );
return 1;
}
glm_mat4_identity( m_view );
glm_translate_z( m_view, -10.f );
- glm_rotate_x( m_view, -1.0f, m_view );
+ glm_rotate_x( m_view, 1.0f, m_view );
glm_mat4_mul( m_projection, m_view, m_pv );
vec3 tile_pos;
glm_vec3_copy( ray_origin, tile_pos );
glm_vec3_muladds( ray_dir, ray_t, tile_pos );
+ glm_vec3_sub( tile_pos, map.origin, tile_pos );
- tile_pos[0] = floorf( tile_pos[0] + 0.5f );
- tile_pos[2] = floorf( tile_pos[2] + 0.5f );
+ int tile_x = floorf( tile_pos[0] );
+ int tile_y = floorf( tile_pos[2] );
- glm_mat4_identity( m_mdl );
- glm_translate( m_mdl, tile_pos );
+ map.selected = map_tile_at( (int [2]){tile_x, tile_y} );
}
GLuint tile_vao;
SHADER_USE( colour_shader );
glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uPv" ), 1, GL_FALSE, (float *)m_pv );
- glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.5f, 0.5f, 0.5f, 1.0f );
-
- glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uMdl" ), 1, GL_FALSE, (float *)m_mdl );
- glBindVertexArray( tile_vao );
- glDrawArrays( GL_TRIANGLES, 0, 6 );
+ 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.5f,
+ 0.f,
+ map.origin[2] + (float)y + 0.5f
+ }
+ );
+ glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uMdl" ), 1, GL_FALSE, (float *)m_mdl );
+
+ struct cell *cell = &map.cells[ y*map.x+x ];
+
+ if( map.selected != cell )
+ {
+ if( cell->flags & CELL_FLAG_INPUT )
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.9f, 0.5f, 0.5f, 1.0f );
+ else if( cell->flags & CELL_FLAG_OUTPUT )
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.5f, 0.9f, 0.5f, 1.0f );
+ else if( cell->flags & CELL_FLAG_WALL )
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.1f, 0.1f, 0.1f, 1.0f );
+ else
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.7f, 0.7f, 0.7f, 1.0f );
+ }
+ else
+ {
+ float flash = sinf( vg_time*2.5f ) * 0.25f + 0.75f;
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), flash,flash,flash, 1.0f );
+ }
+
+ glDrawArrays( GL_TRIANGLES, 0, 6 );
+ }
+ }
}
void vg_start(void)
map_load
(
- "###########;\n"
- "# + #;abab\n"
+ "#####-#####;aa\n"
+ "# #;\n"
+ "# #;\n"
+ "# -;bb\n"
"# #;\n"
"# #;\n"
- "# - - #;aa,bb\n"
- "###########;\n"
+ "#####+#####;abab\n"
);
}