#include #include #include #include #include "ppm.h" #define TILES 3 #define TILE_WIDTH 3 #define TILE_HEIGHT 3 #define TILE_SZ ((TILE_WIDTH) * (TILE_HEIGHT)) FILE *fp; // possible types: X T I char symetry[TILES] = "XTI"; small_t tiles[TILES][TILE_SZ] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 1, 1, 1, 0, 0, 0 // }, { // 0, 1, 0, // 1, 1, 1, // 0, 1, 0 },{ 0, 0, 0, 1, 1, 1, 0, 0, 0 } }; small_t tiles_connections[TILES][4] = { { 0, 0, 0, 0 }, { 1, 1, 1, 0 }, // { 1, 1, 1, 1 }, { 0, 1, 1, 0 }, }; int rotate(int x, int y, int r) { switch(r) { case 0: // no roatate return y * TILE_WIDTH + x; case 1: // right return (TILE_SZ-TILE_WIDTH) + y - (x * TILE_WIDTH); case 2: // left return (TILE_WIDTH-1) - y + (x * TILE_WIDTH); case 3: // down return (TILE_SZ-1) - (y * TILE_WIDTH) - x; } return -1; } int crotate(int n, int r) { switch(r) { case 0: return n; case 1: return (n + 1) % 4; case 2: return (n + 2) % 4; case 3: return (n + 3) % 4; } return -1; } void rotate_tiles(small_t *tile, int i, int r) { for(size_t y = 0; y < TILE_HEIGHT; y++) for(size_t x = 0; x < TILE_WIDTH; x++) tile[y * TILE_WIDTH + x] = tiles[i][rotate(x, y, r)]; } void rotate_connections(small_t *tc, int i, int r) { for(int j = 0; j < 4; j++) tc[j] = tiles_connections[i][crotate(j, r)]; } void save(small_t *t, small_t *n, int i) { char file_name[64] = {0}; sprintf(file_name, "files/tiles/tile_%d.ppm", i); save_as_ppm(file_name, t, TILE_WIDTH, TILE_HEIGHT, 1); printf("Saved file: %s\n", file_name); small_t connections = 0; for(int c = 0; c < 4; c++) { connections |= (n[c] << (3-c)); } fwrite(&connections, sizeof(connections), 1, fp); } void gen_rotations() { mkdir("files", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); mkdir("files/tiles", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); fp = fopen("files/tiles/tiles.dat", "wb"); for(int i = 0, r = 0; i < TILES; i++) { small_t tile[TILE_SZ]; small_t tile_connections[4]; switch(symetry[i]) { case 'X': save(tiles[i], tiles_connections[i], i+r); break; case 'T': ; for(; r < 4; r++) { rotate_tiles(tile, i, r); rotate_connections(tile_connections, i, r); save(tile, tile_connections, i+r); } r--; break; case 'I': save(tiles[i], tiles_connections[i], i+r); r++; rotate_tiles(tile, i, 2); rotate_connections(tile_connections, i, 2); save(tile, tile_connections, i+r); break; } } fclose(fp); } int main(void) { gen_rotations(); return 0; }