Skip to content

Commit

Permalink
Merge pull request #445 from nyalldawson/permissive
Browse files Browse the repository at this point in the history
Be tolerant when encountering emissiveFactor with array length 4
  • Loading branch information
syoyo authored Sep 1, 2023
2 parents ddc76f7 + 8c85d5e commit acf1e8a
Showing 1 changed file with 31 additions and 5 deletions.
36 changes: 31 additions & 5 deletions tiny_gltf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
///
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -2553,6 +2565,10 @@ static bool LoadExternalFile(std::vector<unsigned char> *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;
Expand Down Expand Up @@ -5192,15 +5208,24 @@ 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) {
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() != 3) {
if (strictness==ParseStrictness::PERMISSIVE && 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 "
Expand Down Expand Up @@ -6198,8 +6223,9 @@ 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,
store_original_json_for_extras_and_extensions_)) {
if (!ParseMaterial(&material, err, warn, o,
store_original_json_for_extras_and_extensions_,
strictness_)) {
return false;
}

Expand Down

0 comments on commit acf1e8a

Please sign in to comment.