glTF 2.0 loader
This crate is intended to load glTF 2.0, a file format designed for the
efficient runtime transmission of 3D scenes. The crate aims to provide
rustic utilities that make working with glTF simple and intuitive.
Installation
Add gltf version 0.8 to your Cargo.toml.
[dependencies.gltf]
version = "0.8"
Examples
Walking the node hierarchy
Below demonstates visiting the root Nodes of every Scene, printing the
number of children each node has.
# fn run() -> Result<(), Box<std::error::Error>> {
let file = std::fs::File::open("examples/Box.gltf")?;
let reader = std::io::BufReader::new(file);
let json = gltf::json::from_reader(reader)?;
let gltf = gltf::Gltf::from_json(json);
for scene in gltf.scenes() {
for node in scene.nodes() {
println!(
"Node {} has {} children",
node.index(),
node.children().count(),
);
}
}
# Ok(())
# }
# fn main() {
# let _ = run().expect("No runtime errors");
# }
Providing Gltf with external buffer data
The Source trait provides glTF objects with their buffer data. This allows
the crate to provide more abstractions such as iterating over the positions of
a Primitive. See the documentation of Loaded for all the methods available
for loaded glTF.
The gltf-importer crate contains the reference implementation of the
Source trait and may be used to read buffer data from the file system.
# use gltf::json;
# use gltf::Gltf;
# fn run() -> Result<(), Box<std::error::Error>> {
# let path = "./glTF-Sample-Models/2.0/Box/glTF/Box.gltf";
# let file = std::fs::File::open(path)?;
# let reader = std::io::BufReader::new(file);
# let json = json::from_reader(reader)?;
# let gltf = Gltf::from_json(json);
#[derive(Debug)]
struct BoxExampleData(&'static [u8]);
impl gltf::Source for BoxExampleData {
fn source_buffer(&self, _: &gltf::Buffer) -> &[u8] {
self.0
}
}
let buffer_data = include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/examples/Box0.bin"));
let data = BoxExampleData(buffer_data);
let loaded_gltf = gltf.loaded(&data);
for mesh in loaded_gltf.meshes() {
for primitive in mesh.primitives() {
if let Some(iter) = primitive.indices_u32() {
let indices: Vec<u32> = iter.collect();
println!("{:?}", indices);
}
}
}
# Ok(())
# }
# fn main() {
# let _ = run().expect("No runtime errors");
# }