blob: 8ae20bc6d7b55c94af0ee414ed725ceca9f6cd27 [file] [log] [blame]
Syoyo Fujita2840a0e2017-06-21 02:52:11 +09001#define TINYGLTF_IMPLEMENTATION
Syoyo Fujitaa4d26882015-12-20 20:27:54 +09002#define STB_IMAGE_IMPLEMENTATION
johan bowaldef151a42018-04-01 13:44:48 +02003#define STB_IMAGE_WRITE_IMPLEMENTATION
Syoyo Fujita2840a0e2017-06-21 02:52:11 +09004#include "tiny_gltf.h"
Syoyo Fujitaa4d26882015-12-20 20:27:54 +09005
Syoyo Fujitaa4d26882015-12-20 20:27:54 +09006#include <cstdio>
Syoyo Fujita8c5ab032016-06-19 18:15:32 +09007#include <fstream>
Syoyo Fujitaa4d26882015-12-20 20:27:54 +09008#include <iostream>
9
Syoyo Fujitabeded612016-05-01 20:03:43 +090010static std::string GetFilePathExtension(const std::string &FileName) {
11 if (FileName.find_last_of(".") != std::string::npos)
12 return FileName.substr(FileName.find_last_of(".") + 1);
13 return "";
14}
15
16static std::string PrintMode(int mode) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +090017 if (mode == TINYGLTF_MODE_POINTS) {
18 return "POINTS";
19 } else if (mode == TINYGLTF_MODE_LINE) {
20 return "LINE";
21 } else if (mode == TINYGLTF_MODE_LINE_LOOP) {
22 return "LINE_LOOP";
23 } else if (mode == TINYGLTF_MODE_TRIANGLES) {
24 return "TRIANGLES";
25 } else if (mode == TINYGLTF_MODE_TRIANGLE_FAN) {
26 return "TRIANGLE_FAN";
27 } else if (mode == TINYGLTF_MODE_TRIANGLE_STRIP) {
28 return "TRIANGLE_STRIP";
29 }
30 return "**UNKNOWN**";
31}
32
Syoyo Fujitad286bd92016-06-06 01:20:32 +090033static std::string PrintTarget(int target) {
34 if (target == 34962) {
35 return "GL_ARRAY_BUFFER";
36 } else if (target == 34963) {
37 return "GL_ELEMENT_ARRAY_BUFFER";
38 } else {
39 return "**UNKNOWN**";
40 }
41}
42
Syoyo Fujitabeded612016-05-01 20:03:43 +090043static std::string PrintType(int ty) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +090044 if (ty == TINYGLTF_TYPE_SCALAR) {
45 return "SCALAR";
46 } else if (ty == TINYGLTF_TYPE_VECTOR) {
47 return "VECTOR";
48 } else if (ty == TINYGLTF_TYPE_VEC2) {
49 return "VEC2";
50 } else if (ty == TINYGLTF_TYPE_VEC3) {
51 return "VEC3";
52 } else if (ty == TINYGLTF_TYPE_VEC4) {
53 return "VEC4";
54 } else if (ty == TINYGLTF_TYPE_MATRIX) {
55 return "MATRIX";
56 } else if (ty == TINYGLTF_TYPE_MAT2) {
57 return "MAT2";
58 } else if (ty == TINYGLTF_TYPE_MAT3) {
59 return "MAT3";
60 } else if (ty == TINYGLTF_TYPE_MAT4) {
61 return "MAT4";
62 }
63 return "**UNKNOWN**";
64}
65
Syoyo Fujitabeded612016-05-01 20:03:43 +090066static std::string PrintComponentType(int ty) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +090067 if (ty == TINYGLTF_COMPONENT_TYPE_BYTE) {
68 return "BYTE";
69 } else if (ty == TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE) {
70 return "UNSIGNED_BYTE";
71 } else if (ty == TINYGLTF_COMPONENT_TYPE_SHORT) {
72 return "SHORT";
73 } else if (ty == TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT) {
74 return "UNSIGNED_SHORT";
75 } else if (ty == TINYGLTF_COMPONENT_TYPE_INT) {
76 return "INT";
77 } else if (ty == TINYGLTF_COMPONENT_TYPE_UNSIGNED_INT) {
78 return "UNSIGNED_INT";
79 } else if (ty == TINYGLTF_COMPONENT_TYPE_FLOAT) {
80 return "FLOAT";
81 } else if (ty == TINYGLTF_COMPONENT_TYPE_DOUBLE) {
82 return "DOUBLE";
83 }
84
85 return "**UNKNOWN**";
86}
87
Syoyo Fujitaf6120152017-05-27 23:51:23 +090088#if 0
Luke San Antonio5415f412016-06-15 14:11:55 -040089static std::string PrintParameterType(int ty) {
90 if (ty == TINYGLTF_PARAMETER_TYPE_BYTE) {
91 return "BYTE";
92 } else if (ty == TINYGLTF_PARAMETER_TYPE_UNSIGNED_BYTE) {
93 return "UNSIGNED_BYTE";
94 } else if (ty == TINYGLTF_PARAMETER_TYPE_SHORT) {
95 return "SHORT";
96 } else if (ty == TINYGLTF_PARAMETER_TYPE_UNSIGNED_SHORT) {
97 return "UNSIGNED_SHORT";
98 } else if (ty == TINYGLTF_PARAMETER_TYPE_INT) {
99 return "INT";
100 } else if (ty == TINYGLTF_PARAMETER_TYPE_UNSIGNED_INT) {
101 return "UNSIGNED_INT";
102 } else if (ty == TINYGLTF_PARAMETER_TYPE_FLOAT) {
103 return "FLOAT";
104 } else if (ty == TINYGLTF_PARAMETER_TYPE_FLOAT_VEC2) {
105 return "FLOAT_VEC2";
106 } else if (ty == TINYGLTF_PARAMETER_TYPE_FLOAT_VEC3) {
107 return "FLOAT_VEC3";
108 } else if (ty == TINYGLTF_PARAMETER_TYPE_FLOAT_VEC4) {
109 return "FLOAT_VEC4";
110 } else if (ty == TINYGLTF_PARAMETER_TYPE_INT_VEC2) {
111 return "INT_VEC2";
112 } else if (ty == TINYGLTF_PARAMETER_TYPE_INT_VEC3) {
113 return "INT_VEC3";
114 } else if (ty == TINYGLTF_PARAMETER_TYPE_INT_VEC4) {
115 return "INT_VEC4";
116 } else if (ty == TINYGLTF_PARAMETER_TYPE_BOOL) {
117 return "BOOL";
118 } else if (ty == TINYGLTF_PARAMETER_TYPE_BOOL_VEC2) {
119 return "BOOL_VEC2";
120 } else if (ty == TINYGLTF_PARAMETER_TYPE_BOOL_VEC3) {
121 return "BOOL_VEC3";
122 } else if (ty == TINYGLTF_PARAMETER_TYPE_BOOL_VEC4) {
123 return "BOOL_VEC4";
124 } else if (ty == TINYGLTF_PARAMETER_TYPE_FLOAT_MAT2) {
125 return "FLOAT_MAT2";
126 } else if (ty == TINYGLTF_PARAMETER_TYPE_FLOAT_MAT3) {
127 return "FLOAT_MAT3";
128 } else if (ty == TINYGLTF_PARAMETER_TYPE_FLOAT_MAT4) {
129 return "FLOAT_MAT4";
130 } else if (ty == TINYGLTF_PARAMETER_TYPE_SAMPLER_2D) {
131 return "SAMPLER_2D";
132 }
133
134 return "**UNKNOWN**";
135}
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900136#endif
Syoyo Fujitac2615632016-06-19 21:56:06 +0900137
138static std::string PrintWrapMode(int mode) {
Cemalettin Dervisf889d2b2017-12-07 21:58:15 +0100139 if (mode == TINYGLTF_TEXTURE_WRAP_REPEAT) {
Syoyo Fujitac2615632016-06-19 21:56:06 +0900140 return "REPEAT";
141 } else if (mode == TINYGLTF_TEXTURE_WRAP_CLAMP_TO_EDGE) {
142 return "CLAMP_TO_EDGE";
143 } else if (mode == TINYGLTF_TEXTURE_WRAP_MIRRORED_REPEAT) {
144 return "MIRRORED_REPEAT";
145 }
146
147 return "**UNKNOWN**";
148}
149
150static std::string PrintFilterMode(int mode) {
151 if (mode == TINYGLTF_TEXTURE_FILTER_NEAREST) {
152 return "NEAREST";
153 } else if (mode == TINYGLTF_TEXTURE_FILTER_LINEAR) {
154 return "LINEAR";
155 } else if (mode == TINYGLTF_TEXTURE_FILTER_NEAREST_MIPMAP_NEAREST) {
156 return "NEAREST_MIPMAP_NEAREST";
157 } else if (mode == TINYGLTF_TEXTURE_FILTER_NEAREST_MIPMAP_LINEAR) {
158 return "NEAREST_MIPMAP_LINEAR";
159 } else if (mode == TINYGLTF_TEXTURE_FILTER_LINEAR_MIPMAP_NEAREST) {
160 return "LINEAR_MIPMAP_NEAREST";
161 } else if (mode == TINYGLTF_TEXTURE_FILTER_LINEAR_MIPMAP_LINEAR) {
162 return "LINEAR_MIPMAP_LINEAR";
163 }
164 return "**UNKNOWN**";
165}
166
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900167static std::string PrintIntArray(const std::vector<int> &arr) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900168 if (arr.size() == 0) {
169 return "";
170 }
171
172 std::stringstream ss;
173 ss << "[ ";
174 for (size_t i = 0; i < arr.size(); i++) {
175 ss << arr[i] << ((i != arr.size() - 1) ? ", " : "");
176 }
177 ss << " ]";
178
179 return ss.str();
180}
181
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900182static std::string PrintFloatArray(const std::vector<double> &arr) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900183 if (arr.size() == 0) {
184 return "";
185 }
186
187 std::stringstream ss;
188 ss << "[ ";
189 for (size_t i = 0; i < arr.size(); i++) {
190 ss << arr[i] << ((i != arr.size() - 1) ? ", " : "");
191 }
192 ss << " ]";
193
194 return ss.str();
195}
196
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900197static std::string Indent(const int indent) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900198 std::string s;
199 for (int i = 0; i < indent; i++) {
200 s += " ";
201 }
202
203 return s;
204}
205
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900206static std::string PrintParameterValue(const tinygltf::Parameter &param) {
Luke San Antonio5415f412016-06-15 14:11:55 -0400207 if (!param.number_array.empty()) {
208 return PrintFloatArray(param.number_array);
209 } else {
210 return param.string_value;
211 }
212}
213
Syoyo Fujita7b0bbc62018-04-05 01:27:03 +0900214#if 0
Syoyo Fujitad1f8bae2018-03-21 18:48:03 +0900215static std::string PrintParameterMap(const tinygltf::ParameterMap &pmap) {
216 std::stringstream ss;
217
218 ss << pmap.size() << std::endl;
219 for (auto &kv : pmap) {
220 ss << kv.first << " : " << PrintParameterValue(kv.second) << std::endl;
221 }
222
223 return ss.str();
224}
Syoyo Fujita7b0bbc62018-04-05 01:27:03 +0900225#endif
Syoyo Fujitad1f8bae2018-03-21 18:48:03 +0900226
Syoyo Fujita5b407452017-06-04 17:42:41 +0900227static std::string PrintValue(const std::string &name,
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900228 const tinygltf::Value &value, const int indent, const bool tag = true) {
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900229 std::stringstream ss;
230
231 if (value.IsObject()) {
Syoyo Fujita5b407452017-06-04 17:42:41 +0900232 const tinygltf::Value::Object &o = value.Get<tinygltf::Value::Object>();
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900233 tinygltf::Value::Object::const_iterator it(o.begin());
234 tinygltf::Value::Object::const_iterator itEnd(o.end());
235 for (; it != itEnd; it++) {
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900236 ss << PrintValue(it->first, it->second, indent + 1) << std::endl;
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900237 }
238 } else if (value.IsString()) {
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900239 if (tag) {
240 ss << Indent(indent) << name << " : " << value.Get<std::string>();
241 } else {
242 ss << " " << value.Get<std::string>() << " ";
243 }
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900244 } else if (value.IsBool()) {
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900245 if (tag) {
246 ss << Indent(indent) << name << " : " << value.Get<bool>();
247 } else {
248 ss << " " << value.Get<bool>() << " ";
249 }
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900250 } else if (value.IsNumber()) {
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900251 if (tag) {
252 ss << Indent(indent) << name << " : " << value.Get<double>();
253 } else {
254 ss << " " << value.Get<double>() << " ";
255 }
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900256 } else if (value.IsInt()) {
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900257 if (tag) {
258 ss << Indent(indent) << name << " : " << value.Get<int>();
259 } else {
260 ss << " " << value.Get<int>() << " ";
261 }
262 } else if (value.IsArray()) {
263 ss << Indent(indent) << name << " [ ";
264 for (size_t i = 0; i < value.Size(); i++) {
Syoyo Fujita48f6db02018-04-15 18:40:55 +0900265 ss << PrintValue("", value.Get(int(i)), indent + 1, /* tag */false);
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900266 if (i != (value.ArrayLen()-1)) {
267 ss << ", ";
268 }
269
270 }
271 ss << Indent(indent) << "] ";
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900272 }
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900273
274 // @todo { binary }
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900275
276 return ss.str();
277}
278
Syoyo Fujitabeded612016-05-01 20:03:43 +0900279static void DumpNode(const tinygltf::Node &node, int indent) {
Syoyo Fujitabde70212016-02-07 17:38:17 +0900280 std::cout << Indent(indent) << "name : " << node.name << std::endl;
281 std::cout << Indent(indent) << "camera : " << node.camera << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900282 std::cout << Indent(indent) << "mesh : " << node.mesh << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900283 if (!node.rotation.empty()) {
Syoyo Fujitabde70212016-02-07 17:38:17 +0900284 std::cout << Indent(indent)
285 << "rotation : " << PrintFloatArray(node.rotation)
286 << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900287 }
288 if (!node.scale.empty()) {
Syoyo Fujitabde70212016-02-07 17:38:17 +0900289 std::cout << Indent(indent)
290 << "scale : " << PrintFloatArray(node.scale) << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900291 }
292 if (!node.translation.empty()) {
Syoyo Fujitabde70212016-02-07 17:38:17 +0900293 std::cout << Indent(indent)
294 << "translation : " << PrintFloatArray(node.translation)
295 << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900296 }
297
298 if (!node.matrix.empty()) {
Syoyo Fujitabde70212016-02-07 17:38:17 +0900299 std::cout << Indent(indent)
300 << "matrix : " << PrintFloatArray(node.matrix) << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900301 }
302
Syoyo Fujitabde70212016-02-07 17:38:17 +0900303 std::cout << Indent(indent)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900304 << "children : " << PrintIntArray(node.children) << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900305}
306
Syoyo Fujita5b407452017-06-04 17:42:41 +0900307static void DumpStringIntMap(const std::map<std::string, int> &m, int indent) {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900308 std::map<std::string, int>::const_iterator it(m.begin());
309 std::map<std::string, int>::const_iterator itEnd(m.end());
Luke San Antonio5415f412016-06-15 14:11:55 -0400310 for (; it != itEnd; it++) {
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900311 std::cout << Indent(indent) << it->first << ": " << it->second << std::endl;
Luke San Antonio5415f412016-06-15 14:11:55 -0400312 }
313}
314
Syoyo Fujitabeded612016-05-01 20:03:43 +0900315static void DumpPrimitive(const tinygltf::Primitive &primitive, int indent) {
Syoyo Fujitabde70212016-02-07 17:38:17 +0900316 std::cout << Indent(indent) << "material : " << primitive.material
317 << std::endl;
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900318 std::cout << Indent(indent) << "indices : " << primitive.indices << std::endl;
Syoyo Fujitabde70212016-02-07 17:38:17 +0900319 std::cout << Indent(indent) << "mode : " << PrintMode(primitive.mode)
320 << "(" << primitive.mode << ")" << std::endl;
321 std::cout << Indent(indent)
322 << "attributes(items=" << primitive.attributes.size() << ")"
323 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900324 DumpStringIntMap(primitive.attributes, indent + 1);
Syoyo Fujitaf696c6f2016-10-17 03:48:55 +0900325
Syoyo Fujita5b407452017-06-04 17:42:41 +0900326 std::cout << Indent(indent) << "extras :" << std::endl
327 << PrintValue("extras", primitive.extras, indent + 1) << std::endl;
Luke San Antonio5415f412016-06-15 14:11:55 -0400328}
329
Syoyo Fujitad1f8bae2018-03-21 18:48:03 +0900330static void DumpExtensions(const tinygltf::ExtensionMap &extension, const int indent)
331{
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900332 // TODO(syoyo): pritty print Value
Syoyo Fujitad1f8bae2018-03-21 18:48:03 +0900333 for (auto &e : extension) {
334 std::cout << Indent(indent) << e.first << std::endl;
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900335 std::cout << PrintValue("extensions", e.second, indent+1) << std::endl;
Syoyo Fujitad1f8bae2018-03-21 18:48:03 +0900336 }
337}
338
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900339static void Dump(const tinygltf::Model &model) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900340 std::cout << "=== Dump glTF ===" << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900341 std::cout << "asset.copyright : " << model.asset.copyright
Syoyo Fujitabde70212016-02-07 17:38:17 +0900342 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900343 std::cout << "asset.generator : " << model.asset.generator
Syoyo Fujitabde70212016-02-07 17:38:17 +0900344 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900345 std::cout << "asset.version : " << model.asset.version
Syoyo Fujitabde70212016-02-07 17:38:17 +0900346 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900347 std::cout << "asset.minVersion : " << model.asset.minVersion
Syoyo Fujitabde70212016-02-07 17:38:17 +0900348 << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900349 std::cout << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900350
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900351 std::cout << "=== Dump scene ===" << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900352 std::cout << "defaultScene: " << model.defaultScene << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900353
354 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900355 std::cout << "scenes(items=" << model.scenes.size() << ")" << std::endl;
356 for (size_t i = 0; i < model.scenes.size(); i++) {
Syoyo Fujita5b407452017-06-04 17:42:41 +0900357 std::cout << Indent(1) << "scene[" << i
358 << "] name : " << model.scenes[i].name << std::endl;
Syoyo Fujitad1f8bae2018-03-21 18:48:03 +0900359 DumpExtensions(model.scenes[i].extensions, 1);
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900360 }
361 }
362
363 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900364 std::cout << "meshes(item=" << model.meshes.size() << ")" << std::endl;
365 for (size_t i = 0; i < model.meshes.size(); i++) {
Syoyo Fujita5b407452017-06-04 17:42:41 +0900366 std::cout << Indent(1) << "name : " << model.meshes[i].name
367 << std::endl;
Syoyo Fujitabde70212016-02-07 17:38:17 +0900368 std::cout << Indent(1)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900369 << "primitives(items=" << model.meshes[i].primitives.size()
Syoyo Fujitabde70212016-02-07 17:38:17 +0900370 << "): " << std::endl;
371
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900372 for (size_t k = 0; k < model.meshes[i].primitives.size(); k++) {
373 DumpPrimitive(model.meshes[i].primitives[k], 2);
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900374 }
375 }
376 }
377
378 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900379 for (size_t i = 0; i < model.accessors.size(); i++) {
380 const tinygltf::Accessor &accessor = model.accessors[i];
381 std::cout << Indent(1) << "name : " << accessor.name << std::endl;
382 std::cout << Indent(2) << "bufferView : " << accessor.bufferView
Syoyo Fujitabde70212016-02-07 17:38:17 +0900383 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900384 std::cout << Indent(2) << "byteOffset : " << accessor.byteOffset
Syoyo Fujitabde70212016-02-07 17:38:17 +0900385 << std::endl;
Syoyo Fujitabde70212016-02-07 17:38:17 +0900386 std::cout << Indent(2) << "componentType: "
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900387 << PrintComponentType(accessor.componentType) << "("
388 << accessor.componentType << ")" << std::endl;
389 std::cout << Indent(2) << "count : " << accessor.count
Syoyo Fujitabde70212016-02-07 17:38:17 +0900390 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900391 std::cout << Indent(2) << "type : " << PrintType(accessor.type)
Syoyo Fujitabde70212016-02-07 17:38:17 +0900392 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900393 if (!accessor.minValues.empty()) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900394 std::cout << Indent(2) << "min : [";
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900395 for (size_t k = 0; k < accessor.minValues.size(); k++) {
396 std::cout << accessor.minValues[k]
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900397 << ((k != accessor.minValues.size() - 1) ? ", " : "");
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900398 }
399 std::cout << "]" << std::endl;
400 }
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900401 if (!accessor.maxValues.empty()) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900402 std::cout << Indent(2) << "max : [";
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900403 for (size_t k = 0; k < accessor.maxValues.size(); k++) {
404 std::cout << accessor.maxValues[k]
Syoyo Fujita1e629c82018-04-05 15:37:57 +0900405 << ((k != accessor.maxValues.size() - 1) ? ", " : "");
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900406 }
407 std::cout << "]" << std::endl;
408 }
409 }
410 }
411
412 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900413 std::cout << "animations(items=" << model.animations.size() << ")"
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900414 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900415 for (size_t i = 0; i < model.animations.size(); i++) {
416 const tinygltf::Animation &animation = model.animations[i];
Syoyo Fujita5b407452017-06-04 17:42:41 +0900417 std::cout << Indent(1) << "name : " << animation.name
418 << std::endl;
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900419
420 std::cout << Indent(1) << "channels : [ " << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900421 for (size_t j = 0; i < animation.channels.size(); i++) {
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900422 std::cout << Indent(2)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900423 << "sampler : " << animation.channels[j].sampler
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900424 << std::endl;
425 std::cout << Indent(2)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900426 << "target.id : " << animation.channels[j].target_node
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900427 << std::endl;
428 std::cout << Indent(2)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900429 << "target.path : " << animation.channels[j].target_path
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900430 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900431 std::cout << ((i != (animation.channels.size() - 1)) ? " , " : "");
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900432 }
433 std::cout << " ]" << std::endl;
434
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900435 std::cout << Indent(1) << "samplers(items=" << animation.samplers.size()
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900436 << ")" << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900437 for (size_t j = 0; j < animation.samplers.size(); j++) {
Syoyo Fujitad7ec19c2017-05-30 00:52:00 +0900438 const tinygltf::AnimationSampler &sampler = animation.samplers[j];
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900439 std::cout << Indent(2) << "input : " << sampler.input
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900440 << std::endl;
Syoyo Fujita5b407452017-06-04 17:42:41 +0900441 std::cout << Indent(2) << "interpolation : " << sampler.interpolation
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900442 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900443 std::cout << Indent(2) << "output : " << sampler.output
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900444 << std::endl;
445 }
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900446 }
447 }
448
449 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900450 std::cout << "bufferViews(items=" << model.bufferViews.size() << ")"
Syoyo Fujitabde70212016-02-07 17:38:17 +0900451 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900452 for (size_t i = 0; i < model.bufferViews.size(); i++) {
453 const tinygltf::BufferView &bufferView = model.bufferViews[i];
Syoyo Fujita5b407452017-06-04 17:42:41 +0900454 std::cout << Indent(1) << "name : " << bufferView.name
455 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900456 std::cout << Indent(2) << "buffer : " << bufferView.buffer
Syoyo Fujitabde70212016-02-07 17:38:17 +0900457 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900458 std::cout << Indent(2) << "byteLength : " << bufferView.byteLength
Syoyo Fujitabde70212016-02-07 17:38:17 +0900459 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900460 std::cout << Indent(2) << "byteOffset : " << bufferView.byteOffset
Syoyo Fujitabde70212016-02-07 17:38:17 +0900461 << std::endl;
Syoyo Fujitad9d012a2017-07-12 18:29:29 +0900462 std::cout << Indent(2) << "byteStride : " << bufferView.byteStride
463 << std::endl;
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900464 std::cout << Indent(2)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900465 << "target : " << PrintTarget(bufferView.target)
Syoyo Fujitad286bd92016-06-06 01:20:32 +0900466 << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900467 }
468 }
469
470 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900471 std::cout << "buffers(items=" << model.buffers.size() << ")" << std::endl;
472 for (size_t i = 0; i < model.buffers.size(); i++) {
473 const tinygltf::Buffer &buffer = model.buffers[i];
474 std::cout << Indent(1) << "name : " << buffer.name << std::endl;
475 std::cout << Indent(2) << "byteLength : " << buffer.data.size()
Syoyo Fujitabde70212016-02-07 17:38:17 +0900476 << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900477 }
478 }
479
480 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900481 std::cout << "materials(items=" << model.materials.size() << ")"
Syoyo Fujitabde70212016-02-07 17:38:17 +0900482 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900483 for (size_t i = 0; i < model.materials.size(); i++) {
484 const tinygltf::Material &material = model.materials[i];
485 std::cout << Indent(1) << "name : " << material.name << std::endl;
Syoyo Fujita5b407452017-06-04 17:42:41 +0900486 std::cout << Indent(1) << "values(items=" << material.values.size() << ")"
487 << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900488
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900489 tinygltf::ParameterMap::const_iterator p(material.values.begin());
490 tinygltf::ParameterMap::const_iterator pEnd(material.values.end());
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900491 for (; p != pEnd; p++) {
Luke San Antonio5415f412016-06-15 14:11:55 -0400492 std::cout << Indent(2) << p->first << ": "
493 << PrintParameterValue(p->second) << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900494 }
495 }
496 }
497
498 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900499 std::cout << "nodes(items=" << model.nodes.size() << ")" << std::endl;
500 for (size_t i = 0; i < model.nodes.size(); i++) {
501 const tinygltf::Node &node = model.nodes[i];
502 std::cout << Indent(1) << "name : " << node.name << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900503
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900504 DumpNode(node, 2);
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900505 }
506 }
Syoyo Fujitabde70212016-02-07 17:38:17 +0900507
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900508 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900509 std::cout << "images(items=" << model.images.size() << ")" << std::endl;
510 for (size_t i = 0; i < model.images.size(); i++) {
511 const tinygltf::Image &image = model.images[i];
512 std::cout << Indent(1) << "name : " << image.name << std::endl;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900513
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900514 std::cout << Indent(2) << "width : " << image.width << std::endl;
Syoyo Fujita5b407452017-06-04 17:42:41 +0900515 std::cout << Indent(2) << "height : " << image.height << std::endl;
516 std::cout << Indent(2) << "component : " << image.component << std::endl;
Syoyo Fujitabde70212016-02-07 17:38:17 +0900517 }
518 }
Luke San Antonio5415f412016-06-15 14:11:55 -0400519
520 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900521 std::cout << "textures(items=" << model.textures.size() << ")" << std::endl;
522 for (size_t i = 0; i < model.textures.size(); i++) {
523 const tinygltf::Texture &texture = model.textures[i];
524 std::cout << Indent(1) << "sampler : " << texture.sampler
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900525 << std::endl;
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900526 std::cout << Indent(1) << "source : " << texture.source
Luke San Antonio5415f412016-06-15 14:11:55 -0400527 << std::endl;
528 }
529 }
530
531 {
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900532 std::cout << "samplers(items=" << model.samplers.size() << ")" << std::endl;
Luke San Antonio5415f412016-06-15 14:11:55 -0400533
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900534 for (size_t i = 0; i < model.samplers.size(); i++) {
535 const tinygltf::Sampler &sampler = model.samplers[i];
536 std::cout << Indent(1) << "name (id) : " << sampler.name << std::endl;
Syoyo Fujita8c5ab032016-06-19 18:15:32 +0900537 std::cout << Indent(2)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900538 << "minFilter : " << PrintFilterMode(sampler.minFilter)
Syoyo Fujitac2615632016-06-19 21:56:06 +0900539 << std::endl;
540 std::cout << Indent(2)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900541 << "magFilter : " << PrintFilterMode(sampler.magFilter)
Syoyo Fujitac2615632016-06-19 21:56:06 +0900542 << std::endl;
543 std::cout << Indent(2)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900544 << "wrapS : " << PrintWrapMode(sampler.wrapS)
Syoyo Fujitac2615632016-06-19 21:56:06 +0900545 << std::endl;
546 std::cout << Indent(2)
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900547 << "wrapT : " << PrintWrapMode(sampler.wrapT)
Syoyo Fujitac2615632016-06-19 21:56:06 +0900548 << std::endl;
549 }
550 }
Syoyo Fujita7b6edab2017-07-13 18:20:14 +0900551
552 {
553 std::cout << "cameras(items=" << model.cameras.size() << ")" << std::endl;
554
555 for (size_t i = 0; i < model.cameras.size(); i++) {
556 const tinygltf::Camera &camera = model.cameras[i];
557 std::cout << Indent(1) << "name (id) : " << camera.name << std::endl;
558 std::cout << Indent(1) << "type : " << camera.type << std::endl;
559
560 if (camera.type.compare("perspective") == 0) {
561 std::cout << Indent(2)
562 << "aspectRatio : " << camera.perspective.aspectRatio
563 << std::endl;
564 std::cout << Indent(2) << "yfov : " << camera.perspective.yfov
565 << std::endl;
566 std::cout << Indent(2) << "zfar : " << camera.perspective.zfar
567 << std::endl;
568 std::cout << Indent(2) << "znear : " << camera.perspective.znear
569 << std::endl;
570 } else if (camera.type.compare("orthographic") == 0) {
571 std::cout << Indent(2) << "xmag : " << camera.orthographic.xmag
572 << std::endl;
573 std::cout << Indent(2) << "ymag : " << camera.orthographic.ymag
574 << std::endl;
575 std::cout << Indent(2) << "zfar : " << camera.orthographic.zfar
576 << std::endl;
577 std::cout << Indent(2)
578 << "znear : " << camera.orthographic.znear
579 << std::endl;
580 }
581 }
582 }
Syoyo Fujitad1f8bae2018-03-21 18:48:03 +0900583
584 // toplevel extensions
585 {
586 std::cout << "extensions(items=" << model.extensions.size() << ")" << std::endl;
587 DumpExtensions(model.extensions, 1);
588 }
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900589}
590
Syoyo Fujitabde70212016-02-07 17:38:17 +0900591int main(int argc, char **argv) {
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900592 if (argc < 2) {
593 printf("Needs input.gltf\n");
594 exit(1);
595 }
596
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900597 tinygltf::Model model;
Syoyo Fujita2840a0e2017-06-21 02:52:11 +0900598 tinygltf::TinyGLTF gltf_ctx;
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900599 std::string err;
Syoyo Fujita7c8d4ed2018-07-27 16:49:10 +0900600 std::string warn;
Syoyo Fujitabeded612016-05-01 20:03:43 +0900601 std::string input_filename(argv[1]);
602 std::string ext = GetFilePathExtension(input_filename);
Syoyo Fujitabde70212016-02-07 17:38:17 +0900603
Syoyo Fujitabeded612016-05-01 20:03:43 +0900604 bool ret = false;
605 if (ext.compare("glb") == 0) {
Syoyo Fujitad7ec19c2017-05-30 00:52:00 +0900606 std::cout << "Reading binary glTF" << std::endl;
Syoyo Fujitabeded612016-05-01 20:03:43 +0900607 // assume binary glTF.
Syoyo Fujita7c8d4ed2018-07-27 16:49:10 +0900608 ret = gltf_ctx.LoadBinaryFromFile(&model, &err, &warn, input_filename.c_str());
Syoyo Fujitabeded612016-05-01 20:03:43 +0900609 } else {
Syoyo Fujitad7ec19c2017-05-30 00:52:00 +0900610 std::cout << "Reading ASCII glTF" << std::endl;
Syoyo Fujitabeded612016-05-01 20:03:43 +0900611 // assume ascii glTF.
Syoyo Fujita7c8d4ed2018-07-27 16:49:10 +0900612 ret = gltf_ctx.LoadASCIIFromFile(&model, &err, &warn, input_filename.c_str());
Syoyo Fujitabeded612016-05-01 20:03:43 +0900613 }
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900614
Syoyo Fujita7c8d4ed2018-07-27 16:49:10 +0900615 if (!warn.empty()) {
616 printf("Warn: %s\n", warn.c_str());
617 }
618
619
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900620 if (!err.empty()) {
621 printf("Err: %s\n", err.c_str());
622 }
623
624 if (!ret) {
625 printf("Failed to parse glTF\n");
626 return -1;
627 }
628
Syoyo Fujitaf6120152017-05-27 23:51:23 +0900629 Dump(model);
Syoyo Fujitaa4d26882015-12-20 20:27:54 +0900630
631 return 0;
632}