Files
PythonInUnreal/tests/test_root_motion.py
T
2026-10-31 23:11:57 +01:00

47 lines
2.1 KiB
Python

"""Horizontal root travel, interpolation and accumulated playback loops."""
import importlib.util
from pathlib import Path
import sys
from types import SimpleNamespace
import unittest
from unittest.mock import MagicMock, patch
class Vector:
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
class RootMotionTests(unittest.TestCase):
def setUp(self):
unreal = MagicMock()
unreal.Vector = Vector
path = Path(__file__).resolve().parents[1] / "Content/Python/ue_workshop/root_motion.py"
spec = importlib.util.spec_from_file_location("ue_workshop._root_motion_test", path)
self.module = importlib.util.module_from_spec(spec)
with patch.dict(sys.modules, {"unreal": unreal}):
spec.loader.exec_module(self.module)
self.poses = [SimpleNamespace(translation=Vector(0, 0, 100)),
SimpleNamespace(translation=Vector(0, 50, 110)),
SimpleNamespace(translation=Vector(0, 100, 100))]
def test_horizontal_interpolation_keeps_vertical_motion_in_clip(self):
value = self.module.displacement(self.poses, 2.0, 0.5)
self.assertEqual((value.x, value.y, value.z), (0, 25, 0))
def test_end_and_repeated_playback_accumulate_instead_of_reset(self):
self.assertEqual(self.module.displacement(self.poses, 2.0, 2).y, 100)
self.assertEqual(self.module.displacement(self.poses, 2.0, 5).y, 250)
def test_before_start_has_no_displacement(self):
self.assertEqual(self.module.displacement(self.poses, 2.0, -1).y, 0)
def test_reverse_accumulates_backwards_without_initial_jump(self):
self.assertEqual(self.module.displacement(self.poses, 2.0, 0, reverse=True).y, 0)
self.assertEqual(self.module.displacement(self.poses, 2.0, 1, reverse=True).y, -50)
self.assertEqual(self.module.displacement(self.poses, 2.0, 5, reverse=True).y, -250)
def test_reverse_samples_the_end_of_a_nonuniform_trajectory(self):
self.poses[1].translation.y = 20
self.assertEqual(self.module.displacement(self.poses, 2.0, 0.5, reverse=True).y, -40)