81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
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]
|
|
source_path = sys.argv[sys.argv.index("--") + 3]
|
|
loaded_path = os.path.realpath(bpy.data.filepath)
|
|
expected_path = os.path.realpath(source_path)
|
|
if loaded_path != expected_path:
|
|
raise RuntimeError(
|
|
f"Blender loaded {loaded_path!r} instead of {expected_path!r}"
|
|
)
|
|
if not bpy.data.objects or not bpy.data.meshes:
|
|
raise RuntimeError("Blender loaded an empty scene")
|
|
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()
|