From 06fa4164478110d6380a4822a8fd7c0abf1b6127 Mon Sep 17 00:00:00 2001 From: "Elijah C. Voigt" Date: Wed, 13 Mar 2024 20:42:37 -0700 Subject: [PATCH] Model replacement kinda sorta works -- ship it! --- src/display3d.rs | 168 ++++++++++++++++++++++++++++------------------- 1 file changed, 102 insertions(+), 66 deletions(-) diff --git a/src/display3d.rs b/src/display3d.rs index e760ff5..cf27c04 100644 --- a/src/display3d.rs +++ b/src/display3d.rs @@ -36,7 +36,8 @@ impl Plugin for Display3dPlugin { any_component_changed::() .or_else(any_component_changed::()) .or_else(any_component_changed::()) - ) + .or_else(any_component_removed::()), + ), ), set_board_model.run_if(any_component_added::()), set_valid_move_model.run_if(any_component_added::()), @@ -52,6 +53,7 @@ impl Plugin for Display3dPlugin { skip_animation .run_if(just_pressed(KeyCode::Enter).or_else(just_pressed(MouseButton::Left))) .run_if(in_state(GameState::Play)), + monitor_animations.run_if(in_state(GameState::Play)), ), ) .add_systems( @@ -369,15 +371,8 @@ fn fix_skybox( } } - fn set_board_model( - mut boards: Query< - &mut Handle, - ( - Added, - With, - ), - >, + mut boards: Query<&mut Handle, (Added, With)>, gltfs: Res>, tweaks: Res>, tweaks_file: Res, @@ -484,7 +479,16 @@ fn mouse_zoom( // The dumbest way to achieve this goal // Essentially we iterate over every piece and set the appropriate model and texture fn update_pieces( - mut query: Query<(Entity, &Piece, &Side, &BoardIndex, &mut Transform, &mut Handle, &AnimationPlayer)>, + mut query: Query<( + Entity, + &Piece, + &Side, + &BoardIndex, + &mut Transform, + &mut Handle, + )>, + children: Query<&Children>, + active_animation_players: Query<&AnimationPlayer, With>, gltfs: Res>, tweaks: Res>, tweaks_file: Res, @@ -497,50 +501,46 @@ fn update_pieces( .unwrap(); let models = gltfs.get(assets_handle).unwrap(); - query.iter_mut().for_each(|(entity, piece, side, board_index, mut transform, mut scene, animation_player)| { - - // Set position of piece - let new_translation = board_translation(board_index); - if transform.translation != new_translation { - info!("Updating piece transform"); - transform.translation = new_translation; - } - - if animation_player.is_finished() { - info!("Updating piece object scene"); + query.iter_mut().for_each( + |(entity, piece, side, board_index, mut transform, mut scene)| { + // Set position of piece + let new_translation = board_translation(board_index); + if transform.translation != new_translation { + info!("Updating piece transform"); + transform.translation = new_translation; + } - // Find name of this piece's model scene - let scene_tweak_name: Option = match (piece, side) { - (Piece::Pawn, Side::A) => { - tweak.get("display3d_models_scenes_pawn_red") - }, - (Piece::Pawn, Side::B) => { - tweak.get("display3d_models_scenes_pawn_blue") + // Check if any children are animating + let animating = active_animation_players + .iter_many(children.iter_descendants(entity)) + .count(); + + if animating > 0 { + debug!("Piece {:?} is animating. Skipping...", entity); + } else { + debug!("Checking piece object scene for {:?}", entity); + + // Find name of this piece's model scene + let scene_tweak_name: Option = match (piece, side) { + (Piece::Pawn, Side::A) => tweak.get("display3d_models_scenes_pawn_red"), + (Piece::Pawn, Side::B) => tweak.get("display3d_models_scenes_pawn_blue"), + (Piece::Drone, Side::A) => tweak.get("display3d_models_scenes_drone_red"), + (Piece::Drone, Side::B) => tweak.get("display3d_models_scenes_drone_blue"), + (Piece::Queen, Side::A) => tweak.get("display3d_models_scenes_queen_red"), + (Piece::Queen, Side::B) => tweak.get("display3d_models_scenes_queen_blue"), + }; + + // Get model scene for this piece + let scene_handle = models.named_scenes.get(&scene_tweak_name.unwrap()).unwrap(); + + // Set scene model for this piece + if *scene != *scene_handle { + warn!("Updating scene for piece {:?}", entity); + *scene = scene_handle.clone(); } - (Piece::Drone, Side::A) => { - tweak.get("display3d_models_scenes_drone_red") - }, - (Piece::Drone, Side::B) => { - tweak.get("display3d_models_scenes_drone_blue") - } - (Piece::Queen, Side::A) => { - tweak.get("display3d_models_scenes_queen_red") - }, - (Piece::Queen, Side::B) => { - tweak.get("display3d_models_scenes_queen_blue") - } - }; - - // Get model scene for this piece - let scene_handle = models.named_scenes.get(&scene_tweak_name.unwrap()).unwrap(); - - // Set scene model for this piece - if *scene != *scene_handle { - warn!("Updating scene for piece {:?}", entity); - *scene = scene_handle.clone(); } - } - }); + }, + ); } /// Select tiles and pieces in 3d @@ -694,8 +694,12 @@ fn pick_up( info!(" Child: {:?}", child); if let Ok((name, mut player)) = players.get_mut(child) { info!("Picking up {:?} ({:?}) {:?}", name, entity, piece); - let pickup_animation = - format!("display3d_models_animations_pick_up_{:?}_{}", piece, side.color_str()).to_ascii_lowercase(); + let pickup_animation = format!( + "display3d_models_animations_pick_up_{:?}_{}", + piece, + side.color_str() + ) + .to_ascii_lowercase(); let pickup_handle = gltf .named_animations .get( @@ -705,8 +709,12 @@ fn pick_up( .as_str(), ) .expect("Pickup Animation"); - let idle_animation = - format!("display3d_models_animations_idle_{:?}_{}", piece, side.color_str()).to_ascii_lowercase(); + let idle_animation = format!( + "display3d_models_animations_idle_{:?}_{}", + piece, + side.color_str() + ) + .to_ascii_lowercase(); let idle_handle = gltf .named_animations .get( @@ -739,7 +747,10 @@ fn pick_up( fn put_down( mut events: RemovedComponents, - mut query: Query<(&game::Piece, &game::Side), (With, With, With)>, + mut query: Query< + (&game::Piece, &game::Side), + (With, With, With), + >, gltfs: Res>, children: Query<&Children>, mut players: Query<(&Name, &mut AnimationPlayer)>, @@ -761,9 +772,12 @@ fn put_down( children.iter_descendants(entity).for_each(|child| { if let Ok((name, mut player)) = players.get_mut(child) { info!("Putting down {:?}", entity); - let putdown_animation = - format!("display3d_models_animations_put_down_{:?}_{}", piece, side.color_str()) - .to_ascii_lowercase(); + let putdown_animation = format!( + "display3d_models_animations_put_down_{:?}_{}", + piece, + side.color_str() + ) + .to_ascii_lowercase(); let putdown_handle = gltf .named_animations .get( @@ -775,7 +789,7 @@ fn put_down( .expect("PutDown Animation"); if let Some(putdown_clip) = clips.get(putdown_handle) { if putdown_clip.compatible_with(name) { - info!("Compatible with both clips!"); + info!("Compatible with put-down clip!"); player .start_with_transition( putdown_handle.clone(), @@ -814,9 +828,8 @@ fn skip_animation( time: Res