98 lines
3.4 KiB
Python
98 lines
3.4 KiB
Python
|
|
# animated_model_test.py - Test loading actual animated glTF models
|
||
|
|
# Tests skeleton and animation data loading from real files
|
||
|
|
|
||
|
|
import mcrfpy
|
||
|
|
import sys
|
||
|
|
import os
|
||
|
|
|
||
|
|
def test_rigged_simple():
|
||
|
|
"""Test loading RiggedSimple - a cylinder with 2 bones"""
|
||
|
|
print("Loading RiggedSimple.glb...")
|
||
|
|
model = mcrfpy.Model3D("../assets/models/RiggedSimple.glb")
|
||
|
|
|
||
|
|
print(f" has_skeleton: {model.has_skeleton}")
|
||
|
|
print(f" bone_count: {model.bone_count}")
|
||
|
|
print(f" animation_clips: {model.animation_clips}")
|
||
|
|
print(f" vertex_count: {model.vertex_count}")
|
||
|
|
print(f" triangle_count: {model.triangle_count}")
|
||
|
|
print(f" mesh_count: {model.mesh_count}")
|
||
|
|
|
||
|
|
assert model.has_skeleton == True, f"Expected has_skeleton=True, got {model.has_skeleton}"
|
||
|
|
assert model.bone_count > 0, f"Expected bone_count > 0, got {model.bone_count}"
|
||
|
|
assert len(model.animation_clips) > 0, f"Expected animation clips, got {model.animation_clips}"
|
||
|
|
|
||
|
|
print("[PASS] test_rigged_simple")
|
||
|
|
|
||
|
|
def test_cesium_man():
|
||
|
|
"""Test loading CesiumMan - animated humanoid figure"""
|
||
|
|
print("Loading CesiumMan.glb...")
|
||
|
|
model = mcrfpy.Model3D("../assets/models/CesiumMan.glb")
|
||
|
|
|
||
|
|
print(f" has_skeleton: {model.has_skeleton}")
|
||
|
|
print(f" bone_count: {model.bone_count}")
|
||
|
|
print(f" animation_clips: {model.animation_clips}")
|
||
|
|
print(f" vertex_count: {model.vertex_count}")
|
||
|
|
print(f" triangle_count: {model.triangle_count}")
|
||
|
|
print(f" mesh_count: {model.mesh_count}")
|
||
|
|
|
||
|
|
assert model.has_skeleton == True, f"Expected has_skeleton=True, got {model.has_skeleton}"
|
||
|
|
assert model.bone_count > 0, f"Expected bone_count > 0, got {model.bone_count}"
|
||
|
|
assert len(model.animation_clips) > 0, f"Expected animation clips, got {model.animation_clips}"
|
||
|
|
|
||
|
|
print("[PASS] test_cesium_man")
|
||
|
|
|
||
|
|
def test_entity_with_animated_model():
|
||
|
|
"""Test Entity3D with an animated model attached"""
|
||
|
|
print("Testing Entity3D with animated model...")
|
||
|
|
|
||
|
|
model = mcrfpy.Model3D("../assets/models/RiggedSimple.glb")
|
||
|
|
entity = mcrfpy.Entity3D()
|
||
|
|
entity.model = model
|
||
|
|
|
||
|
|
# Check animation clips are available
|
||
|
|
clips = model.animation_clips
|
||
|
|
print(f" Available clips: {clips}")
|
||
|
|
|
||
|
|
if clips:
|
||
|
|
# Set animation clip
|
||
|
|
entity.anim_clip = clips[0]
|
||
|
|
assert entity.anim_clip == clips[0], f"Expected clip '{clips[0]}', got '{entity.anim_clip}'"
|
||
|
|
|
||
|
|
# Test animation time progression
|
||
|
|
entity.anim_time = 0.5
|
||
|
|
assert abs(entity.anim_time - 0.5) < 0.001, f"Expected anim_time~=0.5, got {entity.anim_time}"
|
||
|
|
|
||
|
|
# Test speed
|
||
|
|
entity.anim_speed = 2.0
|
||
|
|
assert abs(entity.anim_speed - 2.0) < 0.001, f"Expected anim_speed~=2.0, got {entity.anim_speed}"
|
||
|
|
|
||
|
|
print("[PASS] test_entity_with_animated_model")
|
||
|
|
|
||
|
|
def run_all_tests():
|
||
|
|
"""Run all animated model tests"""
|
||
|
|
tests = [
|
||
|
|
test_rigged_simple,
|
||
|
|
test_cesium_man,
|
||
|
|
test_entity_with_animated_model,
|
||
|
|
]
|
||
|
|
|
||
|
|
passed = 0
|
||
|
|
failed = 0
|
||
|
|
|
||
|
|
for test in tests:
|
||
|
|
try:
|
||
|
|
test()
|
||
|
|
passed += 1
|
||
|
|
except AssertionError as e:
|
||
|
|
print(f"[FAIL] {test.__name__}: {e}")
|
||
|
|
failed += 1
|
||
|
|
except Exception as e:
|
||
|
|
print(f"[ERROR] {test.__name__}: {e}")
|
||
|
|
failed += 1
|
||
|
|
|
||
|
|
print(f"\n=== Results: {passed} passed, {failed} failed ===")
|
||
|
|
return failed == 0
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
success = run_all_tests()
|
||
|
|
sys.exit(0 if success else 1)
|