From 597819169135657bc4256b8f60f51823455e8ce1 Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Wed, 19 Jan 2022 15:07:24 -0800 Subject: [PATCH] Re-org the lights, tweak the colors. --- src/geometry.rs | 4 +- src/lights.rs | 147 ++++++++++++++++++++++++++---------------------- 2 files changed, 81 insertions(+), 70 deletions(-) diff --git a/src/geometry.rs b/src/geometry.rs index 1d71a9e..e90b408 100644 --- a/src/geometry.rs +++ b/src/geometry.rs @@ -3,7 +3,7 @@ use heron::prelude::{CollisionShape, RigidBody}; use crate::Label; -pub const PLANET_RADIUS: f32 = 340.0; +pub const PLANET_RADIUS: f32 = 360.0; pub(crate) const SPAWN_ALTITUDE: f32 = PLANET_RADIUS + 100.0; #[derive(Component, Debug)] @@ -21,7 +21,7 @@ fn spawn_giant_sphere( .spawn_bundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::Icosphere { radius: PLANET_RADIUS, - subdivisions: 8, + subdivisions: 32, })), material: materials.add(StandardMaterial { base_color: Color::GRAY, diff --git a/src/lights.rs b/src/lights.rs index 5cbf9b1..f6001e7 100644 --- a/src/lights.rs +++ b/src/lights.rs @@ -16,7 +16,79 @@ struct AnimatedCyberLight { #[derive(Component)] pub(crate) struct AnimateCyberLightWireframe; -fn spawn_lights( +fn spawn_moving_lights( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + let rng = &mut thread_rng(); + // spawn 200 orbiting bisexual lights + for _ in 0..255 { + // mechanics + let axis = crate::random_sphere_vec(rng); + let angle = rng.gen_range(0.0..TAU); + let rate: f32 = rng.gen_range(7.0..10.0); + let rate = rate.to_radians(); + let rotation = Quat::from_axis_angle(axis, angle); + let altitude = PLANET_RADIUS + rng.gen_range(8.0..20.0); + let perp = axis.any_orthonormal_vector(); + let translation = perp * altitude; + let transform = Transform::from_translation(translation); + + // optics + let hue = rng.gen_range(240.0..300.0); + let saturation = rng.gen_range(0.85..0.99); + let lightness = rng.gen_range(0.3..0.7); + let color = Color::hsl(hue, saturation, lightness); + let intensity = rng.gen_range(500.0..900.0); + let radius = rng.gen::() * 2.2; // why can't this infer the gen type? + let point_light = PointLight { + intensity, + range: LIGHT_RANGE, + color, + radius: radius - 0.1, + shadows_enabled: true, + ..Default::default() + }; + + commands + // first, spawn an entity with a transform we can rotate + .spawn_bundle(( + AnimatedCyberLight { axis, rate }, + Transform::from_rotation(rotation), + GlobalTransform::default(), + )) + .with_children(|parent| { + parent + // now spawn a child entity with a pointlight, and a relative transform that's + // just translation from the parent + .spawn_bundle(PointLightBundle { + transform, + point_light, + ..Default::default() + }) + .with_children(|builder| { + builder + // now a simple mesh to show a wireframe. + .spawn_bundle(PbrBundle { + mesh: meshes.add(Mesh::from(shape::Icosphere { + radius, + subdivisions: 1, + })), + material: materials.add(StandardMaterial { + base_color: Color::hsla(272.0, 0.7, 0.56, 0.7), + emissive: color, + ..Default::default() + }), + ..Default::default() + }) + .insert(AnimateCyberLightWireframe); + }); // mesh child + }); // light child + } +} + +fn spawn_static_lights( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, @@ -44,68 +116,6 @@ fn spawn_lights( brightness: 0.32, }); - let rng = &mut thread_rng(); - // spawn 200 orbiting bisexual lights - for _ in 0..255 { - let hue = rng.gen_range(260.0..320.0); - let saturation = rng.gen_range(0.85..0.99); - let lightness = rng.gen_range(0.3..0.7); - let color = Color::hsl(hue, saturation, lightness); - - let axis = crate::random_sphere_vec(rng); - let angle = rng.gen_range(0.0..TAU); - let rate: f32 = rng.gen_range(7.0..10.0); - let rate = rate.to_radians(); - let rotation = Quat::from_axis_angle(axis, angle); - - let altitude = PLANET_RADIUS + rng.gen_range(8.0..20.0); - let perp = axis.any_orthonormal_vector(); - let translation = perp * altitude; - let transform = Transform::from_translation(translation); - - let intensity = rng.gen_range(500.0..900.0); - let radius = rng.gen::() * 2.5; // why can't this infer the gen type? - let point_light = PointLight { - intensity, - range: LIGHT_RANGE, - color, - radius, - shadows_enabled: true, - ..Default::default() - }; - - commands - .spawn_bundle(( - AnimatedCyberLight { axis, rate }, - Transform::from_rotation(rotation), - GlobalTransform::default(), - )) - .with_children(|parent| { - parent - .spawn_bundle(PointLightBundle { - transform, - point_light, - ..Default::default() - }) - .with_children(|builder| { - builder - .spawn_bundle(PbrBundle { - mesh: meshes.add(Mesh::from(shape::Icosphere { - radius, - subdivisions: 1, - })), - material: materials.add(StandardMaterial { - base_color: color, - emissive: color, - ..Default::default() - }), - ..Default::default() - }) - .insert(AnimateCyberLightWireframe); - }); // mesh child - }); // light child - } - // up light commands .spawn_bundle(PointLightBundle { @@ -120,8 +130,8 @@ fn spawn_lights( subdivisions: 2, })), material: materials.add(StandardMaterial { - base_color: Color::RED, - emissive: Color::rgba_linear(100.0, 0.0, 0.0, 0.0), + base_color: Color::BLUE, + emissive: Color::PINK, ..Default::default() }), ..Default::default() @@ -141,8 +151,8 @@ fn spawn_lights( subdivisions: 2, })), material: materials.add(StandardMaterial { - base_color: Color::BLUE, - emissive: Color::rgba_linear(0.0, 0.0, 100.0, 0.0), + base_color: Color::PINK, + emissive: Color::BLUE, ..Default::default() }), ..Default::default() @@ -162,7 +172,8 @@ fn orbit_lights(time: Res