AirsoftTracker/maps/bin/build_map.py
2023-08-11 00:29:02 -04:00

121 lines
4.5 KiB
Python

import json
import sys
import os.path
import io
import astc_conv
from os import path
from PIL import Image
def pad(o, m):
if m>0 :
barray = bytearray(m)
for i in range(0,m):
barray[i] = 0xFF
o.write(barray)
return
def alignFile(o, position, aligment):
m = position % aligment
if m>0 :
m = aligment-m
barray = bytearray(m)
for i in range(0,m):
barray[i] = 0xFF
o.write(barray)
return m
def loadImage(filenameBase,x,y):
filename = filenameBase+str(x)+'/'+str(y)+'.png'
if path.exists(filename):
im=Image.open(filename)
return im
return None
def main():
folder = sys.argv[1]
output = sys.argv[2]
print('Processing '+folder)
tmeta = {}
position = 0
with open(folder+'/metadata.json') as f:
meta = json.load(f)
tmeta['name'] = meta['name']
tmeta['bounds'] = [meta['extent'][0],meta['extent'][3],meta['extent'][2],meta['extent'][1]]
tmeta['tile_matrix'] = []
with io.open(output, 'wb') as o:
for zl in meta['tile_matrix']:
zitem = {}
zitem['id'] = zl['id']
zitem['bounds'] = [zl['origin'][0],zl['origin'][1],zl['extent'][2],zl['extent'][1]]
zitem['images'] = []
zitem['pixel_size'] = zl['pixel_size']
zitem['tile_size'] = [zl['pixel_size'][0]*zl['tile_size'][0],zl['pixel_size'][1]*zl['tile_size'][1]]
xc = zl['origin'][0]
yc = zl['origin'][1]
xp = zl['pixel_size'][0]
yp = zl['pixel_size'][1]
fmt = 37808
hasImages = False
if zl['matrix_size'][0]*zl['matrix_size'][1] >=8:
fmt = 37812
for x in range(zl['matrix_size'][0]):
for y in range(zl['matrix_size'][1]):
filenameBase = folder+'/'+zl['id']+'/'
filename = filenameBase+str(x)+'/'+str(y)+'.png'
if path.exists(filename):
im=Image.open(filename)
expand = 1
nim = Image.new('RGBA',(im.size[0]+expand*2,im.size[1]+expand*2))
nim.putalpha(0)
nim.paste(im,(expand,expand))
pim = loadImage(filenameBase,x,y-1)
if pim!=None:
nim.paste(pim.crop((0,pim.size[1]-expand,pim.size[0],pim.size[1])),(expand,0))
pim = loadImage(filenameBase,x,y+1)
if pim!=None:
nim.paste(pim.crop((0,0,pim.size[0],expand)),(expand,nim.size[1]-expand))
pim = loadImage(filenameBase,x-1,y)
if pim!=None:
nim.paste(pim.crop((pim.size[0]-expand,0,pim.size[0],pim.size[1])),(0,expand))
pim = loadImage(filenameBase,x+1,y)
if pim!=None:
nim.paste(pim.crop((0,0,expand,pim.size[1])),(nim.size[0]-expand,expand))
rsize = im.size
im = nim
stride,asize,astc = astc_conv.convert(im,fmt)
if len(astc)>0:
hasImages = True
fileinfo = {}
fileinfo['size'] = im.size
fileinfo['bounds'] = [xc+x*rsize[0]*xp-xp*expand,yc+y*rsize[1]*yp-yp*expand,xc+(x+1)*rsize[0]*xp+xp*expand,yc+(y+1)*rsize[1]*yp+yp*expand]
fileinfo['x'] = x
fileinfo['y'] = y
fileinfo['address'] = position
fileinfo['image_stride'] = stride
fileinfo['image_size'] = len(astc)
fileinfo['image_fmt'] = fmt
o.write(astc)
with open(filename+'.bin','wb') as f:
f.write(astc)
position += len(astc)
pad(o,64)
position += 64
position += alignFile(o,position,64)
zitem['images'].append(fileinfo)
if hasImages==True:
tmeta['tile_matrix'].append(zitem)
alignFile(o,position,4096)
with io.open(output+'.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(tmeta, indent=4))
main()