#include #include #include #include #include "typedef.h" #include "ppm.h" #define TILES 2 #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] = "IT"; 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, 1, 0, 0, 1, 0, 0, 1, 0 }, { 0, 1, 0, 1, 1, 0, 0, 0, 0 } }; small_t tiles_connections[TILES][4] = { // { 0, 0, 0, 0 }, // { 1, 1, 1, 0 }, // { 1, 1, 1, 1 }, { 1, 0, 0, 1 }, { 1, 0, 1, 0 }, }; int rotate(int x, int y, int r, int w) { switch(r) { case 0: // no roatate return y * w + x; case 1: // right return (w*w - w) + y - (x * w); case 2: // left return (w-1) - y + (x * w); case 3: // down return (w*w-1) - (y * w) - x; } 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, TILE_WIDTH)]; } void rotate_connections(small_t *tc, int i, int r) { for(int y = 0; y < 2; y++) for(int x = 0; x < 2; x++) tc[y * 2 + x] = tiles_connections[i][rotate(x, y, r, 2)]; } void set_color(small_t *pixels, small_t *t, int x, int y, char k, char blank, char connection) { pixels[(y * TILE_WIDTH + x)*3 + k] = (t[y * TILE_WIDTH + x] == 0) ? blank : connection; } void save(small_t *t, small_t *n, int i) { char file_name[64] = {0}; sprintf(file_name, "files/tiles/tile_%d.ppm", i); small_t *pixels = malloc(TILE_WIDTH * TILE_HEIGHT *3); for(int y = 0; y < TILE_HEIGHT; y++) for(int x = 0; x < TILE_WIDTH; x++) { set_color(pixels, t, x, y, 0, 255, 0); set_color(pixels, t, x, y, 1, 255, 0); set_color(pixels, t, x, y, 2, 255, 255); } save_as_ppm(file_name, pixels, TILE_WIDTH, TILE_HEIGHT, 1); free(pixels); 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, n = 0; i < TILES; i++, n++) { small_t tile[TILE_SZ]; small_t tile_connections[4]; switch(symetry[i]) { case 'X': save(tiles[i], tiles_connections[i], n); break; case 'T': ; for(int j = 0; j < 4; j++) { rotate_tiles(tile, i, j); rotate_connections(tile_connections, i, j); save(tile, tile_connections, n); n++; } n--; break; case 'I': save(tiles[i], tiles_connections[i], n); n++; rotate_tiles(tile, i, 1); rotate_connections(tile_connections, i, 1); save(tile, tile_connections, n); break; } } fclose(fp); } int main(void) { gen_rotations(); return 0; }