mirror of
https://github.com/kaosat-dev/Blender_bevy_components_workflow.git
synced 2024-11-22 11:50:53 +00:00
refactor(): cleanups
This commit is contained in:
parent
0998decb39
commit
1cf47d36b1
@ -48,7 +48,7 @@ pub struct AnimationInfos {
|
|||||||
pub animations: Vec<AnimationInfo>,
|
pub animations: Vec<AnimationInfo>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive( Reflect, Default, Debug)]
|
#[derive(Reflect, Default, Debug)]
|
||||||
pub struct AnimationMarker {
|
pub struct AnimationMarker {
|
||||||
// pub frame: u32,
|
// pub frame: u32,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
@ -71,7 +71,6 @@ pub struct AnimationMarkerReached {
|
|||||||
pub marker_name: String,
|
pub marker_name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/////////////////////
|
/////////////////////
|
||||||
|
|
||||||
/// triggers events when a given animation marker is reached for INSTANCE animations
|
/// triggers events when a given animation marker is reached for INSTANCE animations
|
||||||
@ -129,7 +128,6 @@ pub fn trigger_instance_animation_markers_events(
|
|||||||
// emit an event AnimationMarkerReached(entity, animation_name, frame, marker_name)
|
// emit an event AnimationMarkerReached(entity, animation_name, frame, marker_name)
|
||||||
// FIXME: problem, this can fire multiple times in a row, depending on animation length , speed , etc
|
// FIXME: problem, this can fire multiple times in a row, depending on animation length , speed , etc
|
||||||
for marker in matching_markers_per_frame {
|
for marker in matching_markers_per_frame {
|
||||||
|
|
||||||
animation_marker_events.send(AnimationMarkerReached {
|
animation_marker_events.send(AnimationMarkerReached {
|
||||||
entity: entity,
|
entity: entity,
|
||||||
animation_name: animation_name.clone(),
|
animation_name: animation_name.clone(),
|
||||||
@ -145,11 +143,7 @@ pub fn trigger_instance_animation_markers_events(
|
|||||||
|
|
||||||
/// triggers events when a given animation marker is reached for BLUEPRINT animations
|
/// triggers events when a given animation marker is reached for BLUEPRINT animations
|
||||||
pub fn trigger_blueprint_animation_markers_events(
|
pub fn trigger_blueprint_animation_markers_events(
|
||||||
animation_infos: Query<(
|
animation_infos: Query<(Entity, &BlueprintAnimationPlayerLink, &BlueprintAnimations)>,
|
||||||
Entity,
|
|
||||||
&BlueprintAnimationPlayerLink,
|
|
||||||
&BlueprintAnimations,
|
|
||||||
)>,
|
|
||||||
// FIXME: annoying hiearchy issue yet again: the Markers & AnimationInfos are stored INSIDE the blueprint, so we need to access them differently
|
// FIXME: annoying hiearchy issue yet again: the Markers & AnimationInfos are stored INSIDE the blueprint, so we need to access them differently
|
||||||
all_animation_infos: Query<(Entity, &AnimationMarkers, &AnimationInfos, &Parent)>,
|
all_animation_infos: Query<(Entity, &AnimationMarkers, &AnimationInfos, &Parent)>,
|
||||||
animation_players: Query<&AnimationPlayer>,
|
animation_players: Query<&AnimationPlayer>,
|
||||||
@ -161,20 +155,20 @@ pub fn trigger_blueprint_animation_markers_events(
|
|||||||
let animation_clip = animation_clips.get(animation_player.animation_clip());
|
let animation_clip = animation_clips.get(animation_player.animation_clip());
|
||||||
|
|
||||||
// FIXME: horrible code
|
// FIXME: horrible code
|
||||||
for (_, markers, animation_infos, parent) in all_animation_infos.iter(){
|
for (_, markers, animation_infos, parent) in all_animation_infos.iter() {
|
||||||
if parent.get() == entity {
|
if parent.get() == entity {
|
||||||
if animation_clip.is_some() {
|
if animation_clip.is_some() {
|
||||||
|
|
||||||
// println!("Entity {:?} markers {:?}", entity, markers);
|
// println!("Entity {:?} markers {:?}", entity, markers);
|
||||||
// println!("Player {:?} {}", animation_player.elapsed(), animation_player.completions());
|
// println!("Player {:?} {}", animation_player.elapsed(), animation_player.completions());
|
||||||
// FIMXE: yikes ! very inneficient ! perhaps add boilerplate to the "start playing animation" code so we know what is playing
|
// FIMXE: yikes ! very inneficient ! perhaps add boilerplate to the "start playing animation" code so we know what is playing
|
||||||
let animation_name = animations.named_animations.iter().find_map(|(key, value)| {
|
let animation_name =
|
||||||
if value == animation_player.animation_clip() {
|
animations.named_animations.iter().find_map(|(key, value)| {
|
||||||
Some(key)
|
if value == animation_player.animation_clip() {
|
||||||
} else {
|
Some(key)
|
||||||
None
|
} else {
|
||||||
}
|
None
|
||||||
});
|
}
|
||||||
|
});
|
||||||
if animation_name.is_some() {
|
if animation_name.is_some() {
|
||||||
let animation_name = animation_name.unwrap();
|
let animation_name = animation_name.unwrap();
|
||||||
let animation_length_seconds = animation_clip.unwrap().duration();
|
let animation_length_seconds = animation_clip.unwrap().duration();
|
||||||
@ -187,23 +181,23 @@ pub fn trigger_blueprint_animation_markers_events(
|
|||||||
// TODO: we also need to take playback speed into account
|
// TODO: we also need to take playback speed into account
|
||||||
let time_in_animation = animation_player.elapsed()
|
let time_in_animation = animation_player.elapsed()
|
||||||
- (animation_player.completions() as f32) * animation_length_seconds;
|
- (animation_player.completions() as f32) * animation_length_seconds;
|
||||||
let frame_seconds =
|
let frame_seconds = (animation_length_frames / animation_length_seconds)
|
||||||
(animation_length_frames / animation_length_seconds) * time_in_animation;
|
* time_in_animation;
|
||||||
// println!("frame seconds {}", frame_seconds);
|
// println!("frame seconds {}", frame_seconds);
|
||||||
let frame = frame_seconds.ceil() as u32; // FIXME , bad hack
|
let frame = frame_seconds.ceil() as u32; // FIXME , bad hack
|
||||||
|
|
||||||
let matching_animation_marker = &markers.0[animation_name];
|
let matching_animation_marker = &markers.0[animation_name];
|
||||||
|
|
||||||
|
|
||||||
if matching_animation_marker.contains_key(&frame) {
|
if matching_animation_marker.contains_key(&frame) {
|
||||||
let matching_markers_per_frame = matching_animation_marker.get(&frame).unwrap();
|
let matching_markers_per_frame =
|
||||||
|
matching_animation_marker.get(&frame).unwrap();
|
||||||
// println!("FOUND A MARKER {:?} at frame {}", matching_markers_per_frame, frame);
|
// println!("FOUND A MARKER {:?} at frame {}", matching_markers_per_frame, frame);
|
||||||
// emit an event AnimationMarkerReached(entity, animation_name, frame, marker_name)
|
// emit an event AnimationMarkerReached(entity, animation_name, frame, marker_name)
|
||||||
// FIXME: complete hack-ish solution , otherwise this can fire multiple times in a row, depending on animation length , speed , etc
|
// FIXME: complete hack-ish solution , otherwise this can fire multiple times in a row, depending on animation length , speed , etc
|
||||||
let diff = frame as f32 - frame_seconds;
|
let diff = frame as f32 - frame_seconds;
|
||||||
if diff < 0.03 {
|
println!("diff {}", diff);
|
||||||
|
if diff < 0.1 {
|
||||||
for marker in matching_markers_per_frame {
|
for marker in matching_markers_per_frame {
|
||||||
|
|
||||||
animation_marker_events.send(AnimationMarkerReached {
|
animation_marker_events.send(AnimationMarkerReached {
|
||||||
entity: entity,
|
entity: entity,
|
||||||
animation_name: animation_name.clone(),
|
animation_name: animation_name.clone(),
|
||||||
@ -212,16 +206,12 @@ pub fn trigger_blueprint_animation_markers_events(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,6 @@ impl Plugin for BlueprintsPlugin {
|
|||||||
.register_type::<BlueprintName>()
|
.register_type::<BlueprintName>()
|
||||||
.register_type::<MaterialInfo>()
|
.register_type::<MaterialInfo>()
|
||||||
.register_type::<SpawnHere>()
|
.register_type::<SpawnHere>()
|
||||||
|
|
||||||
.register_type::<BlueprintAnimations>()
|
.register_type::<BlueprintAnimations>()
|
||||||
.register_type::<InstanceAnimations>()
|
.register_type::<InstanceAnimations>()
|
||||||
.register_type::<AnimationInfo>()
|
.register_type::<AnimationInfo>()
|
||||||
@ -128,9 +127,7 @@ impl Plugin for BlueprintsPlugin {
|
|||||||
.register_type::<AnimationMarkers>()
|
.register_type::<AnimationMarkers>()
|
||||||
.register_type::<HashMap<u32, Vec<String>>>()
|
.register_type::<HashMap<u32, Vec<String>>>()
|
||||||
.register_type::<HashMap<String, HashMap<u32, Vec<String>>>>()
|
.register_type::<HashMap<String, HashMap<u32, Vec<String>>>>()
|
||||||
|
|
||||||
.add_event::<AnimationMarkerReached>()
|
.add_event::<AnimationMarkerReached>()
|
||||||
|
|
||||||
.register_type::<BlueprintsList>()
|
.register_type::<BlueprintsList>()
|
||||||
.register_type::<HashMap<String, Vec<String>>>()
|
.register_type::<HashMap<String, Vec<String>>>()
|
||||||
.insert_resource(BluePrintsConfig {
|
.insert_resource(BluePrintsConfig {
|
||||||
@ -181,10 +178,12 @@ impl Plugin for BlueprintsPlugin {
|
|||||||
.chain()
|
.chain()
|
||||||
.in_set(GltfBlueprintsSet::AfterSpawn),
|
.in_set(GltfBlueprintsSet::AfterSpawn),
|
||||||
)
|
)
|
||||||
|
.add_systems(
|
||||||
|
Update,
|
||||||
.add_systems(Update, (trigger_instance_animation_markers_events, trigger_blueprint_animation_markers_events))
|
(
|
||||||
|
trigger_instance_animation_markers_events,
|
||||||
;
|
trigger_blueprint_animation_markers_events,
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 644 KiB |
@ -1,8 +1,7 @@
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use bevy_gltf_blueprints::{
|
use bevy_gltf_blueprints::{
|
||||||
AnimationInfos, AnimationMarkerReached,
|
AnimationInfos, AnimationMarkerReached, BlueprintAnimationPlayerLink, BlueprintAnimations,
|
||||||
BlueprintAnimationPlayerLink, BlueprintAnimations,
|
|
||||||
InstanceAnimationPlayerLink, InstanceAnimations,
|
InstanceAnimationPlayerLink, InstanceAnimations,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -37,7 +36,7 @@ pub fn setup_main_scene_animations(asset_server: Res<AssetServer>, mut commands:
|
|||||||
|
|
||||||
pub fn animations(
|
pub fn animations(
|
||||||
added_animation_players: Query<(Entity, &Name, &AnimationPlayer)>,
|
added_animation_players: Query<(Entity, &Name, &AnimationPlayer)>,
|
||||||
added_animation_infos: Query<(Entity, &Name, &AnimationInfos), (Added<AnimationInfos>)>,
|
added_animation_infos: Query<(Entity, &Name, &AnimationInfos), Added<AnimationInfos>>,
|
||||||
animtest: Res<AnimTest>,
|
animtest: Res<AnimTest>,
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
assets_gltf: Res<Assets<Gltf>>,
|
assets_gltf: Res<Assets<Gltf>>,
|
||||||
@ -95,10 +94,7 @@ pub fn play_animations(
|
|||||||
(With<AnimationInfos>, With<Marker3>),
|
(With<AnimationInfos>, With<Marker3>),
|
||||||
>,
|
>,
|
||||||
|
|
||||||
animated_fox: Query<
|
animated_fox: Query<(&BlueprintAnimationPlayerLink, &BlueprintAnimations), With<MarkerFox>>,
|
||||||
(&BlueprintAnimationPlayerLink, &BlueprintAnimations),
|
|
||||||
(With<MarkerFox>),
|
|
||||||
>,
|
|
||||||
|
|
||||||
mut animation_players: Query<&mut AnimationPlayer>,
|
mut animation_players: Query<&mut AnimationPlayer>,
|
||||||
keycode: Res<ButtonInput<KeyCode>>,
|
keycode: Res<ButtonInput<KeyCode>>,
|
||||||
@ -229,7 +225,6 @@ pub fn play_animations(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn react_to_animation_markers(
|
pub fn react_to_animation_markers(
|
||||||
mut animation_marker_events: EventReader<AnimationMarkerReached>,
|
mut animation_marker_events: EventReader<AnimationMarkerReached>,
|
||||||
) {
|
) {
|
||||||
|
@ -6,17 +6,15 @@ pub use in_game::*;
|
|||||||
use std::{collections::HashMap, fs, time::Duration};
|
use std::{collections::HashMap, fs, time::Duration};
|
||||||
|
|
||||||
use bevy_gltf_blueprints::{
|
use bevy_gltf_blueprints::{
|
||||||
BlueprintAnimationPlayerLink, BlueprintAnimations, BlueprintName, BlueprintsList,
|
BlueprintAnimationPlayerLink, BlueprintName, BlueprintsList,
|
||||||
GltfBlueprintsSet, InstanceAnimationPlayerLink, InstanceAnimations,
|
GltfBlueprintsSet,
|
||||||
};
|
};
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
ecs::query, gltf::Gltf, prelude::*, render::view::screenshot::ScreenshotManager,
|
prelude::*, render::view::screenshot::ScreenshotManager, time::common_conditions::on_timer, window::PrimaryWindow
|
||||||
time::common_conditions::on_timer, window::PrimaryWindow,
|
|
||||||
};
|
};
|
||||||
use bevy_gltf_worlflow_examples_common_rapier::{AppState, GameState};
|
use bevy_gltf_worlflow_examples_common_rapier::{AppState, GameState};
|
||||||
|
|
||||||
use crate::{TupleTestF32, UnitTest};
|
|
||||||
use json_writer::to_json_string;
|
use json_writer::to_json_string;
|
||||||
|
|
||||||
fn start_game(mut next_app_state: ResMut<NextState<AppState>>) {
|
fn start_game(mut next_app_state: ResMut<NextState<AppState>>) {
|
||||||
@ -144,11 +142,11 @@ impl Plugin for GamePlugin {
|
|||||||
.add_systems(Update, play_animations)
|
.add_systems(Update, play_animations)
|
||||||
.add_systems(Update, react_to_animation_markers)
|
.add_systems(Update, react_to_animation_markers)
|
||||||
|
|
||||||
/* .add_systems(Update, generate_screenshot.run_if(on_timer(Duration::from_secs_f32(0.2)))) // TODO: run once
|
.add_systems(Update, generate_screenshot.run_if(on_timer(Duration::from_secs_f32(0.2)))) // TODO: run once
|
||||||
.add_systems(
|
.add_systems(
|
||||||
Update,
|
Update,
|
||||||
exit_game.run_if(on_timer(Duration::from_secs_f32(0.5))),
|
exit_game.run_if(on_timer(Duration::from_secs_f32(0.5))),
|
||||||
) // shut down the app after this time*/
|
) // shut down the app after this time
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
{"b_Tail02_013":["b_Tail03_014"],"Blueprint4_nested.001":["Blueprint3"],"Collection 2 1":["Empty_in_sub_collection"],"b_Root_00":["b_Hip_01"],"b_LeftForeArm_010":["b_LeftHand_011"],"b_Spine01_02":["b_Spine02_03"],"Blueprint7_hierarchy.001":["Blueprint4_nested.001","Cube.001"],"b_RightLeg01_019":["b_RightLeg02_020"],"b_LeftUpperArm_09":["b_LeftForeArm_010"],"no_name":["Parent_Object","lighting_components_World","assets_list_World_components","Collection","Collection 2"],"Blueprint3":["Blueprint3_mesh","Blueprint3_mesh"],"world":["no_name"],"Parent_Object":["Cube.003","Blueprint1","Cylinder.001"],"Light":["Light","DirectionalLight Gizmo"],"Blueprint1.001":["Blueprint1_mesh"],"Blueprint7_hierarchy":["Cube.001"],"Spot":["Spot"],"b_Hip_01":["b_Spine01_02","b_Tail01_012","b_LeftLeg01_015","b_RightLeg01_019"],"Cylinder":["Cylinder.001","Cylinder.001"],"Collection 2":["Collection 2 1","Empty_in_collection","Spot"],"b_RightForeArm_07":["b_RightHand_08"],"Blueprint3_mesh":["Cylinder","Cylinder"],"Blueprint4_nested":["Blueprint3"],"Fox_mesh":["fox1"],"b_LeftLeg01_015":["b_LeftLeg02_016"],"b_Neck_04":["b_Head_05"],"b_RightFoot01_021":["b_RightFoot02_022"],"Blueprint1_mesh":["Cube.001","Cube.001"],"b_Tail01_012":["b_Tail02_013"],"Fox":["Fox_mesh","_rootJoint"],"Collection":["Blueprint1.001","Blueprint4_nested","Blueprint6_animated","Blueprint7_hierarchy","Camera","Cube","Empty","Light","Plane"],"Cube":["Cube"],"_rootJoint":["b_Root_00"],"b_RightLeg02_020":["b_RightFoot01_021"],"b_RightUpperArm_06":["b_RightForeArm_07"],"Plane":["Plane"],"Camera":["Camera Gizmo"],"Blueprint6_animated":["Fox"],"b_Spine02_03":["b_Neck_04","b_RightUpperArm_06","b_LeftUpperArm_09"],"b_LeftLeg02_016":["b_LeftFoot01_017"],"b_LeftFoot01_017":["b_LeftFoot02_018"],"Cube.001":["Cube.002","Cylinder","Cube.002","Cylinder"],"Cylinder.001":["Cylinder.002","Blueprint7_hierarchy.001","Empty_as_child"],"Blueprint1":["Blueprint1_mesh"]}
|
{"Blueprint6_animated":["Fox"],"Collection 2 1":["Empty_in_sub_collection"],"Blueprint1.001":["Blueprint1_mesh"],"Blueprint3":["Blueprint3_mesh","Blueprint3_mesh"],"b_Spine02_03":["b_Neck_04","b_RightUpperArm_06","b_LeftUpperArm_09","b_Neck_04","b_RightUpperArm_06","b_LeftUpperArm_09"],"_rootJoint":["b_Root_00","b_Root_00"],"Cube.001":["Cube.002","Cylinder","Cube.002","Cylinder"],"b_Root_00":["b_Hip_01","b_Hip_01"],"Collection 2":["Blueprint8_animated_no_bones","Collection 2 1","Empty_in_collection","Spot"],"Blueprint6_animated.001":["Fox"],"Collection":["Blueprint1.001","Blueprint4_nested","Blueprint6_animated","Blueprint7_hierarchy","Camera","Cube","Empty","Light","Plane"],"Camera":["Camera Gizmo"],"Blueprint7_hierarchy.001":["Blueprint4_nested.001","Cube.001"],"b_Spine01_02":["b_Spine02_03","b_Spine02_03"],"Light":["Light","DirectionalLight Gizmo"],"Cylinder":["Cylinder.001","Cylinder.001"],"b_Tail01_012":["b_Tail02_013","b_Tail02_013"],"b_RightLeg01_019":["b_RightLeg02_020","b_RightLeg02_020"],"b_LeftFoot01_017":["b_LeftFoot02_018","b_LeftFoot02_018"],"Cube":["Cube"],"b_Hip_01":["b_Spine01_02","b_Tail01_012","b_LeftLeg01_015","b_RightLeg01_019","b_Spine01_02","b_Tail01_012","b_LeftLeg01_015","b_RightLeg01_019"],"b_LeftForeArm_010":["b_LeftHand_011","b_LeftHand_011"],"Fox":["Fox_mesh","_rootJoint","Fox_mesh","_rootJoint"],"Blueprint8_animated_no_bones":["Cylinder.002"],"Parent_Object":["Cube.003","Blueprint1","Cylinder.001"],"b_RightUpperArm_06":["b_RightForeArm_07","b_RightForeArm_07"],"world":["no_name"],"b_LeftLeg01_015":["b_LeftLeg02_016","b_LeftLeg02_016"],"Spot":["Spot"],"b_RightFoot01_021":["b_RightFoot02_022","b_RightFoot02_022"],"Blueprint7_hierarchy":["Cube.001"],"b_RightLeg02_020":["b_RightFoot01_021","b_RightFoot01_021"],"Blueprint4_nested":["Blueprint3"],"Fox_mesh":["fox1","fox1"],"b_RightForeArm_07":["b_RightHand_08","b_RightHand_08"],"Blueprint3_mesh":["Cylinder","Cylinder"],"Blueprint1_mesh":["Cube.001","Cube.001"],"b_Neck_04":["b_Head_05","b_Head_05"],"b_LeftUpperArm_09":["b_LeftForeArm_010","b_LeftForeArm_010"],"no_name":["Parent_Object","Blueprint6_animated.001","lighting_components_World","assets_list_World_components","Collection","Collection 2"],"Cylinder.002":["Cylinder.003"],"Blueprint4_nested.001":["Blueprint3"],"Blueprint1":["Blueprint1_mesh"],"Cylinder.001":["Cylinder.002","Blueprint7_hierarchy.001","Empty_as_child"],"b_Tail02_013":["b_Tail03_014","b_Tail03_014"],"b_LeftLeg02_016":["b_LeftFoot01_017","b_LeftFoot01_017"],"Plane":["Plane"]}
|
BIN
tools/gltf_auto_export/tests/expected_screenshot.png
Normal file
BIN
tools/gltf_auto_export/tests/expected_screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 657 KiB |
@ -134,7 +134,7 @@ def test_export_complex(setup_data):
|
|||||||
assert sorted(hierarchy.items()) == sorted(expected.items())
|
assert sorted(hierarchy.items()) == sorted(expected.items())
|
||||||
|
|
||||||
# last but not least, do a visual compare
|
# last but not least, do a visual compare
|
||||||
screenshot_expected_path = os.path.join(root_path, "expected_screenshot.png")
|
screenshot_expected_path = os.path.join(os.path.dirname(__file__), "expected_screenshot.png")
|
||||||
screenshot_observed_path = os.path.join(root_path, "screenshot.png")
|
screenshot_observed_path = os.path.join(root_path, "screenshot.png")
|
||||||
img_a = Image.open(screenshot_expected_path)
|
img_a = Image.open(screenshot_expected_path)
|
||||||
img_b = Image.open(screenshot_observed_path)
|
img_b = Image.open(screenshot_observed_path)
|
||||||
|
Loading…
Reference in New Issue
Block a user