Implement pbrSpecularGlossiness property as Nullable

pull/1423/head
Daniel Hritzkiv 2017-09-05 16:29:00 -04:00
parent 03cfa04ee4
commit 44757af34a
No known key found for this signature in database
GPG Key ID: D1D19875679D5CBF
5 changed files with 46 additions and 35 deletions

View File

@ -711,12 +711,14 @@ namespace glTF2
struct PbrSpecularGlossiness struct PbrSpecularGlossiness
{ {
bool on = false;
vec4 diffuseFactor; vec4 diffuseFactor;
vec3 specularFactor; vec3 specularFactor;
float glossinessFactor; float glossinessFactor;
TextureInfo diffuseTexture; TextureInfo diffuseTexture;
TextureInfo specularGlossinessTexture; TextureInfo specularGlossinessTexture;
PbrSpecularGlossiness() { SetDefaults(); }
void SetDefaults();
}; };
//! The material appearance of a primitive. //! The material appearance of a primitive.
@ -735,7 +737,7 @@ namespace glTF2
bool doubleSided; bool doubleSided;
//extension: KHR_materials_pbrSpecularGlossiness //extension: KHR_materials_pbrSpecularGlossiness
PbrSpecularGlossiness pbrSpecularGlossiness; Nullable<PbrSpecularGlossiness> pbrSpecularGlossiness;
Material() { SetDefaults(); } Material() { SetDefaults(); }
void Read(Value& obj, Asset& r); void Read(Value& obj, Asset& r);

View File

@ -790,13 +790,15 @@ inline void Material::Read(Value& material, Asset& r)
if (Value* extensions = FindObject(material, "extensions")) { if (Value* extensions = FindObject(material, "extensions")) {
if (r.extensionsUsed.KHR_materials_pbrSpecularGlossiness) { if (r.extensionsUsed.KHR_materials_pbrSpecularGlossiness) {
if (Value* pbrSpecularGlossiness = FindObject(*extensions, "KHR_materials_pbrSpecularGlossiness")) { if (Value* pbrSpecularGlossiness = FindObject(*extensions, "KHR_materials_pbrSpecularGlossiness")) {
this->pbrSpecularGlossiness.on = true; PbrSpecularGlossiness pbrSG;
ReadMember(*pbrSpecularGlossiness, "diffuseFactor", this->pbrSpecularGlossiness.diffuseFactor); ReadMember(*pbrSpecularGlossiness, "diffuseFactor", pbrSG.diffuseFactor);
ReadTextureProperty(r, *pbrSpecularGlossiness, "diffuseTexture", this->pbrSpecularGlossiness.diffuseTexture); ReadTextureProperty(r, *pbrSpecularGlossiness, "diffuseTexture", pbrSG.diffuseTexture);
ReadTextureProperty(r, *pbrSpecularGlossiness, "specularGlossinessTexture", this->pbrSpecularGlossiness.specularGlossinessTexture); ReadTextureProperty(r, *pbrSpecularGlossiness, "specularGlossinessTexture", pbrSG.specularGlossinessTexture);
ReadMember(*pbrSpecularGlossiness, "specularFactor", this->pbrSpecularGlossiness.specularFactor); ReadMember(*pbrSpecularGlossiness, "specularFactor", pbrSG.specularFactor);
ReadMember(*pbrSpecularGlossiness, "glossinessFactor", this->pbrSpecularGlossiness.glossinessFactor); ReadMember(*pbrSpecularGlossiness, "glossinessFactor", pbrSG.glossinessFactor);
this->pbrSpecularGlossiness = Nullable<PbrSpecularGlossiness>(pbrSG);
} }
} }
} }
@ -821,11 +823,14 @@ inline void Material::SetDefaults()
alphaMode = "OPAQUE"; alphaMode = "OPAQUE";
alphaCutoff = 0.5; alphaCutoff = 0.5;
doubleSided = false; doubleSided = false;
}
inline void PbrSpecularGlossiness::SetDefaults()
{
//pbrSpecularGlossiness properties //pbrSpecularGlossiness properties
SetVector(pbrSpecularGlossiness.diffuseFactor, defaultDiffuseFactor); SetVector(diffuseFactor, defaultDiffuseFactor);
SetVector(pbrSpecularGlossiness.specularFactor, defaultSpecularFactor); SetVector(specularFactor, defaultSpecularFactor);
pbrSpecularGlossiness.glossinessFactor = 1.0; glossinessFactor = 1.0;
} }
namespace { namespace {

View File

@ -324,22 +324,23 @@ namespace glTF2 {
Value exts; Value exts;
exts.SetObject(); exts.SetObject();
if (m.pbrSpecularGlossiness.on) { if (m.pbrSpecularGlossiness.isPresent) {
Value pbrSpecularGlossiness; Value pbrSpecularGlossiness;
pbrSpecularGlossiness.SetObject(); pbrSpecularGlossiness.SetObject();
{
//pbrSpecularGlossiness
WriteVec(pbrSpecularGlossiness, m.pbrSpecularGlossiness.diffuseFactor, "diffuseFactor", defaultDiffuseFactor, w.mAl);
WriteVec(pbrSpecularGlossiness, m.pbrSpecularGlossiness.specularFactor, "specularFactor", defaultSpecularFactor, w.mAl);
if (m.pbrSpecularGlossiness.glossinessFactor != 1) { PbrSpecularGlossiness &pbrSG = m.pbrSpecularGlossiness.value;
WriteFloat(obj, m.pbrSpecularGlossiness.glossinessFactor, "glossinessFactor", w.mAl);
}
WriteTex(pbrSpecularGlossiness, m.pbrSpecularGlossiness.diffuseTexture, "diffuseTexture", w.mAl); //pbrSpecularGlossiness
WriteTex(pbrSpecularGlossiness, m.pbrSpecularGlossiness.specularGlossinessTexture, "specularGlossinessTexture", w.mAl); WriteVec(pbrSpecularGlossiness, pbrSG.diffuseFactor, "diffuseFactor", defaultDiffuseFactor, w.mAl);
WriteVec(pbrSpecularGlossiness, pbrSG.specularFactor, "specularFactor", defaultSpecularFactor, w.mAl);
if (pbrSG.glossinessFactor != 1) {
WriteFloat(obj, pbrSG.glossinessFactor, "glossinessFactor", w.mAl);
} }
WriteTex(pbrSpecularGlossiness, pbrSG.diffuseTexture, "diffuseTexture", w.mAl);
WriteTex(pbrSpecularGlossiness, pbrSG.specularGlossinessTexture, "specularGlossinessTexture", w.mAl);
if (!pbrSpecularGlossiness.ObjectEmpty()) { if (!pbrSpecularGlossiness.ObjectEmpty()) {
exts.AddMember("KHR_materials_pbrSpecularGlossiness", pbrSpecularGlossiness, w.mAl); exts.AddMember("KHR_materials_pbrSpecularGlossiness", pbrSpecularGlossiness, w.mAl);
} }

View File

@ -439,12 +439,15 @@ void glTF2Exporter::ExportMaterials()
KHR_materials_pbrSpecularGlossiness = true; KHR_materials_pbrSpecularGlossiness = true;
} }
m->pbrSpecularGlossiness.on = true; PbrSpecularGlossiness pbrSG;
GetMatColor(mat, m->pbrSpecularGlossiness.diffuseFactor, "$clr.diffuse", 0, 1);
GetMatColor(mat, m->pbrSpecularGlossiness.specularFactor, "$clr.specular", 0, 1); GetMatColor(mat, pbrSG.diffuseFactor, "$clr.diffuse", 0, 1);
mat->Get("$mat.gltf.glossinessFactor", 0, 0, m->pbrSpecularGlossiness.glossinessFactor); GetMatColor(mat, pbrSG.specularFactor, "$clr.specular", 0, 1);
GetMatTex(mat, m->pbrSpecularGlossiness.diffuseTexture, aiTextureType_DIFFUSE, 1); mat->Get("$mat.gltf.glossinessFactor", 0, 0, pbrSG.glossinessFactor);
GetMatTex(mat, m->pbrSpecularGlossiness.specularGlossinessTexture, aiTextureType_UNKNOWN, 1); GetMatTex(mat, pbrSG.diffuseTexture, aiTextureType_DIFFUSE, 1);
GetMatTex(mat, pbrSG.specularGlossinessTexture, aiTextureType_UNKNOWN, 1);
m->pbrSpecularGlossiness = Nullable<PbrSpecularGlossiness>(pbrSG);
} }
} }
} }

