#!/usr/bin/env python3 # ##### BEGIN GPL LICENSE BLOCK ##### # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # ##### END GPL LICENSE BLOCK ##### # # 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'