84 lines
3.0 KiB
Python
84 lines
3.0 KiB
Python
import json
|
|
from processimage import processImage
|
|
import sys
|
|
from assethelpers import getAssetRelativePath
|
|
import os
|
|
import datetime
|
|
from args import args
|
|
|
|
def processTileset(asset):
|
|
print(f"Processing tileset: {asset['path']}")
|
|
|
|
# We need to determine how big each tile is. This can either be provided as
|
|
# an arg of tileWidth/tileHeight or as a count of rows/columns.
|
|
# Additionally, if the image has been factored, then the user can provide both
|
|
# tile sizes AND cols/rows to indicate the original size of the image.
|
|
|
|
image = processImage(asset)
|
|
|
|
tileWidth, tileHeight = None, None
|
|
columns, rows = None, None
|
|
originalWidth, originalHeight = image['width'], image['height']
|
|
|
|
if 'tileWidth' in asset['options'] and 'columns' in asset['options']:
|
|
tileWidth = int(asset['options']['tileWidth'])
|
|
columns = int(asset['options']['columns'])
|
|
originalWidth = tileWidth * columns
|
|
elif 'tileWidth' in asset['options']:
|
|
tileWidth = int(asset['options']['tileWidth'])
|
|
columns = image['width'] // tileWidth
|
|
elif 'columns' in asset['options']:
|
|
columns = int(asset['options']['columns'])
|
|
tileWidth = image['width'] // columns
|
|
else:
|
|
print(f"Error: Tileset {asset['path']} must specify either tileWidth or columns")
|
|
sys.exit(1)
|
|
|
|
if 'tileHeight' in asset['options'] and 'rows' in asset['options']:
|
|
tileHeight = int(asset['options']['tileHeight'])
|
|
rows = int(asset['options']['rows'])
|
|
originalHeight = tileHeight * rows
|
|
elif 'tileHeight' in asset['options']:
|
|
tileHeight = int(asset['options']['tileHeight'])
|
|
rows = image['height'] // tileHeight
|
|
elif 'rows' in asset['options']:
|
|
rows = int(asset['options']['rows'])
|
|
tileHeight = image['height'] // rows
|
|
else:
|
|
print(f"Error: Tileset {asset['path']} must specify either tileHeight or rows")
|
|
sys.exit(1)
|
|
|
|
fileNameWithoutExtension = os.path.splitext(os.path.basename(asset['path']))[0]
|
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
tilesetName = fileNameWithoutExtension
|
|
tilesetNameUpper = tilesetName.upper()
|
|
|
|
widthScale = originalWidth / image['width']
|
|
heightScale = originalHeight / image['height']
|
|
|
|
# Create header
|
|
data = f"// Tileset Generated for {asset['path']} at {now}\n"
|
|
data += f"#pragma once\n"
|
|
data += f"#include \"display/tileset.h\"\n\n"
|
|
data += f"static const tileset_t TILESET_{tilesetNameUpper} = {{\n"
|
|
data += f" .tileWidth = {tileWidth},\n"
|
|
data += f" .tileHeight = {tileHeight},\n"
|
|
data += f" .tileCount = {columns * rows},\n"
|
|
data += f" .columns = {columns},\n"
|
|
data += f" .rows = {rows},\n"
|
|
data += f" .uv = {{ {widthScale / columns}f, {heightScale / rows}f }},\n"
|
|
data += f" .image = {json.dumps(image['imagePath'])},\n"
|
|
data += f"}};\n"
|
|
|
|
# Write Header
|
|
outputFile = os.path.join(args.headers_dir, "display", "tileset", f"tileset_{tilesetName}.h")
|
|
os.makedirs(os.path.dirname(outputFile), exist_ok=True)
|
|
with open(outputFile, 'w') as f:
|
|
f.write(data)
|
|
|
|
outTileset = {
|
|
"image": image,
|
|
"headerFile": outputFile,
|
|
"files": image['files'],
|
|
}
|
|
return outTileset |