diff --git a/CMakeLists.txt b/CMakeLists.txt index b7d3518..7c621b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,7 @@ endif() ExternalProject_Add(Draco GIT_REPOSITORY https://github.com/google/draco PREFIX draco + GIT_TAG 1.2.0 INSTALL_DIR CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= diff --git a/src/Raw2Gltf.cpp b/src/Raw2Gltf.cpp index 45c98e6..05ada4c 100644 --- a/src/Raw2Gltf.cpp +++ b/src/Raw2Gltf.cpp @@ -453,11 +453,20 @@ ModelData *Raw2Gltf( getTex(RAW_TEXTURE_USAGE_DIFFUSE), material.diffuseFactor, getTex(RAW_TEXTURE_USAGE_SPECULAR), material.specularFactor)); } + + std::shared_ptr khrCmnConstantMat; + if (options.useKHRMatCmnConstant) { + khrCmnConstantMat.reset(new KHRCmnConstantMaterial()); + + // Set fallback parameters + pbrMetRough.reset(new PBRMetallicRoughness(nullptr, Vec4f(0.0f, 0.0f, 0.0f, 1.0f), 0.0f, 0.0f)); + } + std::shared_ptr mData = gltf->materials.hold( new MaterialData( material.name, isTransparent, getTex(RAW_TEXTURE_USAGE_NORMAL), getTex(RAW_TEXTURE_USAGE_EMISSIVE), material.emissiveFactor, - khrComMat, pbrMetRough, pbrSpecGloss)); + khrComMat, khrCmnConstantMat, pbrMetRough, pbrSpecGloss)); materialsByName[materialHash(material)] = mData; } @@ -726,6 +735,9 @@ ModelData *Raw2Gltf( extensionsRequired.push_back(KHR_MATERIALS_COMMON); } } + if (options.useKHRMatCmnConstant) { + extensionsUsed.push_back(KHR_MATERIALS_CMN_CONSTANT); + } if (options.usePBRSpecGloss) { extensionsUsed.push_back(KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS); if (!options.useKHRMatCom && !options.usePBRMetRough) { diff --git a/src/Raw2Gltf.h b/src/Raw2Gltf.h index f83224b..40d46fc 100644 --- a/src/Raw2Gltf.h +++ b/src/Raw2Gltf.h @@ -30,6 +30,7 @@ using json = nlohmann::basic_json; static const std::string KHR_DRACO_MESH_COMPRESSION = "KHR_draco_mesh_compression"; static const std::string KHR_MATERIALS_COMMON = "KHR_materials_common"; +static const std::string KHR_MATERIALS_CMN_CONSTANT = "KHR_materials_cmnConstant"; static const std::string KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS = "KHR_materials_pbrSpecularGlossiness"; static const std::string extBufferFilename = "buffer.bin"; @@ -54,6 +55,8 @@ struct GltfOptions bool useDraco; /** Whether to use KHR_materials_common to extend materials definitions. */ bool useKHRMatCom; + /** Whether to use KHR_materials_cmnConstant to extend materials definitions. */ + bool useKHRMatCmnConstant; /** Whether to populate the pbrMetallicRoughness substruct in materials. */ bool usePBRMetRough; /** Whether to use KHR_materials_pbrSpecularGlossiness to extend material definitions. */ diff --git a/src/glTF/MaterialData.cpp b/src/glTF/MaterialData.cpp index 60984cc..853ae70 100644 --- a/src/glTF/MaterialData.cpp +++ b/src/glTF/MaterialData.cpp @@ -93,6 +93,15 @@ void to_json(json &j, const KHRCommonMats &d) } } +KHRCmnConstantMaterial::KHRCmnConstantMaterial() +{ +} + +void to_json(json &j, const KHRCmnConstantMaterial &d) +{ + j = json({}); +} + PBRSpecularGlossiness::PBRSpecularGlossiness( const TextureData *diffuseTexture, const Vec4f &diffuseFactor, const TextureData *specularGlossinessTexture, const Vec3f &specularFactor, @@ -156,6 +165,7 @@ MaterialData::MaterialData( std::string name, bool isTransparent, const TextureData *normalTexture, const TextureData *emissiveTexture, const Vec3f & emissiveFactor, std::shared_ptr const khrCommonMats, + std::shared_ptr const khrCmnConstantMaterial, std::shared_ptr const pbrMetallicRoughness, std::shared_ptr const pbrSpecularGlossiness) : Holdable(), @@ -165,6 +175,7 @@ MaterialData::MaterialData( emissiveTexture(Tex::ref(emissiveTexture)), emissiveFactor(std::move(emissiveFactor)), khrCommonMats(khrCommonMats), + khrCmnConstantMaterial(khrCmnConstantMaterial), pbrMetallicRoughness(pbrMetallicRoughness), pbrSpecularGlossiness(pbrSpecularGlossiness) {} @@ -187,11 +198,14 @@ json MaterialData::serialize() const if (pbrMetallicRoughness != nullptr) { result["pbrMetallicRoughness"] = *pbrMetallicRoughness; } - if (khrCommonMats != nullptr || pbrSpecularGlossiness != nullptr) { + if (khrCommonMats != nullptr || khrCmnConstantMaterial != nullptr || pbrSpecularGlossiness != nullptr) { json extensions = { }; if (khrCommonMats != nullptr) { extensions[KHR_MATERIALS_COMMON] = *khrCommonMats; } + if (khrCmnConstantMaterial != nullptr) { + extensions[KHR_MATERIALS_CMN_CONSTANT] = *khrCmnConstantMaterial; + } if (pbrSpecularGlossiness != nullptr) { extensions[KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS] = *pbrSpecularGlossiness; } diff --git a/src/glTF/MaterialData.h b/src/glTF/MaterialData.h index 3c45ed1..b4bcbdb 100644 --- a/src/glTF/MaterialData.h +++ b/src/glTF/MaterialData.h @@ -53,6 +53,11 @@ struct KHRCommonMats const Vec3f specularFactor; }; +struct KHRCmnConstantMaterial +{ + KHRCmnConstantMaterial(); +}; + struct PBRSpecularGlossiness { PBRSpecularGlossiness( @@ -85,6 +90,7 @@ struct MaterialData : Holdable std::string name, bool isTransparent, const TextureData *normalTexture, const TextureData *emissiveTexture, const Vec3f &emissiveFactor, std::shared_ptr const khrCommonMats, + std::shared_ptr const khrCmnConstantMaterial, std::shared_ptr const pbrMetallicRoughness, std::shared_ptr const pbrSpecularGlossiness); @@ -96,13 +102,15 @@ struct MaterialData : Holdable const std::unique_ptr emissiveTexture; const Vec3f emissiveFactor; - const std::shared_ptr khrCommonMats; - const std::shared_ptr pbrMetallicRoughness; - const std::shared_ptr pbrSpecularGlossiness; + const std::shared_ptr khrCommonMats; + const std::shared_ptr khrCmnConstantMaterial; + const std::shared_ptr pbrMetallicRoughness; + const std::shared_ptr pbrSpecularGlossiness; }; void to_json(json &j, const Tex &data); void to_json(json &j, const KHRCommonMats &d); +void to_json(json &j, const KHRCmnConstantMaterial &d); void to_json(json &j, const PBRSpecularGlossiness &d); void to_json(json &j, const PBRMetallicRoughness &d); diff --git a/src/main.cpp b/src/main.cpp index faa6c2d..8184e2c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,6 +48,7 @@ int main(int argc, char *argv[]) false, // embedResources false, // useDraco false, // useKHRMatCom + false, // useKHRMatCmnConstant false, // usePBRMetRough false, // usePBRSpecGloss false, // useBlendShapeNormals @@ -77,6 +78,9 @@ int main(int argc, char *argv[]) ( "khr-materials-common", "(WIP) Use KHR_materials_common extensions to specify Unlit/Lambert/Blinn/Phong shaders.", cxxopts::value(gltfOptions.useKHRMatCom)) + ( + "khr-materials-cmnConstant", "(WIP) Use KHR_materials_cmnConstant extension to specify Unlit shader.", + cxxopts::value(gltfOptions.useKHRMatCmnConstant)) ( "pbr-metallic-roughness", "(WIP) Try to glean glTF 2.0 native PBR attributes from the FBX.", cxxopts::value(gltfOptions.usePBRMetRough)) @@ -129,7 +133,7 @@ Copyright (c) 2016-2017 Oculus VR, LLC. verboseOutput = true; } - if (!gltfOptions.useKHRMatCom && !gltfOptions.usePBRSpecGloss && !gltfOptions.usePBRMetRough) { + if (!gltfOptions.useKHRMatCmnConstant && !gltfOptions.useKHRMatCom && !gltfOptions.usePBRSpecGloss && !gltfOptions.usePBRMetRough) { if (verboseOutput) { fmt::printf("Defaulting to --pbr-metallic-roughness material support.\n"); }