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
pull/4787/head
Adam 2022-11-03 23:11:21 +02:00
parent 9a5d628232
commit 852ea8325c
7 changed files with 67 additions and 0 deletions

View File

@ -51,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* KHR_materials_transmission full * KHR_materials_transmission full
* KHR_materials_volume full * KHR_materials_volume full
* KHR_materials_ior full * KHR_materials_ior full
* KHR_materials_emissive_strength full
*/ */
#ifndef GLTF2ASSET_H_INC #ifndef GLTF2ASSET_H_INC
#define GLTF2ASSET_H_INC #define GLTF2ASSET_H_INC
@ -801,6 +802,13 @@ struct MaterialIOR {
void SetDefaults(); void SetDefaults();
}; };
struct MaterialEmissiveStrength {
float emissiveStrength = 0.f;
MaterialEmissiveStrength() { SetDefaults(); }
void SetDefaults();
};
//! The material appearance of a primitive. //! The material appearance of a primitive.
struct Material : public Object { struct Material : public Object {
//PBR metallic roughness properties //PBR metallic roughness properties
@ -833,6 +841,9 @@ struct Material : public Object {
//extension: KHR_materials_ior //extension: KHR_materials_ior
Nullable<MaterialIOR> materialIOR; Nullable<MaterialIOR> materialIOR;
//extension: KHR_materials_emissive_strength
Nullable<MaterialEmissiveStrength> materialEmissiveStrength;
//extension: KHR_materials_unlit //extension: KHR_materials_unlit
bool unlit; bool unlit;
@ -1106,6 +1117,7 @@ public:
bool KHR_materials_transmission; bool KHR_materials_transmission;
bool KHR_materials_volume; bool KHR_materials_volume;
bool KHR_materials_ior; bool KHR_materials_ior;
bool KHR_materials_emissive_strength;
bool KHR_draco_mesh_compression; bool KHR_draco_mesh_compression;
bool FB_ngon_encoding; bool FB_ngon_encoding;
bool KHR_texture_basisu; bool KHR_texture_basisu;
@ -1120,6 +1132,7 @@ public:
KHR_materials_transmission(false), KHR_materials_transmission(false),
KHR_materials_volume(false), KHR_materials_volume(false),
KHR_materials_ior(false), KHR_materials_ior(false),
KHR_materials_emissive_strength(false),
KHR_draco_mesh_compression(false), KHR_draco_mesh_compression(false),
FB_ngon_encoding(false), FB_ngon_encoding(false),
KHR_texture_basisu(false) { KHR_texture_basisu(false) {

View File

@ -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<MaterialEmissiveStrength>(emissiveStrength);
}
}
unlit = nullptr != FindObject(*extensions, "KHR_materials_unlit"); unlit = nullptr != FindObject(*extensions, "KHR_materials_unlit");
} }
} }
@ -1355,6 +1365,11 @@ inline void MaterialIOR::SetDefaults() {
ior = 1.5f; 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) { inline void Mesh::Read(Value &pJSON_Object, Asset &pAsset_Root) {
Value *curName = FindMember(pJSON_Object, "name"); Value *curName = FindMember(pJSON_Object, "name");
if (nullptr != curName && curName->IsString()) { if (nullptr != curName && curName->IsString()) {
@ -2026,6 +2041,7 @@ inline void Asset::ReadExtensionsUsed(Document &doc) {
CHECK_EXT(KHR_materials_transmission); CHECK_EXT(KHR_materials_transmission);
CHECK_EXT(KHR_materials_volume); CHECK_EXT(KHR_materials_volume);
CHECK_EXT(KHR_materials_ior); CHECK_EXT(KHR_materials_ior);
CHECK_EXT(KHR_materials_emissive_strength);
CHECK_EXT(KHR_draco_mesh_compression); CHECK_EXT(KHR_draco_mesh_compression);
CHECK_EXT(KHR_texture_basisu); CHECK_EXT(KHR_texture_basisu);

View File

@ -51,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* KHR_materials_transmission: full * KHR_materials_transmission: full
* KHR_materials_volume: full * KHR_materials_volume: full
* KHR_materials_ior: full * KHR_materials_ior: full
* KHR_materials_emissive_strength: full
*/ */
#ifndef GLTF2ASSETWRITER_H_INC #ifndef GLTF2ASSETWRITER_H_INC
#define GLTF2ASSETWRITER_H_INC #define GLTF2ASSETWRITER_H_INC

View File

@ -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()) { if (!exts.ObjectEmpty()) {
obj.AddMember("extensions", exts, w.mAl); obj.AddMember("extensions", exts, w.mAl);
} }
@ -935,6 +949,10 @@ namespace glTF2 {
exts.PushBack(StringRef("KHR_materials_ior"), mAl); 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) { if (this->mAsset.extensionsUsed.FB_ngon_encoding) {
exts.PushBack(StringRef("FB_ngon_encoding"), mAl); exts.PushBack(StringRef("FB_ngon_encoding"), mAl);
} }

View File

@ -733,6 +733,10 @@ bool glTF2Exporter::GetMatIOR(const aiMaterial &mat, glTF2::MaterialIOR &ior) {
return mat.Get(AI_MATKEY_REFRACTI, ior.ior) == aiReturn_SUCCESS; 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() { void glTF2Exporter::ExportMaterials() {
aiString aiName; aiString aiName;
for (unsigned int i = 0; i < mScene->mNumMaterials; ++i) { for (unsigned int i = 0; i < mScene->mNumMaterials; ++i) {
@ -862,6 +866,12 @@ void glTF2Exporter::ExportMaterials() {
if (GetMatIOR(mat, ior)) { if (GetMatIOR(mat, ior)) {
mAsset->extensionsUsed.KHR_materials_ior = true; mAsset->extensionsUsed.KHR_materials_ior = true;
m->materialIOR = Nullable<MaterialIOR>(ior); m->materialIOR = Nullable<MaterialIOR>(ior);
}
MaterialEmissiveStrength emissiveStrength;
if (GetMatEmissiveStrength(mat, emissiveStrength)) {
mAsset->extensionsUsed.KHR_materials_emissive_strength = true;
m->materialEmissiveStrength = Nullable<MaterialEmissiveStrength>(emissiveStrength);
} }
} }
} }

View File

@ -81,6 +81,7 @@ struct MaterialClearcoat;
struct MaterialTransmission; struct MaterialTransmission;
struct MaterialVolume; struct MaterialVolume;
struct MaterialIOR; struct MaterialIOR;
struct MaterialEmissiveStrength;
// Vec/matrix types, as raw float arrays // Vec/matrix types, as raw float arrays
typedef float(vec2)[2]; typedef float(vec2)[2];
@ -121,6 +122,7 @@ protected:
bool GetMatTransmission(const aiMaterial &mat, glTF2::MaterialTransmission &transmission); bool GetMatTransmission(const aiMaterial &mat, glTF2::MaterialTransmission &transmission);
bool GetMatVolume(const aiMaterial &mat, glTF2::MaterialVolume &volume); bool GetMatVolume(const aiMaterial &mat, glTF2::MaterialVolume &volume);
bool GetMatIOR(const aiMaterial &mat, glTF2::MaterialIOR &ior); bool GetMatIOR(const aiMaterial &mat, glTF2::MaterialIOR &ior);
bool GetMatEmissiveStrength(const aiMaterial &mat, glTF2::MaterialEmissiveStrength &emissiveStrength);
void ExportMetadata(); void ExportMetadata();
void ExportMaterials(); void ExportMaterials();
void ExportMeshes(); void ExportMeshes();

View File

@ -357,6 +357,13 @@ static aiMaterial *ImportMaterial(std::vector<int> &embeddedTexIdxs, Asset &r, M
aimat->AddProperty(&ior.ior, 1, AI_MATKEY_REFRACTI); 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; return aimat;
} catch (...) { } catch (...) {
delete aimat; delete aimat;