3D / voxel unit tests

This commit is contained in:
John McCardle 2026-02-06 16:15:07 -05:00
commit 71cd2b9b41
22 changed files with 4705 additions and 0 deletions

View file

@ -0,0 +1,98 @@
# 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)