use crate::component::{SkeletonReady, SkeletonStateComponent};
use crate::loader::SpinalSkeleton;
use bevy::math::Affine3A;
use bevy::prelude::*;
use bevy::render::mesh::{Indices, PrimitiveTopology};
use bevy::sprite::{Anchor, Rect};
use bevy::utils::{HashMap, HashSet};
use bevy_prototype_lyon::prelude::*;
use spinal::skeleton::{Attachment, AttachmentData};
use spinal::{Atlas, AtlasPage, AtlasParser, AtlasRegion, DetachedSkeletonState, SkeletonState};
use std::mem::swap;
pub fn instance(
mut commands: Commands,
mut asset_events: EventReader<AssetEvent<SpinalSkeleton>>,
query: Query<(Entity, &Handle<SpinalSkeleton>), Without<SkeletonReady>>,
) {
let mut changed = HashSet::new();
for ev in asset_events.iter() {
match ev {
AssetEvent::Created { handle } => {
changed.insert(handle);
}
AssetEvent::Modified { handle } => {
changed.insert(handle);
}
_ => {}
}
}
for handle in changed {
for (entity, query_handle) in query.iter() {
if handle == query_handle {
commands.entity(entity).insert(SkeletonReady);
}
}
}
}
fn atlas_to_bevy_rect(page: &AtlasPage, r: &AtlasRegion) -> Rect {
let mut bounds = r.bounds.as_ref().unwrap().clone();
if r.rotate == 90. {
swap(&mut bounds.size.x, &mut bounds.size.y);
}
Rect {
min: bounds.position,
max: bounds.position + bounds.size,
}
}
pub fn setup(
mut commands: Commands,
asset_server: Res<AssetServer>,
skeletons: Res<Assets<SpinalSkeleton>>,
mut texture_atlases: ResMut<Assets<TextureAtlas>>,
mut query: Query<(Entity, &Handle<SpinalSkeleton>), With<SkeletonReady>>,
) {
for (entity, skeleton_handle) in query.iter() {
let skeleton = skeletons.get(&skeleton_handle).unwrap();
let state = DetachedSkeletonState::new();
commands.spawn().insert(SkeletonStateComponent {
skeleton_handle: skeleton_handle.clone(),
state,
});
}
}
pub fn setup__(
mut commands: Commands,
asset_server: Res<AssetServer>,
skeletons: Res<Assets<SpinalSkeleton>>,
mut texture_atlases: ResMut<Assets<TextureAtlas>>,
mut query: Query<(Entity, &Handle<SpinalSkeleton>), With<SkeletonReady>>,
) {
for (entity, handle) in query.iter() {
let skeleton = skeletons.get(&handle).unwrap();
let mut state = DetachedSkeletonState::new();
state.pose(&skeleton.0);
commands.entity(entity).remove::<SkeletonReady>();
println!("setup~!");
}
}
#[derive(Component)]
pub struct Testing;
pub fn testing(time: Res<Time>, mut query: Query<&mut Transform, With<Testing>>) {
for mut transform in query.iter_mut() {
}
}