//! Illustrates different lights of various types and colors, some static, some moving over //! a simple scene. use std::f32::consts::PI; use bevy::{pbr::CascadeShadowConfig, prelude::*}; fn main() { App::new() .add_plugins(DefaultPlugins) .add_startup_system(setup) .add_system(movement) .add_system(animate_light_direction) .run(); } #[derive(Component)] struct Movable; /// set up a simple 3D scene fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, ) { // ground plane commands.spawn(PbrBundle { mesh: meshes.add(Mesh::from(shape::Plane { size: 10.0 })), material: materials.add(StandardMaterial { base_color: Color::WHITE, perceptual_roughness: 1.0, ..default() }), ..default() }); // left wall let mut transform = Transform::from_xyz(2.5, 2.5, 0.0); transform.rotate_z(PI / 2.); commands.spawn(PbrBundle { mesh: meshes.add(Mesh::from(shape::Box::new(5.0, 0.15, 5.0))), transform, material: materials.add(StandardMaterial { base_color: Color::INDIGO, perceptual_roughness: 1.0, ..default() }), ..default() }); // back (right) wall let mut transform = Transform::from_xyz(0.0, 2.5, -2.5); transform.rotate_x(PI / 2.); commands.spawn(PbrBundle { mesh: meshes.add(Mesh::from(shape::Box::new(5.0, 0.15, 5.0))), transform, material: materials.add(StandardMaterial { base_color: Color::INDIGO, perceptual_roughness: 1.0, ..default() }), ..default() }); // cube commands.spawn(( PbrBundle { mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })), material: materials.add(StandardMaterial { base_color: Color::PINK, ..default() }), transform: Transform::from_xyz(0.0, 0.5, 0.0), ..default() }, Movable, )); // sphere commands.spawn(( PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 0.5, ..default() })), material: materials.add(StandardMaterial { base_color: Color::LIME_GREEN, ..default() }), transform: Transform::from_xyz(1.5, 1.0, 1.5), ..default() }, Movable, )); // ambient light commands.insert_resource(AmbientLight { color: Color::ORANGE_RED, brightness: 0.02, }); // red point light commands .spawn(PointLightBundle { // transform: Transform::from_xyz(5.0, 8.0, 2.0), transform: Transform::from_xyz(1.0, 2.0, 0.0), point_light: PointLight { intensity: 1600.0, // lumens - roughly a 100W non-halogen incandescent bulb color: Color::RED, shadows_enabled: true, ..default() }, ..default() }) .with_children(|builder| { builder.spawn(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 0.1, ..default() })), material: materials.add(StandardMaterial { base_color: Color::RED, emissive: Color::rgba_linear(100.0, 0.0, 0.0, 0.0), ..default() }), ..default() }); }); // green spot light commands .spawn(SpotLightBundle { transform: Transform::from_xyz(-1.0, 2.0, 0.0) .looking_at(Vec3::new(-1.0, 0.0, 0.0), Vec3::Z), spot_light: SpotLight { intensity: 1600.0, // lumens - roughly a 100W non-halogen incandescent bulb color: Color::GREEN, shadows_enabled: true, inner_angle: 0.6, outer_angle: 0.8, ..default() }, ..default() }) .with_children(|builder| { builder.spawn(PbrBundle { transform: Transform::from_rotation(Quat::from_rotation_x(PI / 2.0)), mesh: meshes.add(Mesh::from(shape::Capsule { depth: 0.125, radius: 0.1, ..default() })), material: materials.add(StandardMaterial { base_color: Color::GREEN, emissive: Color::rgba_linear(0.0, 100.0, 0.0, 0.0), ..default() }), ..default() }); }); // blue point light commands .spawn(PointLightBundle { // transform: Transform::from_xyz(5.0, 8.0, 2.0), transform: Transform::from_xyz(0.0, 4.0, 0.0), point_light: PointLight { intensity: 1600.0, // lumens - roughly a 100W non-halogen incandescent bulb color: Color::BLUE, shadows_enabled: true, ..default() }, ..default() }) .with_children(|builder| { builder.spawn(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 0.1, ..default() })), material: materials.add(StandardMaterial { base_color: Color::BLUE, emissive: Color::rgba_linear(0.0, 0.0, 100.0, 0.0), ..default() }), ..default() }); }); // directional 'sun' light commands.spawn(DirectionalLightBundle { directional_light: DirectionalLight { shadows_enabled: true, ..default() }, transform: Transform { translation: Vec3::new(0.0, 2.0, 0.0), rotation: Quat::from_rotation_x(-PI / 4.), ..default() }, // The default cascade config is designed to handle large scenes. // As this example has a much smaller world, we can tighten the shadow // far bound for better visual quality. cascade_shadow_config: CascadeShadowConfig::new(4, 5.0, 30.0, 0.2), ..default() }); // camera commands.spawn(Camera3dBundle { transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), ..default() }); } fn animate_light_direction( time: Res