Skip to content

Commit

Permalink
Add: MSFT_packing texture extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
spnda committed Nov 15, 2023
1 parent 99102f2 commit 3f883d4
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 20 deletions.
50 changes: 30 additions & 20 deletions include/fastgltf/parser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,12 @@ namespace fastgltf {
// See https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/README.md
KHR_materials_pbrSpecularGlossiness = 1 << 20,
#endif

// See https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/MSFT_packing_normalRoughnessMetallic/README.md
MSFT_packing_normalRoughnessMetallic = 1 << 21,

// See https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/MSFT_packing_occlusionRoughnessMetallic/README.md
MSFT_packing_occlusionRoughnessMetallic = 1 << 22,
};
// clang-format on

Expand Down Expand Up @@ -285,6 +291,8 @@ namespace fastgltf {
constexpr std::string_view KHR_mesh_quantization = "KHR_mesh_quantization";
constexpr std::string_view KHR_texture_basisu = "KHR_texture_basisu";
constexpr std::string_view KHR_texture_transform = "KHR_texture_transform";
constexpr std::string_view MSFT_packing_normalRoughnessMetallic = "MSFT_packing_normalRoughnessMetallic";
constexpr std::string_view MSFT_packing_occlusionRoughnessMetallic = "MSFT_packing_occlusionRoughnessMetallic";
constexpr std::string_view MSFT_texture_dds = "MSFT_texture_dds";

#if FASTGLTF_ENABLE_DEPRECATED_EXT
Expand All @@ -297,29 +305,31 @@ namespace fastgltf {
// value used for enabling/disabling the loading of it. This also represents all extensions that
// fastgltf supports and understands.
#if FASTGLTF_ENABLE_DEPRECATED_EXT
static constexpr size_t SUPPORTED_EXTENSION_COUNT = 19;
static constexpr size_t SUPPORTED_EXTENSION_COUNT = 21;
#else
static constexpr size_t SUPPORTED_EXTENSION_COUNT = 18;
static constexpr size_t SUPPORTED_EXTENSION_COUNT = 20;
#endif
static constexpr std::array<std::pair<std::string_view, Extensions>, SUPPORTED_EXTENSION_COUNT> extensionStrings = {{
{ extensions::EXT_mesh_gpu_instancing, Extensions::EXT_mesh_gpu_instancing },
{ extensions::EXT_meshopt_compression, Extensions::EXT_meshopt_compression },
{ extensions::EXT_texture_webp, Extensions::EXT_texture_webp },
{ extensions::KHR_lights_punctual, Extensions::KHR_lights_punctual },
{ extensions::KHR_materials_anisotropy, Extensions::KHR_materials_anisotropy },
{ extensions::KHR_materials_clearcoat, Extensions::KHR_materials_clearcoat },
{ extensions::KHR_materials_emissive_strength, Extensions::KHR_materials_emissive_strength },
{ extensions::KHR_materials_ior, Extensions::KHR_materials_ior },
{ extensions::KHR_materials_iridescence, Extensions::KHR_materials_iridescence },
{ extensions::KHR_materials_sheen, Extensions::KHR_materials_sheen },
{ extensions::KHR_materials_specular, Extensions::KHR_materials_specular },
{ extensions::KHR_materials_transmission, Extensions::KHR_materials_transmission },
{ extensions::KHR_materials_unlit, Extensions::KHR_materials_unlit },
{ extensions::KHR_materials_volume, Extensions::KHR_materials_volume },
{ extensions::KHR_mesh_quantization, Extensions::KHR_mesh_quantization },
{ extensions::KHR_texture_basisu, Extensions::KHR_texture_basisu },
{ extensions::KHR_texture_transform, Extensions::KHR_texture_transform },
{ extensions::MSFT_texture_dds, Extensions::MSFT_texture_dds },
{ extensions::EXT_mesh_gpu_instancing, Extensions::EXT_mesh_gpu_instancing },
{ extensions::EXT_meshopt_compression, Extensions::EXT_meshopt_compression },
{ extensions::EXT_texture_webp, Extensions::EXT_texture_webp },
{ extensions::KHR_lights_punctual, Extensions::KHR_lights_punctual },
{ extensions::KHR_materials_anisotropy, Extensions::KHR_materials_anisotropy },
{ extensions::KHR_materials_clearcoat, Extensions::KHR_materials_clearcoat },
{ extensions::KHR_materials_emissive_strength, Extensions::KHR_materials_emissive_strength },
{ extensions::KHR_materials_ior, Extensions::KHR_materials_ior },
{ extensions::KHR_materials_iridescence, Extensions::KHR_materials_iridescence },
{ extensions::KHR_materials_sheen, Extensions::KHR_materials_sheen },
{ extensions::KHR_materials_specular, Extensions::KHR_materials_specular },
{ extensions::KHR_materials_transmission, Extensions::KHR_materials_transmission },
{ extensions::KHR_materials_unlit, Extensions::KHR_materials_unlit },
{ extensions::KHR_materials_volume, Extensions::KHR_materials_volume },
{ extensions::KHR_mesh_quantization, Extensions::KHR_mesh_quantization },
{ extensions::KHR_texture_basisu, Extensions::KHR_texture_basisu },
{ extensions::KHR_texture_transform, Extensions::KHR_texture_transform },
{ extensions::MSFT_packing_normalRoughnessMetallic, Extensions::MSFT_packing_normalRoughnessMetallic },
{ extensions::MSFT_packing_occlusionRoughnessMetallic, Extensions::MSFT_packing_occlusionRoughnessMetallic },
{ extensions::MSFT_texture_dds, Extensions::MSFT_texture_dds },

#if FASTGLTF_ENABLE_DEPRECATED_EXT
{ extensions::KHR_materials_pbrSpecularGlossiness,Extensions::KHR_materials_pbrSpecularGlossiness },
Expand Down
14 changes: 14 additions & 0 deletions include/fastgltf/types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1569,6 +1569,12 @@ namespace fastgltf {
};
#endif

struct MaterialPackedTextures {
Optional<TextureInfo> occlusionRoughnessMetallicTexture;
Optional<TextureInfo> roughnessMetallicOcclusionTexture;
Optional<TextureInfo> normalTexture;
};

struct Material {
/**
* A set of parameter values that are used to define the metallic-roughness material model
Expand Down Expand Up @@ -1648,6 +1654,14 @@ namespace fastgltf {
*/
Optional<num> ior;

/**
* The index of a packed texture from the MSFT_packing_normalRoughnessMetallic extension,
* providing normal, roughness and metallic data.
*/
Optional<TextureInfo> packedNormalMetallicRoughnessTexture;

std::unique_ptr<MaterialPackedTextures> packedOcclusionRoughnessMetallicTextures;

/**
* Only applicable if KHR_materials_unlit is enabled.
*/
Expand Down
39 changes: 39 additions & 0 deletions src/fastgltf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2590,6 +2590,45 @@ fg::Error fg::Parser::parseMaterials(simdjson::dom::array& materials, Asset& ass
}
}

if (hasBit(config.extensions, Extensions::MSFT_packing_normalRoughnessMetallic)) {
dom::object normalRoughnessMetallic;
if (extensionsObject[extensions::MSFT_packing_normalRoughnessMetallic].get_object().get(normalRoughnessMetallic) == SUCCESS) {
TextureInfo textureInfo = {};
if (auto error = parseTextureInfo(normalRoughnessMetallic, "normalRoughnessMetallicTexture", &textureInfo, config.extensions); error == Error::None) {
material.packedNormalMetallicRoughnessTexture = std::move(textureInfo);
} else if (error != Error::MissingField) {
return error;
}
}
}

if (hasBit(config.extensions, Extensions::MSFT_packing_occlusionRoughnessMetallic)) {
dom::object occlusionRoughnessMetallic;
if (extensionsObject[extensions::MSFT_packing_occlusionRoughnessMetallic].get_object().get(occlusionRoughnessMetallic) == SUCCESS) {
auto packedTextures = std::make_unique<MaterialPackedTextures>();
TextureInfo textureInfo = {};
if (auto error = parseTextureInfo(occlusionRoughnessMetallic, "occlusionRoughnessMetallicTexture", &textureInfo, config.extensions); error == Error::None) {
packedTextures->occlusionRoughnessMetallicTexture = std::move(textureInfo);
} else if (error != Error::MissingField) {
return error;
}

if (auto error = parseTextureInfo(occlusionRoughnessMetallic, "roughnessMetallicOcclusionTexture", &textureInfo, config.extensions); error == Error::None) {
packedTextures->roughnessMetallicOcclusionTexture = std::move(textureInfo);
} else if (error != Error::MissingField) {
return error;
}

if (auto error = parseTextureInfo(occlusionRoughnessMetallic, "normalTexture", &textureInfo, config.extensions); error == Error::None) {
packedTextures->normalTexture = std::move(textureInfo);
} else if (error != Error::MissingField) {
return error;
}

material.packedOcclusionRoughnessMetallicTextures = std::move(packedTextures);
}
}

#if FASTGLTF_ENABLE_DEPRECATED_EXT
if (hasBit(config.extensions, Extensions::KHR_materials_pbrSpecularGlossiness)) {
dom::object specularGlossinessObject;
Expand Down

0 comments on commit 3f883d4

Please sign in to comment.