#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0-or-later # # Script copyright (C) 2006-2012, assimp team # Script copyright (C) 2013 Blender Foundation """ Usage ===== fbx2json [FILES]... This script will write a JSON file for each FBX argument given. Output ====== The JSON data is formatted into a list of nested lists of 4 items: ``[id, [data, ...], "data_types", [subtree, ...]]`` Where each list may be empty, and the items in the subtree are formatted the same way. data_types is a string, aligned with data that spesifies a type for each property. The types are as follows: * 'Y': - INT16 * 'C': - BOOL * 'I': - INT32 * 'F': - FLOAT32 * 'D': - FLOAT64 * 'L': - INT64 * 'R': - BYTES * 'S': - STRING * 'f': - FLOAT32_ARRAY * 'i': - INT32_ARRAY * 'd': - FLOAT64_ARRAY * 'l': - INT64_ARRAY * 'b': - BOOL ARRAY * 'c': - BYTE ARRAY Note that key:value pairs aren't used since the id's are not ensured to be unique. """ # ---------------------------------------------------------------------------- # FBX Binary Parser from struct import unpack import array import zlib # at the end of each nested block, there is a NUL record to indicate # that the sub-scope exists (i.e. to distinguish between P: and P : {}) _BLOCK_SENTINEL_LENGTH = ... _BLOCK_SENTINEL_DATA = ... read_fbx_elem_uint = ... _IS_BIG_ENDIAN = (__import__("sys").byteorder != 'little') _HEAD_MAGIC = b'Kaydara FBX Binary\x20\x20\x00\x1a\x00' from collections import namedtuple FBXElem = namedtuple("FBXElem", ("id", "props", "props_type", "elems")) del namedtuple def read_uint(read): return unpack(b'