Skip to main content

gl_utils/util/
gltf.rs

1use base64;
2use gltf::json;
3
4/// Create a buffer with base64 encoded embedded URI and return views to each given
5/// sub-buffer
6pub fn json_buffer_views (buffer_index : u32, bytes : &[&[u8]])
7  -> (json::Buffer, Vec <json::buffer::View>)
8{
9  use base64::Engine;
10  let buffer_bytes = bytes.concat();
11  let buffer = json::Buffer {
12    byte_length:  buffer_bytes.len().into(),
13    extensions:   None,
14    extras:       Default::default(),
15    name:         None,
16    uri:          Some (
17      format!("data:application/octet-stream;base64,{}",
18        base64::prelude::BASE64_STANDARD.encode (buffer_bytes))
19    )
20  };
21  let mut views    = vec![];
22  let mut offset   = 0;
23  let buffer_index = json::Index::new (buffer_index);
24  for sub_buffer in bytes.iter() {
25    let byte_length = sub_buffer.len();
26    let view = json::buffer::View {
27      buffer:      buffer_index,
28      byte_length: byte_length.into(),
29      byte_offset: if offset == 0 { None } else { Some (offset.into()) },
30      byte_stride: None,
31      extensions:  None,
32      extras:      Default::default(),
33      name:        None,
34      target:      None
35    };
36    views.push (view);
37    offset += byte_length;
38  }
39  (buffer, views)
40}
41
42pub fn json_accessor (
43  buffer_view_index : u32,
44  count             : u32,
45  type_             : json::accessor::Type,
46  component_type    : json::accessor::ComponentType,
47  min_max           : Option <[[f32; 3]; 2]>
48) -> json::Accessor {
49  let [min, max] = match min_max {
50    Some ([min, max]) => [
51      Some (min.to_vec().into()),
52      Some (max.to_vec().into())
53    ],
54    None => [None, None]
55  };
56  json::Accessor {
57    buffer_view: Some (json::Index::new (buffer_view_index)),
58    byte_offset: None,
59    count:       (count as u64).into(),
60    component_type: json::validation::Checked::Valid (
61      json::accessor::GenericComponentType (component_type)
62    ),
63    extensions:  None,
64    extras:      Default::default(),
65    type_:       json::validation::Checked::Valid (type_),
66    min,
67    max,
68    name:        None,
69    normalized:  false,
70    sparse:      None
71  }
72}
73
74pub fn json_primitive (
75  attribute              : json::mesh::Semantic,
76  mode                   : json::mesh::Mode,
77  indices_accessor_index : u32
78) -> json::mesh::Primitive {
79  json::mesh::Primitive {
80    attributes: FromIterator::from_iter (vec![
81      (json::validation::Checked::Valid (attribute), json::Index::new (0))
82    ]),
83    extensions: None,
84    extras:     Default::default(),
85    indices:    Some (json::Index::new (indices_accessor_index)),
86    material:   None,
87    mode:       json::validation::Checked::Valid (mode),
88    targets:    None
89  }
90}
91
92pub fn json_mesh (primitives : Vec <json::mesh::Primitive>) -> json::Mesh {
93  json::Mesh {
94    extensions: None,
95    extras:     Default::default(),
96    name:       None,
97    primitives,
98    weights:    None,
99  }
100}
101
102pub fn json_node (mesh_index : u32) -> json::Node {
103  json::Node {
104    camera:       None,
105    children:     None,
106    extensions:   None,
107    extras:       Default::default(),
108    matrix:       None,
109    mesh:         Some(json::Index::new (mesh_index)),
110    name:         None,
111    rotation:     None,
112    scale:        None,
113    translation:  None,
114    skin:         None,
115    weights:      None
116  }
117}
118
119pub fn json_root (
120  nodes        : Vec <json::Node>,
121  meshes       : Vec <json::Mesh>,
122  buffers      : Vec <json::Buffer>,
123  buffer_views : Vec <json::buffer::View>,
124  accessors    : Vec <json::Accessor>,
125) -> json::Root {
126  let node_indices = (0..nodes.len() as u32).map (json::Index::new).collect();
127  json::Root {
128    accessors,
129    buffers,
130    buffer_views,
131    meshes,
132    nodes,
133    scenes: vec![json::Scene {
134      extensions: None,
135      extras:     Default::default(),
136      name:       None,
137      nodes:      node_indices
138    }],
139    scene: Some (json::Index::new (0)),
140    .. Default::default()
141  }
142}