Skip to content

Commit 44f370a

Browse files
committed
Make the iter_combinators examples more pretty (#3075)
# Objective - More colours ## Solution - Various changes - Would have a video here, but don't have an easy way to record one before I go to sleep - I intend to additionally change the distribution of the satellites, to be more uniform in space.
1 parent 507441d commit 44f370a

File tree

1 file changed

+50
-19
lines changed

1 file changed

+50
-19
lines changed

examples/ecs/iter_combinations.rs

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use bevy::{core::FixedTimestep, prelude::*};
1+
use bevy::{core::FixedTimestep, pbr::AmbientLight, prelude::*, render::camera::Camera};
22
use rand::{thread_rng, Rng};
33

44
#[derive(Debug, Hash, PartialEq, Eq, Clone, StageLabel)]
@@ -10,6 +10,10 @@ fn main() {
1010
App::new()
1111
.insert_resource(Msaa { samples: 4 })
1212
.add_plugins(DefaultPlugins)
13+
.insert_resource(AmbientLight {
14+
brightness: 0.03,
15+
..Default::default()
16+
})
1317
.add_startup_system(generate_bodies)
1418
.add_stage_after(
1519
CoreStage::Update,
@@ -19,11 +23,12 @@ fn main() {
1923
.with_system(interact_bodies)
2024
.with_system(integrate),
2125
)
26+
.add_system(look_at_star)
27+
.insert_resource(ClearColor(Color::BLACK))
2228
.run();
2329
}
2430

2531
const GRAVITY_CONSTANT: f32 = 0.001;
26-
const SOFTENING: f32 = 0.01;
2732
const NUM_BODIES: usize = 100;
2833

2934
#[derive(Component, Default)]
@@ -32,6 +37,8 @@ struct Mass(f32);
3237
struct Acceleration(Vec3);
3338
#[derive(Component, Default)]
3439
struct LastPos(Vec3);
40+
#[derive(Component)]
41+
struct Star;
3542

3643
#[derive(Bundle, Default)]
3744
struct BodyBundle {
@@ -52,33 +59,33 @@ fn generate_bodies(
5259
subdivisions: 3,
5360
}));
5461

55-
let pos_range = 1.0..15.0;
5662
let color_range = 0.5..1.0;
5763
let vel_range = -0.5..0.5;
5864

5965
let mut rng = thread_rng();
6066
for _ in 0..NUM_BODIES {
61-
let mass_value_cube_root: f32 = rng.gen_range(0.5..4.0);
62-
let mass_value: f32 = mass_value_cube_root * mass_value_cube_root * mass_value_cube_root;
67+
let radius: f32 = rng.gen_range(0.1..0.7);
68+
let mass_value = radius.powi(3) * 10.;
6369

6470
let position = Vec3::new(
6571
rng.gen_range(-1.0..1.0),
6672
rng.gen_range(-1.0..1.0),
6773
rng.gen_range(-1.0..1.0),
6874
)
6975
.normalize()
70-
* rng.gen_range(pos_range.clone());
76+
* rng.gen_range(0.2f32..1.0).powf(1. / 3.)
77+
* 15.;
7178

7279
commands.spawn_bundle(BodyBundle {
7380
pbr: PbrBundle {
7481
transform: Transform {
7582
translation: position,
76-
scale: Vec3::splat(mass_value_cube_root * 0.1),
83+
scale: Vec3::splat(radius),
7784
..Default::default()
7885
},
7986
mesh: mesh.clone(),
8087
material: materials.add(
81-
Color::rgb_linear(
88+
Color::rgb(
8289
rng.gen_range(color_range.clone()),
8390
rng.gen_range(color_range.clone()),
8491
rng.gen_range(color_range.clone()),
@@ -101,29 +108,40 @@ fn generate_bodies(
101108
}
102109

103110
// add bigger "star" body in the center
111+
let star_radius = 1.;
104112
commands
105113
.spawn_bundle(BodyBundle {
106114
pbr: PbrBundle {
107-
transform: Transform {
108-
scale: Vec3::splat(0.5),
109-
..Default::default()
110-
},
115+
transform: Transform::from_scale(Vec3::splat(star_radius)),
111116
mesh: meshes.add(Mesh::from(shape::Icosphere {
112117
radius: 1.0,
113118
subdivisions: 5,
114119
})),
115-
material: materials.add((Color::ORANGE_RED * 10.0).into()),
120+
material: materials.add(StandardMaterial {
121+
base_color: Color::ORANGE_RED,
122+
emissive: (Color::ORANGE_RED * 2.),
123+
..Default::default()
124+
}),
116125
..Default::default()
117126
},
118-
mass: Mass(1000.0),
127+
mass: Mass(500.0),
119128
..Default::default()
120129
})
121-
.insert(PointLight {
122-
color: Color::ORANGE_RED,
123-
..Default::default()
130+
.insert(Star)
131+
.with_children(|p| {
132+
p.spawn_bundle(PointLightBundle {
133+
point_light: PointLight {
134+
color: Color::WHITE,
135+
intensity: 400.0,
136+
range: 100.0,
137+
radius: star_radius,
138+
..Default::default()
139+
},
140+
..Default::default()
141+
});
124142
});
125143
commands.spawn_bundle(PerspectiveCameraBundle {
126-
transform: Transform::from_xyz(0.0, 10.5, -20.0).looking_at(Vec3::ZERO, Vec3::Y),
144+
transform: Transform::from_xyz(0.0, 10.5, -30.0).looking_at(Vec3::ZERO, Vec3::Y),
127145
..Default::default()
128146
});
129147
}
@@ -136,7 +154,7 @@ fn interact_bodies(mut query: Query<(&Mass, &GlobalTransform, &mut Acceleration)
136154
let delta = transform2.translation - transform1.translation;
137155
let distance_sq: f32 = delta.length_squared();
138156

139-
let f = GRAVITY_CONSTANT / (distance_sq * (distance_sq + SOFTENING).sqrt());
157+
let f = GRAVITY_CONSTANT / distance_sq;
140158
let force_unit_mass = delta * f;
141159
acc1.0 += force_unit_mass * *m2;
142160
acc2.0 -= force_unit_mass * *m1;
@@ -156,3 +174,16 @@ fn integrate(mut query: Query<(&mut Acceleration, &mut Transform, &mut LastPos)>
156174
transform.translation = new_pos;
157175
}
158176
}
177+
178+
fn look_at_star(
179+
mut camera: Query<&mut Transform, (With<Camera>, Without<Star>)>,
180+
star: Query<&Transform, With<Star>>,
181+
) {
182+
let mut camera = camera.single_mut();
183+
let star = star.single();
184+
let new_rotation = camera
185+
.looking_at(star.translation, Vec3::Y)
186+
.rotation
187+
.lerp(camera.rotation, 0.1);
188+
camera.rotation = new_rotation;
189+
}

0 commit comments

Comments
 (0)