Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support for KHR_materials_emissive_strength #4787

Merged
merged 7 commits into from
Nov 21, 2022
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 14 additions & 1 deletion code/AssetLib/glTF2/glTF2Asset.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -832,7 +840,10 @@ struct Material : public Object {

//extension: KHR_materials_ior
Nullable<MaterialIOR> materialIOR;


//extension: KHR_materials_emissive_strength
Nullable<MaterialEmissiveStrength> materialEmissiveStrength;

//extension: KHR_materials_unlit
bool unlit;

Expand Down Expand Up @@ -1106,6 +1117,7 @@ class Asset {
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;
Expand All @@ -1120,6 +1132,7 @@ class Asset {
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) {
Expand Down
16 changes: 16 additions & 0 deletions code/AssetLib/glTF2/glTF2Asset.inl
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
}
Expand Down Expand Up @@ -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()) {
Expand Down Expand Up @@ -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);

Expand Down
1 change: 1 addition & 0 deletions code/AssetLib/glTF2/glTF2AssetWriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 18 additions & 0 deletions code/AssetLib/glTF2/glTF2AssetWriter.inl
Original file line number Diff line number Diff line change
Expand Up @@ -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 (!materialEmissiveStrength.ObjectEmpty()) {
exts.AddMember("KHR_materials_emissive_strength", materialEmissiveStrength, w.mAl);
}
}

if (!exts.ObjectEmpty()) {
obj.AddMember("extensions", exts, w.mAl);
}
Expand Down Expand Up @@ -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);
}
Expand Down
10 changes: 10 additions & 0 deletions code/AssetLib/glTF2/glTF2Exporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -863,6 +867,12 @@ void glTF2Exporter::ExportMaterials() {
mAsset->extensionsUsed.KHR_materials_ior = true;
m->materialIOR = Nullable<MaterialIOR>(ior);
}

MaterialEmissiveStrength emissiveStrength;
if (GetMatEmissiveStrength(mat, emissiveStrength)) {
mAsset->extensionsUsed.KHR_materials_emissive_strength = true;
m->materialEmissiveStrength = Nullable<MaterialEmissiveStrength>(emissiveStrength);
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions code/AssetLib/glTF2/glTF2Exporter.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -121,6 +122,7 @@ class glTF2Exporter {
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();
Expand Down
7 changes: 7 additions & 0 deletions code/AssetLib/glTF2/glTF2Importer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,13 @@ static aiMaterial *ImportMaterial(std::vector<int> &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;
Expand Down