From 20244e1e4e8938b2e51d109a4bc2f57946e5ee5d Mon Sep 17 00:00:00 2001 From: Syoyo Fujita Date: Thu, 15 Mar 2018 11:01:05 -0500 Subject: [PATCH] Fix storing uri to `Buffer.uri`. Fixes #50. Fix decoding DataURI with 'data:application/gltf-buffer;base64' mime. --- tiny_gltf.h | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/tiny_gltf.h b/tiny_gltf.h index 7d26b95..31d118f 100644 --- a/tiny_gltf.h +++ b/tiny_gltf.h @@ -1282,6 +1282,11 @@ static bool IsDataURI(const std::string &in) { return true; } + header = "data:application/gltf-buffer;base64,"; + if (in.find(header) == 0) { + return true; + } + return false; } @@ -1329,6 +1334,13 @@ static bool DecodeDataURI(std::vector *out, } } + if (data.empty()) { + header = "data:application/gltf-buffer;base64,"; + if (in.find(header) == 0) { + data = base64_decode(in.substr(header.size())); + } + } + if (data.empty()) { return false; } @@ -1774,11 +1786,11 @@ static bool ParseBuffer(Buffer *buffer, std::string *err, } // In glTF 2.0, uri is not mandatory anymore - std::string uri; - ParseStringProperty(&uri, err, o, "uri", false, "Buffer"); + buffer->uri.clear(); + ParseStringProperty(&buffer->uri, err, o, "uri", false, "Buffer"); // having an empty uri for a non embedded image should not be valid - if (!is_binary && uri.empty()) { + if (!is_binary && buffer->uri.empty()) { if (err) { (*err) += "'uri' is missing from non binary glTF file buffer.\n"; } @@ -1798,9 +1810,9 @@ static bool ParseBuffer(Buffer *buffer, std::string *err, if (is_binary) { // Still binary glTF accepts external dataURI. First try external resources. - if (!uri.empty()) { + if (!buffer->uri.empty()) { // External .bin file. - LoadExternalFile(&buffer->data, err, uri, basedir, bytes, true); + LoadExternalFile(&buffer->data, err, buffer->uri, basedir, bytes, true); } else { // load data from (embedded) binary data @@ -1828,16 +1840,16 @@ static bool ParseBuffer(Buffer *buffer, std::string *err, } } else { - if (IsDataURI(uri)) { - if (!DecodeDataURI(&buffer->data, uri, bytes, true)) { + if (IsDataURI(buffer->uri)) { + if (!DecodeDataURI(&buffer->data, buffer->uri, bytes, true)) { if (err) { - (*err) += "Failed to decode 'uri' : " + uri + " in Buffer\n"; + (*err) += "Failed to decode 'uri' : " + buffer->uri + " in Buffer\n"; } return false; } } else { // Assume external .bin file. - if (!LoadExternalFile(&buffer->data, err, uri, basedir, bytes, true)) { + if (!LoadExternalFile(&buffer->data, err, buffer->uri, basedir, bytes, true)) { return false; } }