From dd5cd812f0424c5541088cd37b552b39517397bf Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 9 May 2024 13:39:37 +0800 Subject: [PATCH] add option to wait for animation to complete --- .../dart_filament/filament_viewer_impl.dart | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/dart_filament/lib/dart_filament/filament_viewer_impl.dart b/dart_filament/lib/dart_filament/filament_viewer_impl.dart index 44555b0a..96c7f0e9 100644 --- a/dart_filament/lib/dart_filament/filament_viewer_impl.dart +++ b/dart_filament/lib/dart_filament/filament_viewer_impl.dart @@ -138,7 +138,7 @@ class FilamentViewer extends AbstractFilamentViewer { @override Future setFrameRate(int framerate) async { final interval = 1000.0 / framerate; - set_frame_interval_ffi(interval); + set_frame_interval_ffi(_viewer!, interval); } @override @@ -494,6 +494,17 @@ class FilamentViewer extends AbstractFilamentViewer { return duration; } + @override + Future getAnimationDurationByName( + FilamentEntity entity, String name) async { + var animations = await getAnimationNames(entity); + var index = animations.indexOf(name); + if (index == -1) { + throw Exception("Failed to find animation $name"); + } + return getAnimationDuration(entity, index); + } + @override Future setMorphAnimationData( FilamentEntity entity, MorphAnimationData animation, @@ -523,7 +534,7 @@ class FilamentViewer extends AbstractFilamentViewer { if (intersection.isEmpty) { throw Exception( - "No morph targets specified in animation are present on targeted mesh"); + "No morph targets specified in animation are present on mesh $meshName. If you weren't intending to animate every mesh, specify [targetMeshNames] when invoking this method.\nAnimation morph targets: ${animation.morphTargets}\nMesh morph targets ${meshMorphTargets}"); } var indices = @@ -675,13 +686,20 @@ class FilamentViewer extends AbstractFilamentViewer { {bool loop = false, bool reverse = false, bool replaceActive = true, - double crossfade = 0.0}) async { + double crossfade = 0.0, + bool wait = false}) async { var animations = await getAnimationNames(entity); - await playAnimation(entity, animations.indexOf(name), + var index = animations.indexOf(name); + var duration = await getAnimationDuration(entity, index); + print("Duration for $name : $duration"); + await playAnimation(entity, index, loop: loop, reverse: reverse, replaceActive: replaceActive, crossfade: crossfade); + if (wait) { + await Future.delayed(Duration(milliseconds: (duration * 1000).toInt())); + } } @override