"""Validate offline catalog timings against UE and play enum clips with automatic ends.""" import math from ue_workshop import Scene, Sequence, Renderer, camera, lighting from ue_workshop.animations import FighterAnimations, CreatureAnimations from ue_workshop.characters import FIGHTER_MODEL, CREATURE_MODEL from ue_workshop.skeletal import import_model for model, name, catalog in ((FIGHTER_MODEL, "Fighter", FighterAnimations), (CREATURE_MODEL, "Creature", CreatureAnimations)): imported = import_model(model, name=name, reimport=False) for clip in catalog: assert math.isclose(clip.seconds, imported.animations[clip.key].get_play_length(), rel_tol=0, abs_tol=0.000001), clip.key scene = Scene("CatalogSmoke") fighter = scene.skeletal_model(FIGHTER_MODEL, name="Fighter", rotation=(0, 0, 180)) scene.primitive("Cube", name="Floor", location=(0, 0, -10), scale=(20, 20, 0.2)) lighting.studio(scene) cam = camera.create(scene, location=(450, -550, 300), fov=45) shot = Sequence(scene, fps=24, frames=120) shot.camera(cam) draw = FighterAnimations.DRAW_A_GREAT_SWORD_1 attack = FighterAnimations.GREAT_SWORD_ATTACK first = shot.animation(fighter, draw, start=0) second_start = draw.frames(shot.fps) - 6 second = shot.animation(fighter, attack, start=second_start) fast = shot.animation(fighter, attack, start=60, speed=2) assert first.get_end_frame() == draw.frames(shot.fps) assert second.get_end_frame() == second_start + attack.frames(shot.fps) assert fast.get_end_frame() == 60 + attack.frames(shot.fps, speed=2) assert second.get_editor_property("params").animation.get_name() == attack.key shot.save(open_editor=False) renderer = Renderer(width=640, height=360, samples=1, warmup=0, mp4=False)