use bevy::prelude::*; use crate::geometry::PLANET_RADIUS; pub const LIGHT_RANGE: f32 = PLANET_RADIUS * 0.6; pub const LIGHT_DIST: f32 = PLANET_RADIUS * 1.2; pub struct CyberSpaceLightsPlugin; impl Plugin for CyberSpaceLightsPlugin { fn build(&self, app: &mut App) { app.add_startup_system(setup).add_system(animate_lights); } } #[derive(Component)] struct Animate; fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, ) { let red_light = PointLight { intensity: 1_000.0, range: LIGHT_RANGE, color: Color::RED, radius: 1.0, ..Default::default() }; let blue_light = PointLight { intensity: 1_000.0, range: LIGHT_RANGE, color: Color::BLUE, radius: 1.0, ..Default::default() }; let purple_light = PointLight { intensity: 1_000.0, range: LIGHT_RANGE, color: Color::PURPLE, radius: 1.0, ..Default::default() }; commands.insert_resource(AmbientLight { color: Color::WHITE, brightness: 0.32, }); // east light commands .spawn_bundle(PointLightBundle { transform: Transform::from_xyz(LIGHT_DIST, 0.0, 0.0), point_light: purple_light, ..Default::default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 10.0, ..Default::default() })), material: materials.add(StandardMaterial { base_color: Color::PURPLE, emissive: Color::rgba_linear(50.0, 0.0, 50.0, 0.0), ..Default::default() }), ..Default::default() }); }) .insert(Animate); // west light commands .spawn_bundle(PointLightBundle { transform: Transform::from_xyz(-LIGHT_DIST, 0.0, 0.0), point_light: purple_light, ..Default::default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 10.0, ..Default::default() })), material: materials.add(StandardMaterial { base_color: Color::PURPLE, emissive: Color::rgba_linear(50.0, 0.0, 50.0, 0.0), ..Default::default() }), ..Default::default() }); }) .insert(Animate); // north light commands .spawn_bundle(PointLightBundle { transform: Transform::from_xyz(0.0, 0.0, LIGHT_DIST), point_light: purple_light, ..Default::default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 10.0, ..Default::default() })), material: materials.add(StandardMaterial { base_color: Color::PURPLE, emissive: Color::rgba_linear(50.0, 0.0, 50.0, 0.0), ..Default::default() }), ..Default::default() }); }) .insert(Animate); // south light commands .spawn_bundle(PointLightBundle { transform: Transform::from_xyz(0.0, 0.0, -LIGHT_DIST), point_light: purple_light, ..Default::default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::UVSphere { radius: 10.0, ..Default::default() })), material: materials.add(StandardMaterial { base_color: Color::PURPLE, emissive: Color::rgba_linear(50.0, 0.0, 50.0, 0.0), ..Default::default() }), ..Default::default() }); }) .insert(Animate); // up light commands .spawn_bundle(PointLightBundle { transform: Transform::from_xyz(0.0, LIGHT_DIST, 0.0), point_light: red_light, ..Default::default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::Icosphere { radius: 10.0, subdivisions: 2, })), material: materials.add(StandardMaterial { base_color: Color::RED, emissive: Color::rgba_linear(100.0, 0.0, 0.0, 0.0), ..Default::default() }), ..Default::default() }); }); // down light commands .spawn_bundle(PointLightBundle { transform: Transform::from_xyz(0.0, -LIGHT_DIST, 0.0), point_light: blue_light, ..Default::default() }) .with_children(|builder| { builder.spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::Icosphere { radius: 10.0, subdivisions: 2, })), material: materials.add(StandardMaterial { base_color: Color::BLUE, emissive: Color::rgba_linear(0.0, 0.0, 100.0, 0.0), ..Default::default() }), ..Default::default() }); }); } fn animate_lights( time: Res