From 68adc4ba5eadff5a9ab8f98f32bece1e788f8a15 Mon Sep 17 00:00:00 2001 From: Syoyo Fujita Date: Thu, 22 Oct 2020 22:27:12 +0900 Subject: [PATCH] Serialize empty JSON object when material has all default parameters. Fixes #294 . --- tests/tester.cc | 22 ++++++++++++++++++++++ tiny_gltf.h | 10 ++++++++++ 2 files changed, 32 insertions(+) diff --git a/tests/tester.cc b/tests/tester.cc index 012b54d..bc5f819 100644 --- a/tests/tester.cc +++ b/tests/tester.cc @@ -412,6 +412,28 @@ TEST_CASE("image-uri-spaces", "[issue-236]") { REQUIRE(true == ret); } +TEST_CASE("serialize-empty-material", "[issue-294]") { + + tinygltf::Model m; + + tinygltf::Material mat; + mat.pbrMetallicRoughness.baseColorFactor = {1.0f, 1.0f, 1.0f, 1.0f}; // default baseColorFactor + m.materials.push_back(mat); + + std::stringstream os; + + tinygltf::TinyGLTF ctx; + ctx.WriteGltfSceneToStream(&m, os, false, false); + + // use nlohmann json(included inside of tiny_gltf.h) + json j = json::parse(os.str()); + + REQUIRE(1 == j["materials"].size()); + REQUIRE(j["asset"].is_null()); + REQUIRE(j["materials"][0].is_object()); + +} + #ifndef TINYGLTF_NO_FS TEST_CASE("expandpath-utf-8", "[pr-226]") { diff --git a/tiny_gltf.h b/tiny_gltf.h index 88e1093..00875f0 100644 --- a/tiny_gltf.h +++ b/tiny_gltf.h @@ -26,6 +26,7 @@ // THE SOFTWARE. // Version: +// - v2.4.3 Fix null object output when when material has all default parameters. // - v2.4.2 Decode percent-encoded URI. // - v2.4.1 Fix some glTF object class does not have `extensions` and/or // `extras` property. @@ -7225,6 +7226,15 @@ static void SerializeGltfModel(Model *model, json &o) { for (unsigned int i = 0; i < model->materials.size(); ++i) { json material; SerializeGltfMaterial(model->materials[i], material); + + if (JsonIsNull(material)) { + // Issue 294. + // `material` does not have any required parameters + // so the result may be null(unmodified) when all material parameters have default value. + // + // null is not allowed thus we create an empty JSON object. + JsonSetObject(material); + } JsonPushBack(materials, std::move(material)); } JsonAddMember(o, "materials", std::move(materials));