From 21e35a988af61520b491e7d7ae53286bb9dbfcd0 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 29 Mar 2023 23:53:09 +0300 Subject: [PATCH] Parse emission texture & KHR_materials_emissive_strength from glTF --- libs/gfx/include/psemek/gfx/gltf_parser.hpp | 1 + libs/gfx/source/gltf_parser.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) 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())