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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use gltf_json::Extras;
use crate::Document;
/// A light in the scene.
pub struct Light<'a> {
/// The parent `Document` struct.
#[allow(dead_code)]
document: &'a Document,
/// The corresponding JSON index.
index: usize,
/// The corresponding JSON struct.
json: &'a json::extensions::scene::khr_lights_punctual::Light,
}
impl<'a> Light<'a> {
/// Constructs a `Light`.
pub(crate) fn new(document: &'a Document, index: usize, json: &'a json::extensions::scene::khr_lights_punctual::Light) -> Self {
Self {
document,
index,
json,
}
}
/// Color of the light source.
pub fn color(&self) -> [f32; 3] {
self.json.color.clone()
}
/// Returns the internal JSON index.
pub fn index(&self) -> usize {
self.index
}
/// Optional user-defined name for this object.
#[cfg(feature = "names")]
pub fn name(&self) -> Option<&str> {
self.json.name.as_ref().map(String::as_str)
}
/// Optional application specific data.
pub fn extras(&self) -> &Extras {
&self.json.extras
}
/// Intensity of the light source. `point` and `spot` lights use luminous intensity
/// in candela (lm/sr) while `directional` lights use illuminance in lux (lm/m^2).
pub fn intensity(&self) -> f32 {
self.json.intensity
}
/// A distance cutoff at which the light's intensity may be considered to have reached
/// zero.
pub fn range(&self) -> Option<f32> {
self.json.range
}
/// Specifies the light subcategory.
pub fn kind(&self) -> Kind {
use json::extensions::scene::khr_lights_punctual::Type;
match self.json.type_.unwrap() {
Type::Directional => Kind::Directional,
Type::Point => Kind::Point,
Type::Spot => {
let args = self.json.spot.as_ref().unwrap();
Kind::Spot {
inner_cone_angle: args.inner_cone_angle,
outer_cone_angle: args.outer_cone_angle,
}
},
}
}
}
/// Light subcategory.
pub enum Kind {
/// Directional lights are light sources that act as though they are infinitely far away
/// and emit light in the direction of the local -z axis. This light type inherits the
/// orientation of the node that it belongs to; position and scale are ignored except for
/// their effect on the inherited node orientation. Because it is at an infinite distance,
/// the light is not attenuated. Its intensity is defined in lumens per metre squared, or
/// lux (lm/m2).
Directional,
/// Point lights emit light in all directions from their position in space; rotation and
/// scale are ignored except for their effect on the inherited node position. The
/// brightness of the light attenuates in a physically correct manner as distance
/// increases from the light's position (i.e. brightness goes like the inverse square of
/// the distance). Point light intensity is defined in candela, which is lumens per square
/// radian (lm/sr).
Point,
/// Spot lights emit light in a cone in the direction of the local -z axis. The angle and
/// falloff of the cone is defined using two numbers, the `inner_cone_angle` and
/// `outer_cone_angle`. As with point lights, the brightness also attenuates in a
/// physically correct manner as distance increases from the light's position (i.e.
/// brightness goes like the inverse square of the distance). Spot light intensity refers
/// to the brightness inside the `inner_cone_angle` (and at the location of the light) and
/// is defined in candela, which is lumens per square radian (lm/sr). Engines that don't
/// support two angles for spotlights should use `outer_cone_angle` as the spotlight angle
/// (leaving `inner_cone_angle` to implicitly be 0).
///
/// A spot light's position and orientation are inherited from its node transform.
/// Inherited scale does not affect cone shape, and is ignored except for its effect on
/// position and orientation.
Spot {
/// Angle in radians from centre of spotlight where falloff begins.
inner_cone_angle: f32,
/// Angle in radians from centre of spotlight where falloff ends.
outer_cone_angle: f32,
},
}