forked from bevyengine/bevy
-
Notifications
You must be signed in to change notification settings - Fork 1
/
spherical_area_lights.rs
75 lines (68 loc) · 2.23 KB
/
spherical_area_lights.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//! Demonstrates how lighting is affected by different radius of point lights.
use bevy::prelude::*;
fn main() {
App::new()
.insert_resource(ClearColor(Color::BLACK))
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.run();
}
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
// camera
commands.spawn(Camera3dBundle {
transform: Transform::from_xyz(1.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
..default()
});
// plane
commands.spawn(PbrBundle {
mesh: meshes.add(shape::Plane::from_size(100.0).into()),
material: materials.add(StandardMaterial {
base_color: Color::rgb(0.2, 0.2, 0.2),
perceptual_roughness: 0.08,
..default()
}),
..default()
});
const COUNT: usize = 6;
let position_range = -4.0..4.0;
let radius_range = 0.0..0.8;
let pos_len = position_range.end - position_range.start;
let radius_len = radius_range.end - radius_range.start;
let mesh = meshes.add(Mesh::from(shape::UVSphere {
sectors: 128,
stacks: 64,
..default()
}));
for i in 0..COUNT {
let percent = i as f32 / COUNT as f32;
let radius = radius_range.start + percent * radius_len;
// sphere light
commands
.spawn(PbrBundle {
mesh: mesh.clone(),
material: materials.add(StandardMaterial {
base_color: Color::rgb(0.5, 0.5, 1.0),
unlit: true,
..default()
}),
transform: Transform::from_xyz(position_range.start + percent * pos_len, 0.6, 0.0)
.with_scale(Vec3::splat(radius)),
..default()
})
.with_children(|children| {
children.spawn(PointLightBundle {
point_light: PointLight {
intensity: 1500.0,
radius,
color: Color::rgb(0.2, 0.2, 1.0),
..default()
},
..default()
});
});
}
}