mod camera;
mod light;
pub mod model;
use crate::GltfData;
use crate::utils::transform_to_matrix;
pub use camera::{Camera, Projection};
pub use light::Light;
pub use model::{Material, Model};
use cgmath::*;
use gltf::scene::Node;
#[derive(Default, Clone, Debug)]
pub struct Scene {
#[cfg(feature = "names")]
pub name: Option<String>,
#[cfg(feature = "extras")]
pub extras: gltf::json::extras::Extras,
pub models: Vec<Model>,
pub cameras: Vec<Camera>,
pub lights: Vec<Light>,
}
impl Scene {
pub(crate) fn load(gltf_scene: gltf::Scene, data: &mut GltfData) -> Self {
let mut scene = Self::default();
#[cfg(feature = "names")]
{
scene.name = gltf_scene.name().map(String::from);
}
#[cfg(feature = "extras")]
{
scene.extras = gltf_scene.extras().clone();
}
for node in gltf_scene.nodes() {
scene.read_node(&node, &One::one(), data);
}
scene
}
fn read_node(&mut self, node: &Node, parent_transform: &Matrix4<f32>, data: &mut GltfData) {
let transform = parent_transform * transform_to_matrix(node.transform());
for child in node.children() {
self.read_node(&child, &transform, data);
}
if let Some(camera) = node.camera() {
self.cameras.push(Camera::load(camera, &transform));
}
if let Some(light) = node.light() {
self.lights.push(Light::load(light, &transform));
}
if let Some(mesh) = node.mesh() {
for (i, primitive) in mesh.primitives().enumerate() {
self.models
.push(Model::load(&mesh, i, primitive, &transform, data));
}
}
}
}