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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
// Copyright 2017 The gltf Library Developers // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. use serde_json; use std::fs::File; use std::io; use std::io::Read; use std::path::Path; use std::collections::HashMap; pub mod accessor; pub mod animation; pub mod asset; pub mod buffer; pub mod camera; pub mod image; pub mod material; pub mod mesh; pub mod node; pub mod program; pub mod sampler; pub mod scene; pub mod shader; pub mod skin; pub mod technique; pub mod texture; #[derive(Debug)] pub enum Error { /// Standard input / output error Io(io::Error), /// Failure when parsing a .gltf metadata file Parse(serde_json::error::Error), } impl From<io::Error> for Error { fn from(err: io::Error) -> Error { Error::Io(err) } } impl From<serde_json::error::Error> for Error { fn from(err: serde_json::error::Error) -> Error { Error::Parse(err) } } #[derive(Debug, Default, Deserialize, Serialize)] pub struct Gltf { /// A dictionary object of accessor objects. /// /// The name of each accessor is an ID in the global glTF namespace that is /// used to reference the accessor. An accessor is a typed view into a /// bufferView. #[serde(default)] pub accessors: HashMap<String, accessor::Accessor>, /// A dictionary object of keyframe animation objects. /// /// The name of each animation is an ID in the global glTF namespace that is /// used to reference the animation. #[serde(default)] pub animation: HashMap<String, animation::Animation>, /// Metadata about the glTF asset. #[serde(default)] pub asset: asset::Asset, /// A dictionary object of buffer objects. /// /// The name of each buffer is an ID in the global glTF namespace that is /// used to reference the buffer. A buffer points to binary geometry, /// animation, or skins. #[serde(default)] pub buffers: HashMap<String, buffer::Buffer>, /// A dictionary object of bufferView objects. /// /// The name of each bufferView is an ID in the global glTF namespace that /// is used to reference the bufferView. A bufferView is a view into a /// buffer generally representing a subset of the buffer. #[serde(rename = "bufferViews")] #[serde(default)] pub buffer_views: HashMap<String, buffer::BufferView>, /// A dictionary object of camera objects. /// /// The name of each camera is an ID in the global glTF namespace that is /// used to reference the camera. A camera defines a projection matrix. #[serde(default)] pub cameras: HashMap<String, camera::Camera>, /// A dictionary object of image objects. /// /// The name of each image is an ID in the global glTF namespace that is /// used to reference the image. An image defines data used to create a /// texture. #[serde(default)] pub images: HashMap<String, image::Image>, /// A dictionary object of material objects. /// /// The name of each material is an ID in the global glTF namespace that is /// used to reference the material. A material defines the appearance of a /// primitive. #[serde(default)] pub materials: HashMap<String, material::Material>, /// A dictionary object of mesh objects. /// /// The name of each mesh is an ID in the global glTF namespace that is used /// to reference the mesh. A mesh is a set of primitives to be rendered. #[serde(default)] pub meshes: HashMap<String, mesh::Mesh>, /// A dictionary object of node objects in the node hierarchy. /// /// The name of each node is an ID in the global glTF namespace that is used /// to reference the node. #[serde(default)] pub nodes: HashMap<String, node::Node>, /// A dictionary object of shader program objects. /// /// The name of each program is an ID in the global glTF namespace that is /// used to reference the program. #[serde(default)] pub programs: HashMap<String, program::Program>, /// A dictionary object of sampler objects. /// /// The name of each sampler is an ID in the global glTF namespace that is /// used to reference the sampler. A sampler contains properties for texture /// filtering and wrapping modes. #[serde(default)] pub samplers: HashMap<String, sampler::Sampler>, /// The ID of the default scene. pub scene: Option<String>, /// A dictionary object of scene objects. /// /// The name of each scene is an ID in the global glTF namespace that is /// used to reference the scene. #[serde(default)] pub scenes: HashMap<String, scene::Scene>, /// A dictionary object of shader objects. /// /// The name of each shader is an ID in the global glTF namespace that is /// used to reference the shader. #[serde(default)] pub shaders: HashMap<String, shader::Shader>, /// A dictionary object of skin objects. /// /// The name of each skin is an ID in the global glTF namespace that is used /// to reference the skin. A skin is defined by joints and matrices. #[serde(default)] pub skins: HashMap<String, skin::Skin>, /// A dictionary object of technique objects. /// /// The name of each technique is an ID in the global glTF namespace that is /// used to reference the technique. A technique is a template for a /// material appearance. #[serde(default)] pub techniques: HashMap<String, technique::Technique>, /// A dictionary object of texture objects. /// /// The name of each texture is an ID in the global glTF namespace that is /// used to reference the texture. #[serde(default)] pub textures: HashMap<String, texture::Texture>, // TODO: extension // TODO: extras } impl Gltf { pub fn open<P: AsRef<Path>>(path: P) -> Result<Self, Error> { let mut file = File::open(path)?; let mut json = String::new(); file.read_to_string(&mut json)?; serde_json::from_str(&json).map_err(|cause| Error::Parse(cause)) } }