import sys
from ninja_syntax import Writer
import os
def scan_assets(build_root):
print(f'[spacetime] Scanning {build_root}/assets/src for assets')
assets = []
for entry in os.scandir(f'{build_root}/assets/src'):
if entry.is_file() and entry.name.endswith('.ink.svg'):
assets.append(f'{build_root}/assets/src/{entry.name}')
print(f'[spacetime] Found {len(assets)} assets')
return assets
default_asset_size = 512
asset_override = {
'earth.ink.svg': 2048
}
def gen_inkscape_rules_for_asset_size(size, writer):
writer.rule(f'inkscape_{size}px_full', f'inkscape -w {size * 1} -h {size * 1} $in -o $out')
writer.rule(f'inkscape_{size}px_375', f'inkscape -w {int(size * 0.375)} -h {int(size * 0.375)} $in -o $out')
writer.rule(f'inkscape_{size}px_125', f'inkscape -w {int(size * 0.125)} -h {int(size * 0.125)} $in -o $out')
def gen_inkscape_rules_for_asset_sizes(writer):
gen_inkscape_rules_for_asset_size(default_asset_size, writer)
for override in asset_override:
gen_inkscape_rules_for_asset_size(asset_override[override], writer)
def asset_size(asset):
if asset.split('/')[-1] in asset_override:
return asset_override[asset.split('/')[-1]]
else:
return default_asset_size
def gen_inkscape_rules_for_asset(root, asset, writer, files_375, files_full, files_125):
in_file = asset
out_file_name = asset.split('.')[0].split('/')[-1]
out_full = f'{root}/assets/final/full/{out_file_name}.png'
files_full.append(out_full)
rule_full = f'inkscape_{asset_size(asset)}px_full'
out_375 = f'{root}/assets/final/375/{out_file_name}.png'
files_375.append(out_375)
rule_375 = f'inkscape_{asset_size(asset)}px_375'
out_125 = f'{root}/assets/final/125/{out_file_name}.png'
files_125.append(out_125)
rule_125 = f'inkscape_{asset_size(asset)}px_125'
writer.build([out_full], rule_full, [in_file])
writer.build([out_375], rule_375, [in_file])
writer.build([out_125], rule_125, [in_file])
def gen_inkscape(root, assets, writer, files_375, files_full, files_125):
gen_inkscape_rules_for_asset_sizes(writer)
for asset in assets:
gen_inkscape_rules_for_asset(root, asset, writer, files_375, files_full, files_125)
def gen_packers(root, writer, files_375, files_full, files_125):
# sheep pack assets/final/full/*.png -f amethyst_named -o assets/dist/spritesheet-full
writer.rule(f'pack', 'sheep pack -f amethyst_named -o $out $in && touch $out')
writer.build(f'{root}/assets/dist/spritesheet-full', 'pack', inputs=files_full,
implicit_outputs=[f'{root}/assets/dist/spritesheet-full.png',
f'{root}/assets/dist/spritesheet-full.ron'])
writer.build(f'asset-full', 'phony', inputs=[f'{root}/assets/dist/spritesheet-full'])
writer.build(f'{root}/assets/dist/spritesheet-375', 'pack', inputs=files_375,
implicit_outputs=[f'{root}/assets/dist/spritesheet-375.png',
f'{root}/assets/dist/spritesheet-375.ron'])
writer.build(f'asset-375', 'phony', inputs=[f'{root}/assets/dist/spritesheet-375'])
writer.build(f'{root}/assets/dist/spritesheet-125', 'pack', inputs=files_125,
implicit_outputs=[f'{root}/assets/dist/spritesheet-125.png',
f'{root}/assets/dist/spritesheet-125.ron'])
writer.build(f'asset-125', 'phony', inputs=[f'{root}/assets/dist/spritesheet-125'])
writer.build(f'asset', 'phony',
inputs=[f'{root}/assets/dist/spritesheet-full', f'{root}/assets/dist/spritesheet-375',
f'{root}/assets/dist/spritesheet-125'])
def generate_assets_build_command(root, assets, writer):
files_full = []
files_375 = []
files_125 = []
gen_inkscape(root, assets, writer, files_375, files_full, files_125)
gen_packers(root, writer, files_375, files_full, files_125)
def main():
target = sys.argv[1]
env = sys.argv[2]
root = sys.argv[3]
print(f'[spacetime] Configuring target {target} with ENV={env}, buildroot={root}')
with open(f'{root}/build.ninja', 'w') as f:
writer = Writer(f)
writer.comment('Generated by spacetime.py')
writer.comment('Do not manually edit this file')
if env == 'prod' or target == 'asset':
assets = scan_assets(root)
generate_assets_build_command(root, assets, writer)
print(f'[spacetime] Configured build')
if __name__ == "__main__":
main()