Added support for KHR_materials_emissive_strength
according to spec https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_emissive_strengthpull/4787/head
parent
9a5d628232
commit
852ea8325c
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue