diff --git a/libs/gfx/include/psemek/gfx/gltf_parser.hpp b/libs/gfx/include/psemek/gfx/gltf_parser.hpp index 64d13c22..25145d0f 100644 --- a/libs/gfx/include/psemek/gfx/gltf_parser.hpp +++ b/libs/gfx/include/psemek/gfx/gltf_parser.hpp @@ -56,6 +56,7 @@ namespace psemek::gfx std::optional albedo; std::optional texture; std::optional emission; + std::optional emission_texture; std::optional material_texture; }; diff --git a/libs/gfx/source/gltf_parser.cpp b/libs/gfx/source/gltf_parser.cpp index 553155d1..d725a9d0 100644 --- a/libs/gfx/source/gltf_parser.cpp +++ b/libs/gfx/source/gltf_parser.cpp @@ -70,6 +70,7 @@ namespace psemek::gfx static std::unordered_set supported_extensions = { "KHR_lights_punctual", + "KHR_materials_emissive_strength" }; } @@ -207,6 +208,22 @@ namespace psemek::gfx for (std::size_t i = 0; i < 3; ++i) target_emission[i] = emission[i].GetFloat(); } + + if (material.HasMember("emissiveTexture")) + { + target.emission_texture = document["textures"].GetArray()[material["emissiveTexture"]["index"].GetUint64()]["source"].GetInt64(); + } + + if (material.HasMember("extensions")) + { + auto const & extensions = material["extensions"]; + if (extensions.HasMember("KHR_materials_emissive_strength")) + { + if (!target.emission) + target.emission = {1.f, 1.f, 1.f}; + *target.emission *= extensions["KHR_materials_emissive_strength"]["emissiveStrength"].GetFloat(); + } + } } if (document.HasMember("images")) for (auto const & image : document["images"].GetArray())