diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d163863 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ \ No newline at end of file diff --git a/src/Raw2Gltf.cpp b/src/Raw2Gltf.cpp index 65356de..44f5a91 100644 --- a/src/Raw2Gltf.cpp +++ b/src/Raw2Gltf.cpp @@ -852,6 +852,9 @@ ModelData *Raw2Gltf( diffuseTex.get(), diffuseFactor, specGlossTex.get(), specularFactor, glossiness)); } + TextureData *normalTexture = simpleTex(RAW_TEXTURE_USAGE_NORMAL).get(); + TextureData *emissiveTexture = simpleTex(RAW_TEXTURE_USAGE_EMISSIVE).get(); + std::shared_ptr khrComMat; if (options.useKHRMatCom) { float shininess; @@ -905,12 +908,38 @@ ModelData *Raw2Gltf( diffuseTex.get(), diffuseFactor, simpleTex(RAW_TEXTURE_USAGE_SPECULAR).get(), specularFactor)); } + + std::shared_ptr khrCmnConstantMat; + if (options.useKHRMatCmnConstant) { + normalTexture = nullptr; + + emissiveTexture = nullptr; + emissiveFactor = Vec3f(0.00f, 0.00f, 0.00f); + + Vec4f diffuseFactor; + std::shared_ptr baseColorTex; + + if (material.info->shadingModel == RAW_SHADING_MODEL_PBR_MET_ROUGH) { + RawMetRoughMatProps *props = (RawMetRoughMatProps *) material.info.get(); + diffuseFactor = props->diffuseFactor; + baseColorTex = simpleTex(RAW_TEXTURE_USAGE_ALBEDO); + } else { + RawTraditionalMatProps *props = ((RawTraditionalMatProps *) material.info.get()); + diffuseFactor = props->diffuseFactor; + baseColorTex = simpleTex(RAW_TEXTURE_USAGE_DIFFUSE); + } + + pbrMetRough.reset(new PBRMetallicRoughness(baseColorTex.get(), nullptr, diffuseFactor, 0.0f, 1.0f)); + + khrCmnConstantMat.reset(new KHRCmnConstantMaterial()); + } + std::shared_ptr mData = gltf->materials.hold( new MaterialData( material.name, isTransparent, - simpleTex(RAW_TEXTURE_USAGE_NORMAL).get(), simpleTex(RAW_TEXTURE_USAGE_EMISSIVE).get(), + normalTexture, emissiveTexture, emissiveFactor * emissiveIntensity, - khrComMat, pbrMetRough, pbrSpecGloss)); + khrComMat, khrCmnConstantMat, pbrMetRough, pbrSpecGloss)); materialsByName[materialHash(material)] = mData; } @@ -1188,6 +1217,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..21c0684 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_unlit"; 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 af76401..01d489e 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, @@ -161,6 +170,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(), @@ -170,6 +180,7 @@ MaterialData::MaterialData( emissiveTexture(Tex::ref(emissiveTexture)), emissiveFactor(std::move(emissiveFactor)), khrCommonMats(khrCommonMats), + khrCmnConstantMaterial(khrCmnConstantMaterial), pbrMetallicRoughness(pbrMetallicRoughness), pbrSpecularGlossiness(pbrSpecularGlossiness) {} @@ -192,11 +203,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 afcfcd7..448d94e 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( @@ -86,6 +91,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); @@ -97,13 +103,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"); }