From 64b647881e5066ec58d197d904aefdc3adb2833a Mon Sep 17 00:00:00 2001 From: Lee-Orr Date: Fri, 22 Mar 2024 16:37:10 -0400 Subject: [PATCH] - avoid updating seek time from UI if source of seek time is studio, to avoid re-processing timeline info - move generating animation to first thing in a frame, and notifying about timeline changes to last, to ensure that it happens before the time updates - re-generate the animation tweens whenever you start playing or manually seek a new time in the timeline to prevent inconsistencies --- .../src/app/anim-editor.element.ts | 8 +++- studio/src/anim/timeline_animation.rs | 42 +++++++++---------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/studio-frontend/src/app/anim-editor.element.ts b/studio-frontend/src/app/anim-editor.element.ts index 77b9874..20fb679 100644 --- a/studio-frontend/src/app/anim-editor.element.ts +++ b/studio-frontend/src/app/anim-editor.element.ts @@ -45,6 +45,7 @@ implements TreeSelectionProvider { @state() clipEnd = 0; @state() playHead = 0; + @state() studioPlayTime = 0; @state() playing = false; @state() tracks : Record = {}; @@ -64,7 +65,7 @@ implements TreeSelectionProvider { } protected override update(changes: PropertyValues): void { - if (changes.has("playHead")) + if (changes.has("playHead") && Math.abs(this.studioPlayTime - this.playHead) > 0.0001) studio.seekTime(this.playHead); if (changes.has("selectedTrack")) { @@ -81,10 +82,15 @@ implements TreeSelectionProvider { super.update(changes); } + setPlayTime(time: number) : void { + studio.seekTime(time); + } + @on("window:seek-time-changed") onSeekTimeChanged({ detail: {time, playing} }: SeekTimeChanged ): void { console.log("Seek Time Changed", time, playing); this.playHead = time; + this.studioPlayTime = time; this.playing = playing; if (this.playHead < this.timelineStart) { diff --git a/studio/src/anim/timeline_animation.rs b/studio/src/anim/timeline_animation.rs index a64e0fd..dac6637 100644 --- a/studio/src/anim/timeline_animation.rs +++ b/studio/src/anim/timeline_animation.rs @@ -2,7 +2,7 @@ use std::{str::FromStr, time::Duration}; use bevy::{ prelude::*, - utils::{hashbrown::HashMap, HashSet}, + utils::{hashbrown::HashMap}, }; use bevy_tweening::{ @@ -44,6 +44,7 @@ impl Plugin for TimelinePlugin { }) .add_event::(); + app.add_systems(First, generate_transform_animation); app.add_systems(PreUpdate, (process_timeline_events, update_tick).chain()); app.add_systems( @@ -54,12 +55,12 @@ impl Plugin for TimelinePlugin { ), ); - app.add_systems(PostUpdate, generate_transform_animation); + // app.add_systems(PostUpdate, generate_transform_animation); #[cfg(feature = "wasm")] { app.add_systems( - First, + Last, ( wasm::update_global_seek_time, wasm::update_keyframe_interaction, @@ -347,37 +348,33 @@ fn process_keyframe_events( fn generate_transform_animation( mut commands: Commands, - changed: Query< - &Keyframe, - ( - With, - Or<(Changed, Changed)>, - ), - >, keyframes: Query< (&Keyframe, &Transform, &TransformKeyframe, Entity), Without, >, - added_targets: Query<(Entity, &AnimationTarget), Added>, valid_targets: Query<(Entity, &AnimationTarget)>, - removed: Query<&Keyframe, With>, + mut e_timeline_event: EventReader ) { + let mut playing = false; + for e in e_timeline_event.read() { + if matches!(e,TimelineInteractionEvent::Play | TimelineInteractionEvent::Seek(_)) { + + playing = true; + continue; + } + } + if !playing { + + return; + } + let available_targets = valid_targets .iter() .map(|(e, a)| (*a, e)) .collect::>(); - let changed_targets = changed - .iter() - .map(|keyframe| keyframe.target) - .chain(removed.iter().map(|keyframe| { - info!("Processing a removed keyframe {keyframe:?}"); - keyframe.target - })) - .chain(added_targets.iter().map(|(_, a)| *a)) - .collect::>(); + let keyframes = keyframes .iter() - .filter(|(keyframe, _, _, _)| changed_targets.contains(&keyframe.target)) .group_by(|(keyframe, _, _, _)| keyframe.target); for (target, keyframes) in &keyframes { @@ -635,6 +632,7 @@ mod wasm { mut e_timeline_event: EventWriter, ) { if let Some(timestamp) = SEEK_TIME.take_message() { + info!("Updating Seek Time {timestamp:?}"); e_timeline_event.send(timestamp); } }