use std::backtrace::Backtrace; use bevy::{ asset::AsyncReadExt, ecs::{ query::{self, ReadOnlyWorldQuery, WorldQuery}, system::{Command, EntityCommands, SystemParam}, }, gltf::Gltf, prelude::*, render::INSTANCE_INDEX_SHADER_HANDLE, scene, transform::commands, ui::debug::print_ui_layout_tree, utils::hashbrown::HashMap, }; use bevy_inspector_egui::egui::TextBuffer; use bevy_mod_picking::prelude::EntityEvent; use bevy_rapier3d::parry::transformation; use studio_bvh::{frames::Frame, joint}; mod error; mod loader; use crate::{ debug::print_mat3, scene::{ActiveScene, SceneState}, }; use self::loader::BvhLoader; pub struct BvhPlugin; impl Plugin for BvhPlugin { fn build(&self, app: &mut App) { app.init_asset::() .register_asset_loader(BvhLoader) .add_systems(Update, animate_bvh.run_if(in_state(SceneState::Active))) .register_type::() .register_type::() //Events .add_event::() .add_systems(PreUpdate, update_bvh_anim); } } #[derive(Clone, Debug, Default, Asset, TypePath)] pub struct Bvh(studio_bvh::Bvh); //============================================================================== // Bvh Anim Component //============================================================================== #[derive(Component, Debug, Reflect)] pub struct BvhAnim { #[reflect(ignore)] bvh: Handle, should_play: bool, frame: usize, #[reflect(ignore)] retarget: Option, #[reflect(ignore)] timer: Timer, #[reflect(ignore)] last_frame: usize, } pub fn animate_bvh( mut command: Commands, mut bvh_anims: Query<(Entity, &mut BvhAnim, &mut Transform, &mut Children)>, mut bvh_joints: Query>, bvh_assets: Res>, time: Res