From 02e8b8da1e25cd7409d4974b7899e8dfe0c43243 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 24 Aug 2023 10:25:20 +1000 Subject: [PATCH 1/2] Raise a warning when encountering emissiveFactor with array length of 4 instead of aborting the model loading --- tiny_gltf.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tiny_gltf.h b/tiny_gltf.h index 65c19ee..0a1a291 100644 --- a/tiny_gltf.h +++ b/tiny_gltf.h @@ -5192,7 +5192,7 @@ static bool ParsePbrMetallicRoughness( return true; } -static bool ParseMaterial(Material *material, std::string *err, +static bool ParseMaterial(Material *material, std::string *err, std::string *warn, const detail::json &o, bool store_original_json_for_extras_and_extensions) { ParseStringProperty(&material->name, err, o, "name", /* required */ false); @@ -5200,7 +5200,15 @@ static bool ParseMaterial(Material *material, std::string *err, if (ParseNumberArrayProperty(&material->emissiveFactor, err, o, "emissiveFactor", /* required */ false)) { - if (material->emissiveFactor.size() != 3) { + if (material->emissiveFactor.size() == 4) { + if (warn) { + (*warn) += + "Array length of `emissiveFactor` parameter in " + "material must be 3, but got 4\n"; + } + material->emissiveFactor.resize(3); + } + else if (material->emissiveFactor.size() != 3) { if (err) { (*err) += "Array length of `emissiveFactor` parameter in " @@ -6198,7 +6206,7 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, Material material; ParseStringProperty(&material.name, err, o, "name", false); - if (!ParseMaterial(&material, err, o, + if (!ParseMaterial(&material, err, warn, o, store_original_json_for_extras_and_extensions_)) { return false; } From 8c85d5e387ab8a2507defaf396b8a10c1312f6a6 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 28 Aug 2023 12:56:09 +1000 Subject: [PATCH 2/2] Add method to set parsing strictness --- tiny_gltf.h | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/tiny_gltf.h b/tiny_gltf.h index 0a1a291..3e807cc 100644 --- a/tiny_gltf.h +++ b/tiny_gltf.h @@ -195,6 +195,11 @@ typedef enum { OBJECT_TYPE } Type; +typedef enum { + PERMISSIVE, + STRICT +} ParseStrictness; + static inline int32_t GetComponentSizeInBytes(uint32_t componentType) { if (componentType == TINYGLTF_COMPONENT_TYPE_BYTE) { return 1; @@ -1463,6 +1468,11 @@ class TinyGLTF { bool embedImages, bool embedBuffers, bool prettyPrint, bool writeBinary); + /// + /// Sets the parsing strictness. + /// + void SetParseStrictness(ParseStrictness strictness); + /// /// Set callback to use for loading image data /// @@ -1552,6 +1562,8 @@ class TinyGLTF { size_t bin_size_ = 0; bool is_binary_ = false; + ParseStrictness strictness_ = ParseStrictness::STRICT; + bool serialize_default_values_ = false; ///< Serialize default values? bool store_original_json_for_extras_and_extensions_ = false; @@ -2553,6 +2565,10 @@ static bool LoadExternalFile(std::vector *out, std::string *err, return true; } +void TinyGLTF::SetParseStrictness(ParseStrictness strictness) { + strictness_ = strictness; +} + void TinyGLTF::SetImageLoader(LoadImageDataFunction func, void *user_data) { LoadImageData = func; load_image_user_data_ = user_data; @@ -5194,13 +5210,14 @@ static bool ParsePbrMetallicRoughness( static bool ParseMaterial(Material *material, std::string *err, std::string *warn, const detail::json &o, - bool store_original_json_for_extras_and_extensions) { + bool store_original_json_for_extras_and_extensions, + ParseStrictness strictness) { ParseStringProperty(&material->name, err, o, "name", /* required */ false); if (ParseNumberArrayProperty(&material->emissiveFactor, err, o, "emissiveFactor", /* required */ false)) { - if (material->emissiveFactor.size() == 4) { + if (strictness==ParseStrictness::PERMISSIVE && material->emissiveFactor.size() == 4) { if (warn) { (*warn) += "Array length of `emissiveFactor` parameter in " @@ -6207,7 +6224,8 @@ bool TinyGLTF::LoadFromString(Model *model, std::string *err, std::string *warn, ParseStringProperty(&material.name, err, o, "name", false); if (!ParseMaterial(&material, err, warn, o, - store_original_json_for_extras_and_extensions_)) { + store_original_json_for_extras_and_extensions_, + strictness_)) { return false; }