//! Illustrates different lights of various types and colors, some static, some moving over //! a simple scene. use bevy::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_bundle(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(Quat::from_rotation_z(std::f32::consts::FRAC_PI_2)); commands.spawn_bundle(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(Quat::from_rotation_x(std::f32::consts::FRAC_PI_2)); commands.spawn_bundle(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_bundle(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() }) .insert(Movable); // sphere commands .spawn_bundle(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() }) .insert(Movable); // ambient light commands.insert_resource(AmbientLight { color: Color::ORANGE_RED, brightness: 0.02, }); // red point light commands .spawn_bundle(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_bundle(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 point light commands .spawn_bundle(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::GREEN, shadows_enabled: true, ..default() }, ..default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { 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_bundle(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_bundle(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 const HALF_SIZE: f32 = 10.0; commands.spawn_bundle(DirectionalLightBundle { directional_light: DirectionalLight { // Configure the projection to better fit the scene shadow_projection: OrthographicProjection { left: -HALF_SIZE, right: HALF_SIZE, bottom: -HALF_SIZE, top: HALF_SIZE, near: -10.0 * HALF_SIZE, far: 10.0 * HALF_SIZE, ..default() }, shadows_enabled: true, ..default() }, transform: Transform { translation: Vec3::new(0.0, 2.0, 0.0), rotation: Quat::from_rotation_x(-std::f32::consts::FRAC_PI_4), ..default() }, ..default() }); // camera commands.spawn_bundle(Camera3dBundle { transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), ..default() }); } fn animate_light_direction( time: Res