View File

@ -249,13 +249,13 @@ void glTF2Importer::ImportMaterials(glTF2::Asset& r)
aimat->AddProperty(&mat.alphaCutoff, 1, "$mat.gltf.alphaCutoff"); aimat->AddProperty(&mat.alphaCutoff, 1, "$mat.gltf.alphaCutoff");
//pbrSpecularGlossiness //pbrSpecularGlossiness
if (mat.pbrSpecularGlossiness.on) { if (mat.pbrSpecularGlossiness.isPresent) {
aimat->AddProperty(&mat.pbrSpecularGlossiness.on, 1, "$mat.gltf.pbrSpecularGlossiness.on"); aimat->AddProperty(&mat.pbrSpecularGlossiness.isPresent, 1, "$mat.gltf.pbrSpecularGlossiness.on");
SetMaterialColorProperty(r, mat.pbrSpecularGlossiness.diffuseFactor, aimat, "$clr.diffuse", 0, 1); SetMaterialColorProperty(r, mat.pbrSpecularGlossiness.value.diffuseFactor, aimat, "$clr.diffuse", 0, 1);
SetMaterialColorProperty(r, mat.pbrSpecularGlossiness.specularFactor, aimat, "$clr.specular", 0, 1); SetMaterialColorProperty(r, mat.pbrSpecularGlossiness.value.specularFactor, aimat, "$clr.specular", 0, 1);
aimat->AddProperty(&mat.pbrSpecularGlossiness.glossinessFactor, 1, "$mat.gltf.pbrSpecularGlossiness.glossinessFactor"); aimat->AddProperty(&mat.pbrSpecularGlossiness.value.glossinessFactor, 1, "$mat.gltf.pbrSpecularGlossiness.glossinessFactor");
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrSpecularGlossiness.diffuseTexture, aimat, aiTextureType_DIFFUSE, 1); SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrSpecularGlossiness.value.diffuseTexture, aimat, aiTextureType_DIFFUSE, 1);
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrSpecularGlossiness.specularGlossinessTexture, aimat, aiTextureType_UNKNOWN, 1); SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrSpecularGlossiness.value.specularGlossinessTexture, aimat, aiTextureType_UNKNOWN, 1);
} }
} }
} }