"""Post-pass on a Blender-exported binary FBX: remove the duplicate shape-key animation that Blender writes as Geometry-property curves (AnimationCurveNode named after the shape key, connected OP to the Geometry). The DeformPercent curves on the BlendShapeChannel deformers are kept. Result loads in three.js FBXLoader (which otherwise throws on the duplicates) and stays valid for Blender/Unity. usage: python3 fbx_clean.py in.fbx out.fbx """ import struct, sys def read_fbx(data): ver = struct.unpack('= 7500 def read_node(pos): if big: end, nprops, plen, nlen = struct.unpack_from('= 4 and p[0][1] == b'OP': child, parent = struct.unpack('= 3: child, parent = struct.unpack('