From 852ea8325cebf84ff1fefc9da60af1739070acf3 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 3 Nov 2022 23:11:21 +0200 Subject: [PATCH] Added support for KHR_materials_emissive_strength according to spec https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_emissive_strength --- code/AssetLib/glTF2/glTF2Asset.h | 13 +++++++++++++ code/AssetLib/glTF2/glTF2Asset.inl | 16 ++++++++++++++++ code/AssetLib/glTF2/glTF2AssetWriter.h | 1 + code/AssetLib/glTF2/glTF2AssetWriter.inl | 18 ++++++++++++++++++ code/AssetLib/glTF2/glTF2Exporter.cpp | 10 ++++++++++ code/AssetLib/glTF2/glTF2Exporter.h | 2 ++ code/AssetLib/glTF2/glTF2Importer.cpp | 7 +++++++ 7 files changed, 67 insertions(+) diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index 3becc4d9b..4349274d8 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -51,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * KHR_materials_transmission full * KHR_materials_volume full * KHR_materials_ior full + * KHR_materials_emissive_strength full */ #ifndef GLTF2ASSET_H_INC #define GLTF2ASSET_H_INC @@ -801,6 +802,13 @@ struct MaterialIOR { void SetDefaults(); }; +struct MaterialEmissiveStrength { + float emissiveStrength = 0.f; + + MaterialEmissiveStrength() { SetDefaults(); } + void SetDefaults(); +}; + //! The material appearance of a primitive. struct Material : public Object { //PBR metallic roughness properties @@ -833,6 +841,9 @@ struct Material : public Object { //extension: KHR_materials_ior Nullable materialIOR; + //extension: KHR_materials_emissive_strength + Nullable materialEmissiveStrength; + //extension: KHR_materials_unlit bool unlit; @@ -1106,6 +1117,7 @@ public: bool KHR_materials_transmission; bool KHR_materials_volume; bool KHR_materials_ior; + bool KHR_materials_emissive_strength; bool KHR_draco_mesh_compression; bool FB_ngon_encoding; bool KHR_texture_basisu; @@ -1120,6 +1132,7 @@ public: KHR_materials_transmission(false), KHR_materials_volume(false), KHR_materials_ior(false), + KHR_materials_emissive_strength(false), KHR_draco_mesh_compression(false), FB_ngon_encoding(false), KHR_texture_basisu(false) { diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index db47915d6..e13dd226e 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -1313,6 +1313,16 @@ inline void Material::Read(Value &material, Asset &r) { } } + if (r.extensionsUsed.KHR_materials_emissive_strength) { + if (Value *curMaterialEmissiveStrength = FindObject(*extensions, "KHR_materials_emissive_strength")) { + MaterialEmissiveStrength emissiveStrength; + + ReadMember(*curMaterialEmissiveStrength, "emissiveStrength", emissiveStrength.emissiveStrength); + + this->materialEmissiveStrength = Nullable(emissiveStrength); + } + } + unlit = nullptr != FindObject(*extensions, "KHR_materials_unlit"); } } @@ -1355,6 +1365,11 @@ inline void MaterialIOR::SetDefaults() { ior = 1.5f; } +inline void MaterialEmissiveStrength::SetDefaults() { + //KHR_materials_emissive_strength properties + emissiveStrength = 0.f; +} + inline void Mesh::Read(Value &pJSON_Object, Asset &pAsset_Root) { Value *curName = FindMember(pJSON_Object, "name"); if (nullptr != curName && curName->IsString()) { @@ -2026,6 +2041,7 @@ inline void Asset::ReadExtensionsUsed(Document &doc) { CHECK_EXT(KHR_materials_transmission); CHECK_EXT(KHR_materials_volume); CHECK_EXT(KHR_materials_ior); + CHECK_EXT(KHR_materials_emissive_strength); CHECK_EXT(KHR_draco_mesh_compression); CHECK_EXT(KHR_texture_basisu); diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.h b/code/AssetLib/glTF2/glTF2AssetWriter.h index 089a15844..ec216101c 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.h +++ b/code/AssetLib/glTF2/glTF2AssetWriter.h @@ -51,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * KHR_materials_transmission: full * KHR_materials_volume: full * KHR_materials_ior: full + * KHR_materials_emissive_strength: full */ #ifndef GLTF2ASSETWRITER_H_INC #define GLTF2ASSETWRITER_H_INC diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.inl b/code/AssetLib/glTF2/glTF2AssetWriter.inl index 0be139595..249c738cd 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.inl +++ b/code/AssetLib/glTF2/glTF2AssetWriter.inl @@ -511,6 +511,20 @@ namespace glTF2 { } } + if (m.materialEmissiveStrength.isPresent) { + Value materialEmissiveStrength(rapidjson::Type::kObjectType); + + MaterialEmissiveStrength &emissiveStrength = m.materialEmissiveStrength.value; + + if (emissiveStrength.emissiveStrength != 0.f) { + WriteFloat(materialEmissiveStrength, emissiveStrength.emissiveStrength, "emissiveStrength", w.mAl); + } + + if (!emissiveStrength.ObjectEmpty()) { + exts.AddMember("KHR_materials_emissive_strength", emissiveStrength, w.mAl); + } + } + if (!exts.ObjectEmpty()) { obj.AddMember("extensions", exts, w.mAl); } @@ -935,6 +949,10 @@ namespace glTF2 { exts.PushBack(StringRef("KHR_materials_ior"), mAl); } + if (this->mAsset.extensionsUsed.KHR_materials_emissive_strength) { + exts.PushBack(StringRef("KHR_materials_emissive_strength"), mAl); + } + if (this->mAsset.extensionsUsed.FB_ngon_encoding) { exts.PushBack(StringRef("FB_ngon_encoding"), mAl); } diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index 3bfe49fba..2954f9f53 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -733,6 +733,10 @@ bool glTF2Exporter::GetMatIOR(const aiMaterial &mat, glTF2::MaterialIOR &ior) { return mat.Get(AI_MATKEY_REFRACTI, ior.ior) == aiReturn_SUCCESS; } +bool glTF2Exporter::GetMatEmissiveStrength(const aiMaterial &mat, glTF2::MaterialEmissiveStrength &emissiveStrength) { + return mat.Get(AI_MATKEY_EMISSIVE_INTENSITY, emissiveStrength.emissiveStrength) == aiReturn_SUCCESS; +} + void glTF2Exporter::ExportMaterials() { aiString aiName; for (unsigned int i = 0; i < mScene->mNumMaterials; ++i) { @@ -862,6 +866,12 @@ void glTF2Exporter::ExportMaterials() { if (GetMatIOR(mat, ior)) { mAsset->extensionsUsed.KHR_materials_ior = true; m->materialIOR = Nullable(ior); + } + + MaterialEmissiveStrength emissiveStrength; + if (GetMatEmissiveStrength(mat, emissiveStrength)) { + mAsset->extensionsUsed.KHR_materials_emissive_strength = true; + m->materialEmissiveStrength = Nullable(emissiveStrength); } } } diff --git a/code/AssetLib/glTF2/glTF2Exporter.h b/code/AssetLib/glTF2/glTF2Exporter.h index 99425228e..505e331a2 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.h +++ b/code/AssetLib/glTF2/glTF2Exporter.h @@ -81,6 +81,7 @@ struct MaterialClearcoat; struct MaterialTransmission; struct MaterialVolume; struct MaterialIOR; +struct MaterialEmissiveStrength; // Vec/matrix types, as raw float arrays typedef float(vec2)[2]; @@ -121,6 +122,7 @@ protected: bool GetMatTransmission(const aiMaterial &mat, glTF2::MaterialTransmission &transmission); bool GetMatVolume(const aiMaterial &mat, glTF2::MaterialVolume &volume); bool GetMatIOR(const aiMaterial &mat, glTF2::MaterialIOR &ior); + bool GetMatEmissiveStrength(const aiMaterial &mat, glTF2::MaterialEmissiveStrength &emissiveStrength); void ExportMetadata(); void ExportMaterials(); void ExportMeshes(); diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 947edc8d5..7b0bf4b0b 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -357,6 +357,13 @@ static aiMaterial *ImportMaterial(std::vector &embeddedTexIdxs, Asset &r, M aimat->AddProperty(&ior.ior, 1, AI_MATKEY_REFRACTI); } + // KHR_materials_emissive_strength + if (mat.materialEmissiveStrength.isPresent) { + MaterialEmissiveStrength &emissiveStrength = mat.materialEmissiveStrength.value; + + aimat->AddProperty(&emissiveStrength.emissiveStrength, 1, AI_MATKEY_EMISSIVE_INTENSITY); + } + return aimat; } catch (...) { delete aimat;