-
Notifications
You must be signed in to change notification settings - Fork 0
/
tiles_generator.py
111 lines (87 loc) · 3.45 KB
/
tiles_generator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""
Auto-generate C++ array of tile_t based on .bmp image tileset
"""
import sys
from PIL import Image
import numpy as np
TILE_SIZE = 0
rgb_colorIndex_map = {
"[21 15 10]" : 0, # brown darker
"[42 29 13]" : 1, # brown dark
"[57 42 28]" : 2, # brown
"[104 76 60]" : 3, # brown light
"[146 126 106]" : 4, # brown lighter
"[216 158 101]" : 5, # beige dark
"[239 183 117]" : 6, # beige
"[31 36 10]" : 7, # green dark
"[57 87 28]" : 8, # green light
"[165 140 39]" : 9, # mustard
"[24 63 57]" : 10, # blue dark
"[ 60 159 156]" : 11, # cyan
"[155 26 10]" : 12, # red
"[239 105 47]" : 13, # orange
"[239 172 40]" : 14, # yellow
"[239 216 161]" : 15, # whitish
}
def bitmap2pixelList(image):
img = Image.open(image)
w, h = img.size
""" in format: [ row_0 = [pixel_00, pixel_01, ...], row_1 = [pixel_10, pixel_11, ...], ... ] """
img_data = np.array(Image.open(image)).reshape(h, w, 3)
return (w, h, img_data)
def getTilesetAsIndexMatrix(pixelList):
tileset = []
for row in img_data:
indicesList = []
for pixel in row:
indicesList.append(rgb_colorIndex_map[str(pixel)])
tileset.append(indicesList)
return tileset
def getTileByIndex(i, j, indexMatrix):
tile = []
for row in range(TILE_SIZE):
tile.append(list(indexMatrix[i * TILE_SIZE + row][j * TILE_SIZE:j * TILE_SIZE + TILE_SIZE]))
return tile
def isEmptyTile(tile):
for row in tile:
for col in row:
if col != 0:
return False
return True
def transposeTile(tile):
newTile = []
for i in range(TILE_SIZE):
row = []
for j in range(TILE_SIZE):
row.append(tile[j][i])
newTile.append(row)
return newTile
def tile2cArrayStr(tile):
#god this line of code is crazy, not even sure if I can come up with a worse one, damn
return " {{\n{}\n }}".format(str([" {{{}}}".format(str(tile[i])[1:-1]) for i in range(TILE_SIZE)])[1:-1].replace('\'', '').replace('}, ', '},\n'))
def indexMatrix2tilesArrayHeaderStr(rows, cols, indexMatrix):
tile_row = " {" + "0, " * (TILE_SIZE-1) + "0},\n"
tilesArrStr = "#ifndef TILES_H\n" \
"#define TILES_H\n\n" \
"/*** NOTE: file auto-generated based on " + str(sys.argv[1]) + " tileset ***/\n\n" \
"//define a list of 8x8 tiles of colors from the above array -> a tile will have a size of 32 bytes -> 6bits indexable -> max 2048 bytes\n" \
"const Level::tile_t Level::tiles[] PROGMEM = {\n" #\
#" {\n" + tile_row * TILE_SIZE + " },\n"
for row in range(rows):
for col in range(cols):
tile = getTileByIndex(row, col, indexMatrix)
#if not isEmptyTile(tile):
tilesArrStr += (tile2cArrayStr(transposeTile(tile))) + ",\n"
tilesArrStr += "};\n\n#endif // TILES_H"
return tilesArrStr
def writeToFile(filepath, contents):
with open(filepath, 'w') as file:
file.write(contents)
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: {} tileset tile_size".format(sys.argv[0]))
sys.exit(1)
TILE_SIZE = int(sys.argv[2])
w, h, img_data = bitmap2pixelList(sys.argv[1])
indexMatrix = getTilesetAsIndexMatrix(img_data)
writeToFile('../include/tiles_data.h', indexMatrix2tilesArrayHeaderStr(h // TILE_SIZE, w // TILE_SIZE, indexMatrix))