1mod camera;
2mod light;
3pub mod model;
7
8use crate::GltfData;
9use crate::utils::transform_to_matrix;
10pub use camera::{Camera, Projection};
11pub use light::Light;
12pub use model::{Material, Model};
13
14use cgmath::*;
15use gltf::scene::Node;
16
17#[derive(Default, Clone, Debug)]
19pub struct Scene {
20 #[cfg(feature = "names")]
21 pub name: Option<String>,
23 #[cfg(feature = "extras")]
24 pub extras: gltf::json::extras::Extras,
26 pub models: Vec<Model>,
28 pub cameras: Vec<Camera>,
30 pub lights: Vec<Light>,
32}
33
34impl Scene {
35 pub(crate) fn load(gltf_scene: gltf::Scene, data: &mut GltfData) -> Self {
36 let mut scene = Self::default();
37
38 #[cfg(feature = "names")]
39 {
40 scene.name = gltf_scene.name().map(String::from);
41 }
42 #[cfg(feature = "extras")]
43 {
44 scene.extras = gltf_scene.extras().clone();
45 }
46
47 for node in gltf_scene.nodes() {
48 scene.read_node(&node, &One::one(), data);
49 }
50 scene
51 }
52
53 fn read_node(&mut self, node: &Node, parent_transform: &Matrix4<f32>, data: &mut GltfData) {
54 let transform = parent_transform * transform_to_matrix(node.transform());
56
57 for child in node.children() {
59 self.read_node(&child, &transform, data);
60 }
61
62 if let Some(camera) = node.camera() {
64 self.cameras.push(Camera::load(camera, &transform));
65 }
66
67 if let Some(light) = node.light() {
69 self.lights.push(Light::load(light, &transform));
70 }
71
72 if let Some(mesh) = node.mesh() {
74 for (i, primitive) in mesh.primitives().enumerate() {
75 self.models
76 .push(Model::load(&mesh, i, primitive, &transform, data));
77 }
78 }
79 }
80}