import bpy import json import os import sys def main(): output = sys.argv[sys.argv.index("--") + 1] actions_path = sys.argv[sys.argv.index("--") + 2] with open(actions_path) as file: actions_to_keep = set(json.load(file)) for obj in bpy.data.objects: if not obj.animation_data: continue for track in list(obj.animation_data.nla_tracks): if track.name.startswith("[Action Stash]"): obj.animation_data.nla_tracks.remove(track) nla_tracks = [ track for obj in bpy.data.objects if obj.animation_data for track in obj.animation_data.nla_tracks ] use_nla_tracks = bool(nla_tracks) # For blends without NLA tracks, use the actions referenced by the fighter # manifest instead of sampling every source action. if not use_nla_tracks and actions_to_keep: from io_scene_gltf2 import GLTF2_filter_action if not hasattr(bpy.types.Scene, "gltf_action_filter"): bpy.types.Scene.gltf_action_filter = bpy.props.CollectionProperty( type=GLTF2_filter_action ) scene = bpy.context.scene scene.gltf_action_filter.clear() for action in bpy.data.actions: item = scene.gltf_action_filter.add() item.action = action item.keep = action.name in actions_to_keep bpy.ops.export_scene.gltf( filepath=output, export_format="GLTF_SEPARATE", export_keep_originals=True, export_extras=True, export_animations=True, export_skins=True, export_morph=True, export_yup=True, export_def_bones=True, export_action_filter=False, export_animation_mode="NLA_TRACKS" if use_nla_tracks else "ACTIONS", ) dependencies = [] for image in bpy.data.images: if image.source not in {"FILE", "TILED"}: continue path = image.filepath_raw or image.filepath if path and not image.packed_file: dependencies.append(bpy.path.abspath(path)) with open(os.path.join(os.path.dirname(output), "export-manifest.json"), "w") as file: json.dump({"dependencies": sorted(set(dependencies))}, file) if __name__ == "__main__": main()