You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.2 KiB
Rust
76 lines
2.2 KiB
Rust
use std::f32::consts::PI;
|
|
|
|
use bevy::{pbr::CascadeShadowConfigBuilder, prelude::*};
|
|
|
|
#[derive(Resource)]
|
|
struct AnimationClips(Vec<Handle<AnimationClip>>);
|
|
|
|
fn main() {
|
|
App::new()
|
|
.add_plugins(DefaultPlugins.set(WindowPlugin {
|
|
primary_window: Some(Window {
|
|
title: "Animation WTF".into(),
|
|
resolution: (640., 480.).into(),
|
|
..default()
|
|
}),
|
|
..default()
|
|
}))
|
|
.add_startup_system(init)
|
|
.add_system(spawn_animation)
|
|
.run();
|
|
}
|
|
|
|
fn init(mut commands: Commands, server: Res<AssetServer>) {
|
|
// Load gltf/animation assets
|
|
commands.insert_resource(AnimationClips(vec![
|
|
server.load("models/monkey-nod.glb#Animation0")
|
|
]));
|
|
|
|
commands
|
|
.spawn(SpatialBundle { ..default() })
|
|
.with_children(|parent| {
|
|
// spawn camera
|
|
parent.spawn(Camera3dBundle {
|
|
transform: Transform::from_xyz(10.0, 10.0, 15.0).looking_at(Vec3::ZERO, Vec3::Y),
|
|
..default()
|
|
});
|
|
|
|
parent.spawn(DirectionalLightBundle {
|
|
transform: Transform::from_rotation(Quat::from_euler(
|
|
EulerRot::ZYX,
|
|
0.0,
|
|
1.0,
|
|
-PI / 4.0,
|
|
)),
|
|
directional_light: DirectionalLight {
|
|
shadows_enabled: true,
|
|
..default()
|
|
},
|
|
cascade_shadow_config: CascadeShadowConfigBuilder {
|
|
first_cascade_far_bound: 20.0,
|
|
maximum_distance: 40.0,
|
|
..default()
|
|
}
|
|
.into(),
|
|
..default()
|
|
});
|
|
parent.spawn(SceneBundle {
|
|
scene: server.load("models/monkey-nod.glb#Scene0"),
|
|
..default()
|
|
});
|
|
});
|
|
}
|
|
|
|
fn spawn_animation(
|
|
animations: Res<AnimationClips>,
|
|
mut player: Query<&mut AnimationPlayer>,
|
|
mut done: Local<bool>,
|
|
) {
|
|
if !*done {
|
|
if let Ok(mut player) = player.get_single_mut() {
|
|
player.play(animations.0[0].clone_weak()).repeat();
|
|
*done = true;
|
|
}
|
|
}
|
|
}
|