use bevy::{ core::Time, diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}, ecs::prelude::*, input::Input, math::{Quat, Vec3}, pbr2::{ AmbientLight, DirectionalLight, DirectionalLightBundle, PbrBundle, PointLight, PointLightBundle, StandardMaterial, }, prelude::{App, Assets, BuildChildren, KeyCode, Transform}, render2::{ camera::{OrthographicProjection, PerspectiveCameraBundle}, color::Color, mesh::{shape, Mesh}, }, PipelinedDefaultPlugins, }; fn main() { App::new() .add_plugins(PipelinedDefaultPlugins) .add_plugin(FrameTimeDiagnosticsPlugin::default()) .add_plugin(LogDiagnosticsPlugin::default()) .add_startup_system(setup) .add_system(movement) .add_system(animate_light_direction) .run(); } 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() }), ..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() }), ..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() }), ..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::default() }), transform: Transform::from_xyz(0.0, 0.5, 0.0), ..Default::default() }) .insert(Movable); // sphere commands .spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 0.5, ..Default::default() })), material: materials.add(StandardMaterial { base_color: Color::LIME_GREEN, ..Default::default() }), transform: Transform::from_xyz(1.5, 1.0, 1.5), ..Default::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, ..Default::default() }, ..Default::default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 0.1, ..Default::default() })), material: materials.add(StandardMaterial { base_color: Color::RED, emissive: Color::rgba_linear(100.0, 0.0, 0.0, 0.0), ..Default::default() }), ..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, ..Default::default() }, ..Default::default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 0.1, ..Default::default() })), material: materials.add(StandardMaterial { base_color: Color::GREEN, emissive: Color::rgba_linear(0.0, 100.0, 0.0, 0.0), ..Default::default() }), ..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, ..Default::default() }, ..Default::default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 0.1, ..Default::default() })), material: materials.add(StandardMaterial { base_color: Color::BLUE, emissive: Color::rgba_linear(0.0, 0.0, 100.0, 0.0), ..Default::default() }), ..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::default() }, ..Default::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() }, ..Default::default() }); // camera commands.spawn_bundle(PerspectiveCameraBundle { transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), ..Default::default() }); } fn animate_light_direction( time: Res