diff options
author | kartofen <mladenovnasko0@gmail.com> | 2022-12-21 01:06:18 +0200 |
---|---|---|
committer | kartofen <mladenovnasko0@gmail.com> | 2022-12-21 01:06:18 +0200 |
commit | 85601f555a3a57db44631706a25e0f933afd8551 (patch) | |
tree | 576f7f7518ebd6f7d1b6f3534218c747d2a14a43 | |
parent | 88dd7e5fb0798d441dab81e9173d0e2d63f0b75e (diff) |
works with different connections
-rw-r--r-- | .gitignore | 3 | ||||
-rwxr-xr-x | build.sh | 9 | ||||
-rw-r--r-- | demo/demo1.png | bin | 344 -> 24545 bytes | |||
-rwxr-xr-x | download-tilesets.sh | 30 | ||||
-rwxr-xr-x | files-ppmtopng.sh (renamed from ppmtopng.sh) | 0 | ||||
-rw-r--r-- | files/tilesets/knots/blank.ppm | 4 | ||||
-rw-r--r-- | files/tilesets/knots/corner.ppm | bin | 313 -> 0 bytes | |||
-rw-r--r-- | files/tilesets/knots/line.ppm | bin | 313 -> 0 bytes | |||
-rw-r--r-- | files/tilesets/knots/plus.ppm | bin | 313 -> 0 bytes | |||
-rw-r--r-- | files/tilesets/knots/t.ppm | bin | 313 -> 0 bytes | |||
-rw-r--r-- | src/config.h | 87 | ||||
-rw-r--r-- | src/gen_tiles.c | 127 | ||||
-rw-r--r-- | src/main.c | 88 | ||||
-rw-r--r-- | src/ppm.c | 10 | ||||
-rw-r--r-- | src/tilemap.c | 80 | ||||
-rw-r--r-- | src/tilemap.h | 4 | ||||
-rw-r--r-- | src/tiles.c | 53 | ||||
-rw-r--r-- | src/tiles.h | 2 | ||||
-rw-r--r-- | src/typedef.h | 19 |
19 files changed, 247 insertions, 269 deletions
@@ -1,2 +1,3 @@ bin/ -obj/
\ No newline at end of file +obj/ +files/ @@ -6,6 +6,7 @@ FLAGS="-Wall -Wextra -g -pedantic" SRCD="src" ODIR="obj" BIN="bin" +FILES="files" VALGRND="" RUN=0 @@ -21,8 +22,7 @@ function __leak__ { function __clean__ { rm -rf $BIN rm -rf $ODIR - rm -rf files/tiles - rm -f files/file* + rm -rf $FILES kill $( ps -q $$ -o pgid= ) # exit } @@ -33,8 +33,9 @@ then __$1__ fi -mkdir -p $ODIR mkdir -p $BIN +mkdir -p $ODIR +mkdir -p $FILES gcc -c $SRCD/gen_tiles.c -o $ODIR/gen_tiles.o $FLAGS gcc -c $SRCD/ppm.c -o $ODIR/ppm.o $FLAGS @@ -43,7 +44,7 @@ gcc -c $SRCD/tiles.c -o $ODIR/tiles.o $FLAGS gcc -c $SRCD/main.c -o $ODIR/main.o $FLAGS gcc -o $BIN/wfc $ODIR/main.o $ODIR/ppm.o $ODIR/tiles.o $ODIR/tilemap.o $FLAGS -gcc -o $BIN/gen_tiles $ODIR/gen_tiles.o $ODIR/ppm.o $FLAGS +gcc -o $BIN/gen_tiles $ODIR/gen_tiles.o $FLAGS if ! { [[ $RUN -eq 0 ]]; } 2> /dev/null then diff --git a/demo/demo1.png b/demo/demo1.png Binary files differindex e303ee1..a39a508 100644 --- a/demo/demo1.png +++ b/demo/demo1.png diff --git a/download-tilesets.sh b/download-tilesets.sh new file mode 100755 index 0000000..0b9a5ec --- /dev/null +++ b/download-tilesets.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +cd ${0%/*} # go to project root + +URL="https://ftp.batnako.net/tilesets/" + +mkdir -p "files/tilesets" + +function download { + path="files/tilesets/$name" + + rm -rf "$path" + mkdir "$path" + + for ((i=0; i<${#tiles[@]}; i++)); do image="${tiles[$i]}.ppm" + wget -O "$path/$image" "$URL/$name/$image" + done +} + +name="black-white" +tiles=("corner" "cross" "empty" "line" "t") +download + +name="knots" +tiles=("corner" "cross" "empty" "line" "t") +download + +name="circuit" +tiles=("bridge" "component" "connection" "corner" "dskew" "skew" "substrate" "t" "track" "transition" "turn" "viad" "vias" "wire") +download diff --git a/ppmtopng.sh b/files-ppmtopng.sh index df33236..df33236 100755 --- a/ppmtopng.sh +++ b/files-ppmtopng.sh diff --git a/files/tilesets/knots/blank.ppm b/files/tilesets/knots/blank.ppm deleted file mode 100644 index ac75fdf..0000000 --- a/files/tilesets/knots/blank.ppm +++ /dev/null @@ -1,4 +0,0 @@ -P6 -10 10 -255 -ΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓ
\ No newline at end of file diff --git a/files/tilesets/knots/corner.ppm b/files/tilesets/knots/corner.ppm Binary files differdeleted file mode 100644 index caea47c..0000000 --- a/files/tilesets/knots/corner.ppm +++ /dev/null diff --git a/files/tilesets/knots/line.ppm b/files/tilesets/knots/line.ppm Binary files differdeleted file mode 100644 index 8d1a6d0..0000000 --- a/files/tilesets/knots/line.ppm +++ /dev/null diff --git a/files/tilesets/knots/plus.ppm b/files/tilesets/knots/plus.ppm Binary files differdeleted file mode 100644 index 17f3c82..0000000 --- a/files/tilesets/knots/plus.ppm +++ /dev/null diff --git a/files/tilesets/knots/t.ppm b/files/tilesets/knots/t.ppm Binary files differdeleted file mode 100644 index 2627d1e..0000000 --- a/files/tilesets/knots/t.ppm +++ /dev/null diff --git a/src/config.h b/src/config.h index 19726d5..bd6fc31 100644 --- a/src/config.h +++ b/src/config.h @@ -1,46 +1,53 @@ -// comment this if you dont want to generate the tiles, but -// want to use the tileset defined in the TILESET_NAME directive -// #define GENERATE_PPM_TILES - -#ifdef GENERATE_PPM_TILES - int generated_tile_colors[2][3] = { - { 0, 32, 63 }, // blank | default 255 - { 173, 239, 209 } // not blank | defalut 0 - // { 255, 255, 255 }, - // { 0, 0, 0 } - }; -#endif +// name of the tileset, localated in files/tilesets directory +#define TILESET_NAME "black-white" +#define DIMENTIONS 2 +#define TILE_TYPES 5 -// name of the tileset, localated in files/tilesets directory -// must be defined only when GENERATE_PPM_TILES is not -// if both arent defined, only tiles.dat will be generated -#define TILESET_NAME "knots" - -/* The TILES are - --------------------------------------------------- -| 0: ... blank | 1: ... t (down) | -| ... X symetry | ### T symetry | -| ... | .#. | -| -------------------+--------------------------| -| 2: .#. plus | 3: ... line | -| ### I symetry | ### I symetry | -| .#. | ... | -| -------------------+--------------------------| -| 4: .#. corner | | -| .## T symetry | | -| ... | | --------------------------------------------------- - -The number are the tile indexes, the values that you -need to put in the tiles_to_load array - - */ +tile tiles[TILE_TYPES] = { + { "empty" , 'X', { 0, 0, 0, 0 } }, + { "t" , 'T', { 0, 1, 1, 1 } }, + { "cross" , 'X', { 1, 1, 1, 1 } }, + { "line" , 'I', { 0, 1, 1, 0 } }, + { "corner" , 'T', { 1, 1, 0, 0 } } +}; // Array for which tiles to include the tiles.dat int tiles_to_load[] = { - 2, - 3, - 4, + 3, 4 }; + +// // name of the tileset, localated in files/tilesets directory +// #define TILESET_NAME "circuit" + +// #define DIMENTIONS 2 +// #define TILE_TYPES 14 + +// // pcb green - 0 +// // green - 1, +// // grey - 2, +// // black - 3, +// // other - 4, 5 +// tile tiles[TILE_TYPES] = { +// { "bridge" , 'I', { 1, 2, 2, 1 } }, +// { "component" , 'X', { 3, 3, 3, 3 } }, +// { "connection" , 'T', { 1, 4, 5, 3 } }, +// { "corner" , 'T', { 0, 0, 4, 5 } }, +// { "dskew" , 'I', { 1, 1, 1, 1 } }, +// { "skew" , 'T', { 1, 1, 0, 0 } }, +// { "substrate" , 'X', { 0, 0, 0, 0 } }, +// { "t" , 'T', { 0, 1, 1, 1 } }, +// { "track" , 'I', { 1, 0, 0, 1 } }, +// { "transition" , 'T', { 2, 0, 0, 1 } }, +// { "turn" , 'T', { 1, 1, 0, 0 } }, +// { "viad" , 'I', { 0, 1, 1, 0 } }, +// { "vias" , 'T', { 1, 0, 0, 0 } }, +// { "wire" , 'I', { 0, 2, 2, 0 } }, +// }; + + +// // Array for which tiles to include the tiles.dat +// int tiles_to_load[] = { +// 0, 1, 2, 3, 4, 5, 6, +// 7, 8, 9, 10, 11, 12, 13, +// }; diff --git a/src/gen_tiles.c b/src/gen_tiles.c index e4e2159..c29bc29 100644 --- a/src/gen_tiles.c +++ b/src/gen_tiles.c @@ -3,135 +3,58 @@ #include <string.h> #include <sys/stat.h> #include "typedef.h" -#include "ppm.h" -#include "config.h" - -#define TILE_TYPES 5 -#define TILE_WIDTH 3 -#define TILE_HEIGHT 3 - -// possible types: X T I -char symetry[TILE_TYPES] = "XTIIT"; - -char tile_names[TILE_TYPES][7] = { - "blank", "t", "plus", "line", "corner" -}; - -small_t tiles[TILE_TYPES][TILE_WIDTH*TILE_HEIGHT] = { - { - 0, 0, 0, - 0, 0, 0, - 0, 0, 0 - }, { - 0, 0, 0, - 1, 1, 1, - 0, 1, 0 - }, { - 0, 1, 0, - 1, 1, 1, - 0, 1, 0 - },{ - 0, 0, 0, - 1, 1, 1, - 0, 0, 0 - }, { - 0, 1, 0, - 0, 1, 1, - 0, 0, 0 - } -}; -small_t tiles_connections[TILE_TYPES][4] = { - { 0, 0, 0, 0 }, - { 0, 1, 1, 1 }, - { 1, 1, 1, 1 }, - { 0, 1, 1, 0 }, - { 1, 1, 0, 0 }, -}; +typedef struct tile { + char name[64]; + char symetry; + small_t connections[SIDES_MAX]; + // small_t neighbours[TILES_CAP]; +// size_t neigbours_sz; +} tile; -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; - -} -FILE *fp; +#include "config.h" -void save(small_t *t, small_t *c, int n, int i) +void copy(char *tile_set, char *name, int n) { -#ifdef GENERATE_PPM_TILES - (void)i; - - char file_name[64] = {0}; - - sprintf(file_name, "files/tiles/tile_%d.ppm", n); - - 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, - generated_tile_colors[0][0], - generated_tile_colors[1][0]); - set_color(pixels, t, x, y, 1, - generated_tile_colors[0][1], - generated_tile_colors[1][1]); - set_color(pixels, t, x, y, 2, - generated_tile_colors[0][2], - generated_tile_colors[1][2]); - } - - save_as_ppm(file_name, pixels, TILE_WIDTH, TILE_HEIGHT, 1); - free(pixels); - printf("Saved file: %s\n", file_name); -#endif -#ifdef TILESET_NAME - (void)t; (void)c; - - char command[128]; - sprintf(command, "cp files/tilesets/%s/%s.ppm files/tiles/tile_%d.ppm", TILESET_NAME, tile_names[i], n); + char command[512]; + sprintf(command, "cp files/tilesets/%s/%s.ppm files/tiles/tile_%d.ppm", + tile_set, name, n); system(command); -#endif - - small_t connections = 0; - for(int ci = 0; ci < 4; ci++) - { - connections |= (c[ci] << (3-ci)); - } - - fwrite(&connections, sizeof(connections), 1, fp); } void gen() { - 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); + system("mkdir files"); + system("mkdir files/tiles"); - fp = fopen("files/tiles/tiles.dat", "wb"); + FILE *fp = fopen("files/tiles/tiles.dat", "wb"); if(!fp) { fprintf(stderr, "ERROR: Could not open file files/tiles/tiles.dat"); exit(EXIT_FAILURE); } + small_t dim = DIMENTIONS; + fwrite(&dim, sizeof(small_t), 1, fp); + size_t tiles_sz = sizeof(tiles_to_load)/sizeof(int); fwrite(&tiles_sz, sizeof(size_t), 1, fp); - char syms[TILE_TYPES]; - size_t sym_sz = 0; - for(size_t n = 0; n < tiles_sz; n++) { - int i = tiles_to_load[n]; - save(tiles[i], tiles_connections[i], n, i); - syms[sym_sz++] = symetry[i]; - } + int t = tiles_to_load[n]; + copy(TILESET_NAME, tiles[t].name, n); - fwrite(syms, 1, sym_sz, fp); + fwrite(tiles[t].connections, sizeof(small_t), SIDES, fp); + fwrite(&(tiles[t].symetry), sizeof(char), 1, fp); + } fclose(fp); } - int main(void) { + puts("INFO: Generating Tile Data"); gen(); + puts("INFO: Successful"); return 0; } @@ -2,6 +2,7 @@ #include <stdlib.h> #include <string.h> #include <time.h> +#include <unistd.h> #include "typedef.h" #include "ppm.h" #include "tiles.h" @@ -16,8 +17,8 @@ size_t TILE_HEIGHT; // width and height of the tilemap // to generate -size_t SWIDTH = 30; -size_t SHEIGHT = 30; +size_t SWIDTH = 15; +size_t SHEIGHT = 15; time_t SEED; size_t SCALE = 9; @@ -59,7 +60,7 @@ int get_least_entropy_index() void collapse_this(int i) { if(count_entropy(i) == 0) { - fprintf(stderr, "ERROR: No possible tiles for this position: %d\n", i); + err("No possible tiles for this position: %d\n", i); exit(EXIT_FAILURE); } @@ -92,66 +93,61 @@ void collapse_this(int i) void manage_arguments(int argc, char **argv) { - if(argc == 1) return; - - for(int n = 1; n < argc; n++) + int opt; + while((opt = getopt(argc, argv, "hd:s:m:")) != -1) { - char *arg = argv[n]; - - if((strcmp(arg, "-h") == 0) || (strcmp(argv[1], "--help") == 0)) { + switch(opt) + { + case 'd': + SWIDTH = atoi(strtok(optarg, "x")); + SHEIGHT = atoi(strtok(NULL, "x")); + break; + case 's': + SEED = atoi(optarg); + break; + case 'm': + SCALE = atoi(optarg); + break; + case 'h': + default: puts("Usage: wfc [OPTION] [VALUE(S)]...\n"); - puts("The options are the following: (No option is mandatory)\n"); - puts("-h, --help Get help"); - puts("-d Change width and height of the tilemap, defaut is 30x30"); - puts(" args: 2 numbers; width and height seperated by space"); - puts("-s Change the seed for generating the tilemap, default is time(0)"); - puts(" args: 1 number; the seed"); - puts("-m Change the number, that the tilemap is scaled by"); - puts(" args: 1 number; scaler"); + puts("The options are the following: (No option is mandatory)"); + puts("-h Get help"); + puts("-d Change width and height of the tilemap, defaut is 30x30"); + puts(" args: 2 numbers; width and height seperated by an 'x'"); + puts("-s Change the seed, default is time(0)"); + puts(" args: 1 number; the seed"); + puts("-m Change the number, that the tilemap is scaled by"); + puts(" args: 1 number; scaler"); exit(EXIT_SUCCESS); - } else if(strcmp(arg, "-d") == 0) { - if(!(n+2 < argc)) goto error; - SWIDTH = atoi(argv[++n]); - SHEIGHT = atoi(argv[++n]); - } else if(strcmp(arg, "-s") == 0) { - if(!(n+1 < argc)) goto error; - SEED = atoi(argv[++n]); - } else if(strcmp(arg, "-m") == 0) { - if(!(n+1 < argc)) goto error; - SCALE = atoi(argv[++n]); - } else goto error; + break; + } } - return; - -error: - fputs("ERROR: An error has accured with the given arguments", stderr); - exit(EXIT_FAILURE); } int main(int argc, char **argv) { - // SEED = 4; SEED = time(0); - manage_arguments(argc, argv); - srand(SEED); - printf("The Seed is %ld\n", SEED); + + info("Starting With:\n\tWidth: %ld\n\tHeight: %ld\n\tSeed: %ld\n\tScale: %ld", SWIDTH, SHEIGHT, SEED, SCALE); load_tiles(); + info("Tiles Loaded"); init_tilemap(); + info("Tilemap Initiated"); generate_tile_masks(get_tile_connections()); + info("Tile Masks Generated"); - while(1) { - int lei; - lei = get_least_entropy_index(); + // print_tiles(); + // printf("%ld\n", TILES); - if(has_collapsed(lei)) - break; // every index is set - else - collapse_this(lei); - } + for(int lei = get_least_entropy_index(); !has_collapsed(lei); lei = get_least_entropy_index()) + collapse_this(lei); + + info("Tilemap Successfully Generated"); size_t img_wdt = TILE_WIDTH * SWIDTH; size_t img_hgt = TILE_HEIGHT * SHEIGHT; @@ -178,7 +174,7 @@ int main(int argc, char **argv) sprintf(file_name, "files/file_%ld.ppm", SEED); save_as_ppm(file_name, image, img_wdt, img_hgt, SCALE); - printf("Saved file with name: %s\n", file_name); + info("Saved file with name: %s\n", file_name); free(image); return 0; @@ -8,12 +8,12 @@ void save_as_ppm(char* file_path, small_t *t, size_t width, size_t height, size_ { FILE *fp = fopen(file_path, "wb"); if(!fp) { - fprintf(stderr, "ERROR: Could not open file: %s\n", file_path); + err("Could not open file: %s\n", file_path); exit(EXIT_FAILURE); } if(scaler == 0) { - fprintf(stderr, "ERROR: Invalid value for scaler %ld\n", scaler); + err("Invalid value for scaler %ld\n", scaler); exit(EXIT_FAILURE); } @@ -33,7 +33,7 @@ char *load_from_ppm(char *file_path, size_t *width, size_t *height) { FILE *fp = fopen(file_path, "rb"); if(!fp) { - fprintf(stderr, "ERROR: Could not open file: %s\n", file_path); + err("Could not open file: %s\n", file_path); exit(EXIT_FAILURE); } @@ -41,7 +41,7 @@ char *load_from_ppm(char *file_path, size_t *width, size_t *height) fgets(line, sizeof(line), fp); if(strncmp(line, "P6", 2) != 0) { - fprintf(stderr, "ERROR: PPM header is not correct of file: %s\n", file_path); + err("PPM header is not correct of file: %s\n", file_path); exit(EXIT_FAILURE); } @@ -51,7 +51,7 @@ char *load_from_ppm(char *file_path, size_t *width, size_t *height) fgets(line, sizeof(line), fp); if(atoi(line) != 255) { - printf("Maximum color value must be 255"); + err("Maximum color value must be 255"); exit(1); } diff --git a/src/tilemap.c b/src/tilemap.c index a09ec0b..df1c1c6 100644 --- a/src/tilemap.c +++ b/src/tilemap.c @@ -1,3 +1,4 @@ +#include <stdio.h> #include <stdlib.h> #include <string.h> #include "typedef.h" @@ -6,6 +7,8 @@ #define MIN(x, y) (((x) < (y)) ? (x) : (y)) #define BIG_SZ (sizeof(big_t) * 8) +#define INDEX (typeof(n))(n / BIG_SZ) +#define OFFSET (typeof(n))(n % BIG_SZ) extern size_t TILES; extern size_t SWIDTH; @@ -14,21 +17,22 @@ extern size_t SHEIGHT; big_t (*tilemap)[TILEMAP_CAP]; size_t tsz = 0; -// 0 up 1 right -// 2 left 3 down +// 0 up 1 right +// 2 left 3 down +// 4 front 5 back // each bit of the numbers is for every tiles // if the tile is a possibility // least significant bit is tile index 0 -big_t (*tile_masks)[TILES_CAP][4]; +big_t (*tile_masks)[TILES_CAP][SIDES_MAX]; void set(int t, int n) { - tilemap[(n/BIG_SZ)][t] |= (1 << (n%BIG_SZ)); + tilemap[INDEX][t] |= ((big_t)1 << OFFSET); } int is_set(int t, int n) { - return (tilemap[(n/BIG_SZ)][t] >> (n%BIG_SZ)) & 1; + return (tilemap[INDEX][t] >> OFFSET) & 1; } void init_tilemap() @@ -36,9 +40,10 @@ void init_tilemap() tsz = (TILES/BIG_SZ) + 1; tilemap = malloc(sizeof(big_t[tsz][TILEMAP_CAP])); - for(size_t i = 0; i < tsz; i++) - for(size_t n = 0; n < SWIDTH * SHEIGHT; n++) - tilemap[i][n] = ((1 << MIN(BIG_SZ, (TILES - (i*BIG_SZ)))) - 1); + // set everything + for(size_t n = 0; n < SWIDTH * SHEIGHT; n++) + for(size_t i = 0; i < tsz; i++) + tilemap[i][n] = (((big_t)1 << MIN(BIG_SZ, (TILES - (i*BIG_SZ)))) - 1); } void destroy_tilemap() @@ -85,42 +90,35 @@ void mask(int t, int m, int r) tilemap[i][t] &= tile_masks[i][m][r]; } -void generate_tile_masks(small_t* tile_connections) +void generate_tile_masks(small_t (*tc)[SIDES_MAX]) { - size_t (*wt_con)[4]; - size_t (*no_con)[4]; - wt_con = malloc(sizeof(size_t[tsz][4])); - no_con = malloc(sizeof(size_t[tsz][4])); - - for(int n = 0; n < 4; n++) - { - for(size_t i = 0; i < tsz; i++) { - wt_con[i][n] = 0; - no_con[i][n] = 0; - } - - for(size_t i = 0; i < TILES; i++) - wt_con[(i/BIG_SZ)][n] |= ((tile_connections[i] >> n) & 1) << (i%BIG_SZ); + tile_masks = malloc(sizeof(big_t[tsz][TILES_CAP][SIDES_MAX])); + memset(tile_masks, 0, sizeof(big_t[tsz][TILES_CAP][SIDES_MAX])); - for(size_t i = 0; i < TILES; i++) - no_con[(i/BIG_SZ)][n] |= ((wt_con[(i/BIG_SZ)][n] >> (i%BIG_SZ)) & 1) ? 0 : 1 << (i % BIG_SZ); - } - - tile_masks = malloc(sizeof(big_t[tsz][TILES_CAP][4])); - - for(size_t i = 0; i < TILES; i++) + for(size_t n = 0; n < TILES; n++) { - for(int n = 0; n < 4; n++) - { - if((tile_connections[i] >> (3-n)) & 1) - for(size_t t = 0; t < tsz; t++) - tile_masks[t][i][n] = wt_con[t][n]; - else - for(size_t t = 0; t < tsz; t++) - tile_masks[t][i][n] = no_con[t][n]; + for(size_t j = 0; j < TILES; j++) { + for(size_t i = 0; i < SIDES; i++) { + // current solution for circuits :( + // if(n == j && (n == 3 || n == 4 || n == 5 || n ==6)) + // tile_masks[INDEX][j][i] |= (tc[n][3-i] != tc[j][i]) << OFFSET; + // else if(n == j && (n == 7|| n == 8 || n == 9 || n == 10)) + // tile_masks[INDEX][j][i] |= 0 << OFFSET; + // else + tile_masks[INDEX][j][i] |= (tc[n][3-i] == tc[j][i]) << OFFSET; + } } } - - free(wt_con); - free(no_con); } +// void print_tilemap() +// { +// printf("tsz: %ld\n", tsz); +// for(size_t i = 0; i < SHEIGHT; i++) { +// for(size_t j = 0; j < SWIDTH; j++) { +// for(size_t n = tsz-1; n < tsz; n--) +// printf("%lb ", tilemap[n][i*SWIDTH + j]); +// printf("\n"); +// } +// printf("\n"); +// } +// } diff --git a/src/tilemap.h b/src/tilemap.h index f25e7df..533c3d5 100644 --- a/src/tilemap.h +++ b/src/tilemap.h @@ -15,12 +15,10 @@ size_t count_entropy(int t); void init_tilemap(); void destroy_tilemap(); -void generate_tile_masks(small_t* tile_connections); +void generate_tile_masks(small_t (*tile_connections)[SIDES_MAX]); // applly a mask m, r (from tile_masks) // to tile t in tilemap void mask(int t, int m, int r); - - #endif diff --git a/src/tiles.c b/src/tiles.c index cecee5a..0c31c05 100644 --- a/src/tiles.c +++ b/src/tiles.c @@ -9,8 +9,9 @@ extern size_t TILES; extern size_t TILE_WIDTH; extern size_t TILE_HEIGHT; +small_t DIMENTIONS = 0; small_t *(tiles[TILES_CAP]); -small_t tile_connections[TILES_CAP]; +small_t tile_connections[TILES_CAP][SIDES_MAX]; static int rotate(int x, int y, int r, int w) { @@ -38,26 +39,29 @@ static void rotate_tiles(char *t, int i, int r) tiles[i][(y * TILE_WIDTH + x)*3 + k] = t[(rotate(x, y, r, TILE_WIDTH))*3 + k]; } -static void rotate_connections(char *tc, int i, int n, int r) +static void rotate_connections(small_t (*tc)[SIDES_MAX], int i, int n, int r) { - tile_connections[n] = 0; for(int y = 0; y < 2; y++) for(int x = 0; x < 2; x++) - tile_connections[n] |= (((tc[i] >> rotate(x, y, r, 2)) & 1) << (y * 2 + x)); + tile_connections[n][y*2 + x] = tc[i][rotate(x, y, r, 2)]; } -static void load_tile_data(char *tc, char *ts, size_t *tid) +static void load_tile_data(small_t (*tc)[SIDES_MAX], char *ts, size_t *tid) { char file_path[32] = "files/tiles/tiles.dat"; FILE *fp = fopen(file_path, "rb"); if(!fp) { - fprintf(stderr, "Could not open file: %s\n", file_path); + err("Could not open file: %s\n", file_path); exit(EXIT_FAILURE); } + fread(&DIMENTIONS, sizeof(DIMENTIONS), 1, fp); fread(tid, sizeof(size_t), 1, fp); - fread(tc, 1, *tid, fp); - fread(ts, 1, *tid, fp); + + for(size_t i = 0; i < *tid; i++) { + fread(tc[i], sizeof(small_t), SIDES, fp); + fread(&(ts[i]), sizeof(char), 1, fp); + } fclose(fp); } @@ -65,7 +69,7 @@ static void load_tile_data(char *tc, char *ts, size_t *tid) void load_tiles() { size_t tid = 0; - char tile_con[TILES_CAP]; + small_t tile_con[TILES_CAP][SIDES_MAX] = {0}; char tile_sym[TILES_CAP]; load_tile_data(tile_con, tile_sym, &tid); @@ -77,7 +81,7 @@ void load_tiles() size_t n = 0; for(size_t i = 0; i < tid; i++, n++) { - char file_path[32]; + char file_path[128]; sprintf(file_path, "files/tiles/tile_%ld.ppm", i); char *t = load_from_ppm(file_path, &TILE_WIDTH, &TILE_HEIGHT); @@ -88,7 +92,7 @@ void load_tiles() rotate_connections(tile_con, i, n, 0); break; case 'T': - for(int j = 0; j < 4; j++) { + for(int j = 0; j < SIDES; j++) { rotate_tiles(t, n, j); rotate_connections(tile_con, i, n, j); n++; @@ -100,17 +104,28 @@ void load_tiles() n++; rotate_tiles(t, n, 1); rotate_connections(tile_con, i, n, 1); + break; + case '/': + rotate_tiles(t, n, 0); + rotate_connections(tile_con, i, n, 0); + n++; + rotate_tiles(t, n, 3); + rotate_connections(tile_con, i, n, 3); + break; + default: + err("Symetry Character not recognized: '%c'", tile_sym[i]); + exit(EXIT_FAILURE); } free_ppm(t); + + if(n > TILES_CAP) { + err("Too many tiles: %ld\n", n); + exit(EXIT_FAILURE); + } } TILES = n; - - if(TILES > TILES_CAP) { - fprintf(stderr, "ERROR: Too many tiles: %ld\n", TILES); - exit(EXIT_FAILURE); - } } void free_tiles() @@ -124,7 +139,9 @@ void print_tiles() for(size_t i = 0; i < TILES; i++) { printf("Tile: %ld\n", i); - printf("Connections: %b\n", tile_connections[i]); + for(int n = 0; n < 4; n++) { + printf("%d", tile_connections[i][n]); + } printf("\n"); for(size_t y = 0; y < TILE_HEIGHT; y++) { for(size_t x = 0; x < TILE_WIDTH; x++) @@ -140,7 +157,7 @@ int get_tile_pixel(size_t t, size_t x, size_t y, int k) return tiles[t][(y * TILE_WIDTH + x)*3 + k]; } -small_t *get_tile_connections() +small_t (*get_tile_connections())[SIDES_MAX] { return tile_connections; } diff --git a/src/tiles.h b/src/tiles.h index d6dae58..6a4a223 100644 --- a/src/tiles.h +++ b/src/tiles.h @@ -7,6 +7,6 @@ void free_tiles(); void print_tiles(); int get_tile_pixel(size_t t, size_t x, size_t y, int k); -small_t *get_tile_connections(); +small_t (*get_tile_connections())[SIDES_MAX]; #endif diff --git a/src/typedef.h b/src/typedef.h index 730b32a..5dff622 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -2,15 +2,26 @@ #define TYPEDEF_H // useful definitions +#include <stdint.h> +#include <stddef.h> +typedef unsigned char small_t; +typedef uint64_t big_t; // max tiles that can be loaded #define TILES_CAP 128 // max amount of tiles in a tilemap that is being generated #define TILEMAP_CAP 16384 +// max amount of sided +#define SIDES_MAX 6 -#include <stdint.h> -#include <stddef.h> -typedef unsigned char small_t; -typedef uint64_t big_t; +extern small_t DIMENTIONS; +#define SIDES (2 * DIMENTIONS) + +#define __RED__ "\033[0;31m" +#define __GREEN__ "\033[0;32m" +#define __RESET__ "\033[0m" + +#define info(...) fprintf(stdout, __GREEN__"[INFO]"__RESET__" "__VA_ARGS__); printf("\n") +#define err(...) fprintf(stderr, __RED__"[ERROR]"__RESET__" "__VA_ARGS__); printf("\n") #endif |