import struct import sys import os import json from assetstool.args import args from assetstool.assetcache import assetCache, assetGetCache from assetstool.assethelpers import getAssetRelativePath from dusk.defs import TILE_WIDTH, TILE_HEIGHT, TILE_DEPTH, CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_DEPTH, CHUNK_TILE_COUNT from dusk.map import Map from dusk.chunk import Chunk def convertModelData(modelData): # TLDR; Model data stores things efficiently with indices, but we buffer it # out to 6 vertex quads for simplicity. outVertices = [] outUVs = [] outColors = [] for indice in modelData['indices']: vertex = modelData['vertices'][indice] uv = modelData['uvs'][indice] color = modelData['colors'][indice] outVertices.append(vertex) outUVs.append(uv) outColors.append(color) return { 'vertices': outVertices, 'uvs': outUVs, 'colors': outColors } def processChunk(chunk): cache = assetGetCache(chunk.getFilename()) if cache: return cache baseModel = { 'vertices': [], 'colors': [], 'uvs': [] } models = [ baseModel ] for tileIndex, tile in chunk.tiles.items(): tileBase = tile.getBaseTileModel() convertedBase = convertModelData(tileBase) baseModel['vertices'].extend(convertedBase['vertices']) baseModel['colors'].extend(convertedBase['colors']) baseModel['uvs'].extend(convertedBase['uvs']) # Generate binary buffer for efficient output buffer = bytearray() buffer.extend(b'DCF')# Header buffer.extend(len(chunk.tiles).to_bytes(4, 'little')) # Number of tiles buffer.extend(len(models).to_bytes(1, 'little')) # Number of models buffer.extend(len(chunk.entities).to_bytes(1, 'little')) # Number of entities # Buffer tile data as array of uint8_t for tileIndex, tile in chunk.tiles.items(): buffer.extend(tile.shape.to_bytes(1, 'little')) # # For each model for model in models: vertexCount = len(model['vertices']) buffer.extend(vertexCount.to_bytes(4, 'little')) for i in range(vertexCount): vertex = model['vertices'][i] uv = model['uvs'][i] color = model['colors'][i] buffer.extend(color[0].to_bytes(1, 'little')) buffer.extend(color[1].to_bytes(1, 'little')) buffer.extend(color[2].to_bytes(1, 'little')) buffer.extend(color[3].to_bytes(1, 'little')) buffer.extend(bytearray(struct.pack('