blob: 903a5d3cdb5bb3eb1e5cc90fd432422ab642924c [file]
#include <cstdlib>
#include <cstring>
#include <iostream>
#define TINYGLTF3_IMPLEMENTATION
#define TINYGLTF3_ENABLE_FS
#include "tiny_gltf_v3.h"
namespace {
const char *severity_name(tg3_severity severity) {
switch (severity) {
case TG3_SEVERITY_WARNING:
return "warning";
case TG3_SEVERITY_ERROR:
return "error";
default:
return "info";
}
}
void print_errors(std::ostream &os, const tg3_error_stack *errors) {
const uint32_t count = tg3_errors_count(errors);
for (uint32_t i = 0; i < count; ++i) {
const tg3_error_entry *entry = tg3_errors_get(errors, i);
if (!entry) {
continue;
}
os << severity_name(entry->severity);
if (entry->json_path && entry->json_path[0] != '\0') {
os << " " << entry->json_path;
}
if (entry->message && entry->message[0] != '\0') {
os << ": " << entry->message;
}
os << '\n';
}
}
int usage(const char *name) {
std::cerr << "Usage: " << name << " <path/to/model.gltf|model.glb>\n";
return EXIT_FAILURE;
}
} // namespace
int main(int argc, char **argv) {
if (argc != 2) {
return usage(argv[0]);
}
const char *filename = argv[1];
tg3_model model;
tg3_error_stack errors;
tg3_parse_options options;
std::memset(&model, 0, sizeof(model));
model.default_scene = -1;
tg3_error_stack_init(&errors);
tg3_parse_options_init(&options);
tg3_error_code rc =
tg3_parse_file(&model, &errors, filename,
static_cast<uint32_t>(std::strlen(filename)), &options);
if (tg3_errors_count(&errors) > 0) {
print_errors(std::cerr, &errors);
}
if (rc != TG3_OK) {
tg3_model_free(&model);
tg3_error_stack_free(&errors);
return EXIT_FAILURE;
}
tg3_error_stack_free(&errors);
tg3_error_stack_init(&errors);
rc = tg3_validate(&model, &errors);
if (tg3_errors_count(&errors) > 0) {
print_errors(rc == TG3_OK ? std::cout : std::cerr, &errors);
}
if (rc == TG3_OK) {
std::cout << filename << ": valid glTF 2.0\n";
}
tg3_model_free(&model);
tg3_error_stack_free(&errors);
return (rc == TG3_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
}