1use base64;
2use gltf::json;
3
4pub 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}