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