1use bevy::{
4 light::{CascadeShadowConfigBuilder, DirectionalLightShadowMap},
5 prelude::*,
6};
7use std::f32::consts::*;
8
9fn main() {
10 App::new()
11 .insert_resource(DirectionalLightShadowMap { size: 4096 })
12 .add_plugins(DefaultPlugins)
13 .add_systems(Startup, setup)
14 .add_systems(Update, animate_light_direction)
15 .run();
16}
17
18fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
19 commands.spawn((
20 Camera3d::default(),
21 Transform::from_xyz(0.7, 0.7, 1.0).looking_at(Vec3::new(0.0, 0.3, 0.0), Vec3::Y),
22 EnvironmentMapLight {
23 diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
24 specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
25 intensity: 250.0,
26 ..default()
27 },
28 ));
29
30 commands.spawn((
31 DirectionalLight {
32 shadows_enabled: true,
33 ..default()
34 },
35 CascadeShadowConfigBuilder {
40 num_cascades: 1,
41 maximum_distance: 1.6,
42 ..default()
43 }
44 .build(),
45 ));
46 commands.spawn(SceneRoot(asset_server.load(
47 GltfAssetLabel::Scene(0).from_asset("models/FlightHelmet/FlightHelmet.gltf"),
48 )));
49}
50
51fn animate_light_direction(
52 time: Res<Time>,
53 mut query: Query<&mut Transform, With<DirectionalLight>>,
54) {
55 for mut transform in &mut query {
56 transform.rotation = Quat::from_euler(
57 EulerRot::ZYX,
58 0.0,
59 time.elapsed_secs() * PI / 5.0,
60 -FRAC_PI_4,
61 );
62 }
63}