55import numpy as np
66import pytest
77from mhfu .files import monster_pac
8- from mhfu_port import layout , manifest , travel , verify
8+ from mhfu_port import fk , layout , manifest , motion , travel , verify
99from mhfu_port .model import MHFU , MHP3RD , ModelError
1010from mhfu_studio .monster import inputs
1111from mhfu_studio .monster .core .scene import Scene , open_scene
@@ -89,7 +89,9 @@ def test_donor_matches_port(games, built, ports, name, joints, groups, vertices,
8989 src = Scene .from_manifest (m , side = "source" , data = games )
9090 port = Scene .from_bytes (built (name ), name , manifest = m )
9191 host = inputs .host_anim (m , games )
92- entry = layout .of (m , inputs .donor_clips (m , games ), host ).ids
92+ lay = layout .of (m , inputs .donor_clips (m , games ), host )
93+ played = layout .clips (lay , {c .slot : c .source for c in src .clips })
94+ tracks = {c .slot : c .joint_tracks for c in src .clips }
9395 assert src .game == MHP3RD and src .rig .n == joints and src .record_to_bone
9496 assert (
9597 (len (src .groups ), src .n_vertices )
@@ -109,24 +111,25 @@ def test_donor_matches_port(games, built, ports, name, joints, groups, vertices,
109111 s_idx = np .array (sorted (b for b , j in c .tree .items () if j not in (0 , root )))
110112 p_idx = np .array ([c .tree [i ] for i in s_idx ])
111113 worst , compared = 0.0 , 0
112- for clip in src . clips :
113- pc = port ._by_slot [entry [ clip . slot ] ]
114+ for e , clip in played . items () :
115+ pc = port ._by_slot [e ]
114116 assert pc .whole_rig
115117 turn = turn_of (port , pc )
116118 th = - turn .keys [0 ] / travel .TURN * math .tau if turn else 0.0
117119 face = np .array (
118120 [[math .cos (th ), 0 , - math .sin (th )], [0 , 1 , 0 ], [math .sin (th ), 0 , math .cos (th )]]
119121 )
120- for frame in (clip .frames // 4 , clip .frames // 2 ):
121- a = src .pose (clip , frame ).joints @ face
122+ want , n = fk .Curves (clip , src .rig , tracks [lay .entries [e ]]), motion .frames (clip )
123+ for frame in (n // 4 , n // 2 ):
124+ a = src .rig .world (* want .at (float (frame )))[:, :3 , 3 ] @ face
122125 b = pose_at (port , pc , frame ).joints
123126 lift = b [body , 1 ] - a [anchor , 1 ]
124127 off = (a [s_idx ] - a [anchor ]) - (b [p_idx ] - b [body ])
125128 worst = max (
126129 worst , float (np .linalg .norm (off , axis = 1 ).max ()), abs (lift - m .build .ground_lift )
127130 )
128131 compared += 1
129- assert compared == 2 * len (src . clips ) and worst < 0.2 , (compared , worst )
132+ assert compared == 2 * len (played ) and worst < 0.2 , (compared , worst )
130133
131134
132135def test_manifest_port (games , ports ):
0 commit comments