import hashlib import json import pathlib import sys import bpy def strip_summary(strip): return { "id": strip.name, "action": strip.action.name if strip.action is not None else None, "frameStart": strip.frame_start, "frameEnd": strip.frame_end, "actionFrameStart": strip.action_frame_start, "actionFrameEnd": strip.action_frame_end, "scale": strip.scale, "repeat": strip.repeat, "blendIn": strip.blend_in, "blendOut": strip.blend_out, "influence": strip.influence, "blendMode": strip.blend_type, "extrapolation": strip.extrapolation, "muted": strip.mute, "reverse": strip.use_reverse, } def main(blend_path: str, output_path: str) -> None: blend = pathlib.Path(blend_path).resolve() bpy.ops.wm.open_mainfile(filepath=str(blend), load_ui=False) scene = bpy.context.scene object_name = "M10_NLA_TimeMapping" obj = bpy.data.objects.get(object_name) if obj is None or obj.animation_data is None: raise RuntimeError("M10 NLA fixture object or AnimData is missing") frames = [1, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70] samples = [] for frame in frames: scene.frame_set(frame) depsgraph = bpy.context.evaluated_depsgraph_get() evaluated = obj.evaluated_get(depsgraph) samples.append({ "frame": frame, "worldMatrix": [value for row in evaluated.matrix_world for value in row], }) tracks = [] for track in obj.animation_data.nla_tracks: tracks.append({ "name": track.name, "muted": track.mute, "solo": track.is_solo, "strips": [strip_summary(strip) for strip in track.strips], }) result = { "schemaVersion": 1, "fixture": f"tests/files/web/{blend.name}", "fixtureSha256": hashlib.sha256(blend.read_bytes()).hexdigest(), "blenderVersion": bpy.app.version_string, "object": object_name, "mesh": obj.data.name, "tracks": tracks, "frames": samples, "tolerance": {"maxMatrixError": 1e-5}, } pathlib.Path(output_path).write_text(json.dumps(result, indent=2) + "\n", encoding="utf-8") if __name__ == "__main__": if "--" not in sys.argv or len(sys.argv) <= sys.argv.index("--") + 2: raise SystemExit("usage: blender -b --python generate-nla-evaluation-golden.py -- input.blend output.json") arguments = sys.argv[sys.argv.index("--") + 1:] main(arguments[0], arguments[1])