Skip to content

Commit

Permalink
Add: Validation for correctly enabled material extensions
Browse files Browse the repository at this point in the history
Also adds some optional tests I've had lying around locally for a while
  • Loading branch information
spnda committed Jan 27, 2024
1 parent aa2e6d4 commit 57b8a74
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ else()
find_package(simdjson CONFIG)
if (simdjson_FOUND)
message(STATUS "fastgltf: Found simdjson config")
target_link_libraries(fastgltf PRIVATE simdjson::simdjson)
target_link_libraries(fastgltf PUBLIC simdjson::simdjson)
else()
# Download and configure simdjson
set(SIMDJSON_TARGET_VERSION "3.6.3")
Expand Down
28 changes: 28 additions & 0 deletions src/fastgltf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -882,6 +882,34 @@ fg::Error fg::validate(const fastgltf::Asset& asset) {
if (material.pbrData.metallicRoughnessTexture.has_value() &&
isInvalidTexture(material.pbrData.metallicRoughnessTexture->textureIndex))
return Error::InvalidGltf;

// Validate that for every additional material field from an extension the correct extension is marked as used by the asset.
if (material.anisotropy && !isExtensionUsed(extensions::KHR_materials_anisotropy))
return Error::InvalidGltf;
if (material.clearcoat && !isExtensionUsed(extensions::KHR_materials_clearcoat))
return Error::InvalidGltf;
if (material.iridescence && !isExtensionUsed(extensions::KHR_materials_iridescence))
return Error::InvalidGltf;
if (material.sheen && !isExtensionUsed(extensions::KHR_materials_sheen))
return Error::InvalidGltf;
if (material.specular && !isExtensionUsed(extensions::KHR_materials_specular))
return Error::InvalidGltf;
#if FASTGLTF_ENABLE_DEPRECATED_EXT
if (material.specularGlossiness && !isExtensionUsed(extensions::KHR_materials_pbrSpecularGlossiness))
return Error::InvalidGltf;
#endif
if (material.transmission && !isExtensionUsed(extensions::KHR_materials_transmission))
return Error::InvalidGltf;
if (material.volume && !isExtensionUsed(extensions::KHR_materials_volume))
return Error::InvalidGltf;
if (material.emissiveStrength != 1.0f && !isExtensionUsed(extensions::KHR_materials_emissive_strength))
return Error::InvalidGltf;
if (material.ior != 1.5f && !isExtensionUsed(extensions::KHR_materials_ior))
return Error::InvalidGltf;
if (material.packedNormalMetallicRoughnessTexture && !isExtensionUsed(extensions::MSFT_packing_normalRoughnessMetallic))
return Error::InvalidGltf;
if (material.packedOcclusionRoughnessMetallicTextures && !isExtensionUsed(extensions::MSFT_packing_occlusionRoughnessMetallic))
return Error::InvalidGltf;
}

for (const auto& mesh : asset.meshes) {
Expand Down
18 changes: 18 additions & 0 deletions tests/optional_tests.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#include <catch2/catch_test_macros.hpp>

#include <fastgltf/types.hpp>

TEST_CASE("Test basic Optional interface", "[optional-tests]") {
// We have no specialization for std::uint32_t, and therefore this is just
// a std::optional with a bool field padded by 3 bytes.
fastgltf::Optional<std::uint32_t> optional;
static_assert(sizeof(optional) > sizeof(std::uint32_t));
}

TEST_CASE("Test Optional float specialization", "[optional-tests]") {
fastgltf::Optional<double> doptional;
static_assert((std::numeric_limits<double>::is_iec559 && sizeof(doptional) == sizeof(double)) || !std::numeric_limits<double>::is_iec559);

fastgltf::Optional<float> foptional;
static_assert((std::numeric_limits<float>::is_iec559 && sizeof(foptional) == sizeof(float)) || !std::numeric_limits<float>::is_iec559);
}

0 comments on commit 57b8a74

Please sign in to comment.