Revert "First draft of Standard material support."

This reverts commit c77d625257.
This commit is contained in:
K. S. Ernest (iFire) Lee 2021-06-07 08:41:12 -07:00
parent 04c8673fe5
commit cb9952f5ec
4 changed files with 7 additions and 274 deletions

View File

@ -120,7 +120,6 @@ endif()
set(LIB_SOURCE_FILES
src/FBX2glTF.h
src/fbx/materials/ArnoldStandardMaterial.cpp
src/fbx/materials/3dsMaxPhysicalMaterial.cpp
src/fbx/materials/FbxMaterials.cpp
src/fbx/materials/FbxMaterials.hpp

View File

@ -1,253 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "RoughnessMetallicMaterials.hpp"
std::unique_ptr<FbxRoughMetMaterialInfo> ArnoldStandardMaterialResolver::resolve() const {
const FbxProperty mayaProp = fbxMaterial->FindProperty("Maya");
if (mayaProp.GetPropertyDataType() != FbxCompoundDT) {
return nullptr;
}
if (!fbxMaterial->ShadingModel.Get().IsEmpty()) {
::fmt::printf(
"Warning: Material %s has surprising shading model: %s\n",
fbxMaterial->GetName(),
fbxMaterial->ShadingModel.Get());
}
auto getTex = [&](std::string propName) {
const FbxFileTexture* ptr = nullptr;
const FbxProperty useProp = mayaProp.FindHierarchical((propName).c_str());
if (useProp.IsValid() && useProp.Get<bool>()) {
const FbxProperty texProp = mayaProp.FindHierarchical((propName).c_str());
if (texProp.IsValid()) {
ptr = texProp.GetSrcObject<FbxFileTexture>();
if (ptr != nullptr && textureLocations.find(ptr) == textureLocations.end()) {
ptr = nullptr;
}
}
}
return ptr;
};
auto getVec3 = [&](std::string propName) -> FbxDouble3 {
const FbxProperty vecProp = mayaProp.FindHierarchical(propName.c_str());
return vecProp.IsValid() ? vecProp.Get<FbxDouble3>() : FbxDouble3(1, 1, 1);
};
auto getVal = [&](std::string propName) -> FbxDouble {
const FbxProperty vecProp = mayaProp.FindHierarchical(propName.c_str());
return vecProp.IsValid() ? vecProp.Get<FbxDouble>() : 0;
};
enum PropertyDesc {
TEXTURE_EMISSION,
TEXTURE_AMBIENT_OCCLUSION,
TEXTURE_NORMAL,
TEXTURE_ROUGHNESS,
TEXTURE_METALLIC,
TEXTURE_ALBEDO,
PROPERTY_DESC_NOT_FOUND,
PROPERTY_DESC_ALBEDO_COLOR,
PROPERTY_DESC_TRANSPARENT,
PROPERTY_DESC_TRANSPARENT_COLOR,
PROPERTY_DESC_METALLIC,
PROPERTY_DESC_ROUGHNESS,
PROPERTY_DESC_SPECULAR,
PROPERTY_DESC_SPECULAR_COLOR,
PROPERTY_DESC_SHINYNESS,
PROPERTY_DESC_COAT,
PROPERTY_DESC_COAT_ROUGHNESS,
PROPERTY_DESC_EMISSIVE,
PROPERTY_DESC_EMISSIVE_COLOR,
PROPERTY_DESC_IGNORE,
PROPERTY_DESC_UNSUPPORTED,
};
// See https://github.com/godotengine/godot/blob/master/modules/fbx/data/fbx_material.h
const std::map<std::string, PropertyDesc> fbxPropertiesDesc =
{
/* Diffuse */
{"Maya|base", TEXTURE_ALBEDO},
{"DiffuseColor", TEXTURE_ALBEDO},
{"Maya|DiffuseTexture", TEXTURE_ALBEDO},
{"Maya|baseColor", TEXTURE_ALBEDO},
{"Maya|baseColor|file", TEXTURE_ALBEDO},
{"Maya|TEX_color_map|file", TEXTURE_ALBEDO},
{"Maya|TEX_color_map", TEXTURE_ALBEDO},
/* Emission */
{"EmissiveColor", TEXTURE_EMISSION},
{"EmissiveFactor", TEXTURE_EMISSION},
{"Maya|emissionColor", TEXTURE_EMISSION},
{"Maya|emissionColor|file", TEXTURE_EMISSION},
{"Maya|TEX_emissive_map", TEXTURE_EMISSION},
{"Maya|TEX_emissive_map|file", TEXTURE_EMISSION},
/* Metallic */
{"Maya|metalness", TEXTURE_METALLIC},
{"Maya|metalness|file", TEXTURE_METALLIC},
{"Maya|TEX_metallic_map", TEXTURE_METALLIC},
{"Maya|TEX_metallic_map|file", TEXTURE_METALLIC},
/* Roughness */
// Arnold Roughness Map
{"Maya|specularRoughness", TEXTURE_ROUGHNESS},
{"Maya|TEX_roughness_map", TEXTURE_ROUGHNESS},
{"Maya|TEX_roughness_map|file", TEXTURE_ROUGHNESS},
/* Normal */
{"NormalMap", TEXTURE_NORMAL},
//{ "Bump", TEXTURE_NORMAL },
//{ "3dsMax|Parameters|bump_map", TEXTURE_NORMAL },
{"Maya|NormalTexture", TEXTURE_NORMAL},
//{ "Maya|normalCamera", TEXTURE_NORMAL },
//{ "Maya|normalCamera|file", TEXTURE_NORMAL },
{"Maya|TEX_normal_map", TEXTURE_NORMAL},
{"Maya|TEX_normal_map|file", TEXTURE_NORMAL},
/* AO */
{"Maya|TEX_ao_map", TEXTURE_AMBIENT_OCCLUSION},
{"Maya|TEX_ao_map|file", TEXTURE_AMBIENT_OCCLUSION},
// TODO: specular workflow conversion
// { "SpecularColor", TEXTURE_METALLIC },
// { "Maya|specularColor", TEXTURE_METALLIC },
// { "Maya|SpecularTexture", TEXTURE_METALLIC },
// { "Maya|SpecularTexture|file", TEXTURE_METALLIC },
// { "ShininessExponent", PROPERTY_DESC_UNSUPPORTED },
// { "ReflectionFactor", PROPERTY_DESC_UNSUPPORTED },
//{ "TransparentColor",PROPERTY_DESC_TRANSPARENT_COLOR },
//{ "TransparencyFactor",PROPERTY_DESC_TRANSPARENT }
// TODO: diffuse roughness
//{ "Maya|diffuseRoughness", PROPERTY_DESC_UNSUPPORTED },
//{ "Maya|diffuseRoughness|file", PROPERTY_DESC_UNSUPPORTED },
/* Albedo */
{"DiffuseColor", PROPERTY_DESC_ALBEDO_COLOR},
{"Maya|baseColor", PROPERTY_DESC_ALBEDO_COLOR},
/* Specular */
{"Maya|specular", PROPERTY_DESC_SPECULAR},
{"Maya|specularColor", PROPERTY_DESC_SPECULAR_COLOR},
/* Specular roughness - arnold roughness map */
{"Maya|specularRoughness", PROPERTY_DESC_ROUGHNESS},
/* Transparent */
{"Opacity", PROPERTY_DESC_TRANSPARENT},
{"TransparencyFactor", PROPERTY_DESC_TRANSPARENT},
{"Maya|opacity", PROPERTY_DESC_TRANSPARENT},
{"Maya|metalness", PROPERTY_DESC_METALLIC},
{"Maya|metallic", PROPERTY_DESC_METALLIC},
/* Roughness */
{"Maya|roughness", PROPERTY_DESC_ROUGHNESS},
/* Coat */
//{ "Maya|coat", PROPERTY_DESC_COAT },
/* Coat roughness */
//{ "Maya|coatRoughness", PROPERTY_DESC_COAT_ROUGHNESS },
/* Emissive */
{"Maya|emission", PROPERTY_DESC_EMISSIVE},
{"Maya|emissive", PROPERTY_DESC_EMISSIVE},
/* Emissive color */
{"EmissiveColor", PROPERTY_DESC_EMISSIVE_COLOR},
{"Maya|emissionColor", PROPERTY_DESC_EMISSIVE_COLOR},
};
std::unique_ptr<FbxRoughMetMaterialInfo> res(new FbxRoughMetMaterialInfo(
fbxMaterial->GetUniqueID(),
fbxMaterial->GetName(),
FbxRoughMetMaterialInfo::FBX_SHADER_METROUGH,
FbxDouble4(0.0, 0.0, 0.0, 1),
0.0,
1.0));
for (std::pair<std::string, PropertyDesc> const& it : fbxPropertiesDesc) {
switch (it.second) {
case TEXTURE_EMISSION: {
res->texEmissive = getTex(it.first);
break;
}
case TEXTURE_AMBIENT_OCCLUSION: {
res->texAmbientOcclusion = getTex(it.first);
break;
}
case TEXTURE_NORMAL: {
res->texNormal = getTex(it.first);
break;
}
case TEXTURE_ROUGHNESS: {
res->texRoughness = getTex(it.first);
break;
}
case TEXTURE_METALLIC: {
res->texMetallic = getTex(it.first);
break;
}
case TEXTURE_ALBEDO: {
res->texBaseColor = getTex(it.first);
break;
}
case PROPERTY_DESC_NOT_FOUND: {
break;
}
case PROPERTY_DESC_ALBEDO_COLOR: {
FbxDouble3 baseColor = getVec3(it.first);
res->baseColor = FbxVector4(baseColor[0],baseColor[1], baseColor[2], res->baseColor[3]);
break;
}
case PROPERTY_DESC_TRANSPARENT: {
res->baseColor = FbxVector4(res->baseColor[0], res->baseColor[1], res->baseColor[2], getVal(it.first));
break;
}
case PROPERTY_DESC_METALLIC: {
res->metallic = getVal(it.first);
break;
}
case PROPERTY_DESC_ROUGHNESS: {
res->roughness = getVal(it.first);
break;
}
case PROPERTY_DESC_SPECULAR: {
break;
}
case PROPERTY_DESC_SPECULAR_COLOR: {
break;
}
case PROPERTY_DESC_SHINYNESS: {
break;
}
case PROPERTY_DESC_COAT: {
break;
}
case PROPERTY_DESC_COAT_ROUGHNESS: {
break;
}
case PROPERTY_DESC_EMISSIVE: {
res->emissiveIntensity = getVal(it.first);
break;
}
case PROPERTY_DESC_EMISSIVE_COLOR: {
res->emissive = getVec3(it.first);
break;
}
case PROPERTY_DESC_IGNORE: {
break;
}
default: {
break;
}
}
}
return res;
};

View File

@ -111,14 +111,11 @@ std::unique_ptr<FbxMaterialInfo> FbxMaterialsAccess::GetMaterialInfo(
return nullptr;
}
std::unique_ptr<FbxMaterialInfo> res =
ArnoldStandardMaterialResolver(material, textureLocations).resolve();
if(res == nullptr ) {
res = FbxStingrayPBSMaterialResolver(material, textureLocations).resolve();
FbxStingrayPBSMaterialResolver(material, textureLocations).resolve();
if (res == nullptr) {
res = Fbx3dsMaxPhysicalMaterialResolver(material, textureLocations).resolve();
if (res == nullptr) {
res = Fbx3dsMaxPhysicalMaterialResolver(material, textureLocations).resolve();
if (res == nullptr) {
res = FbxTraditionalMaterialResolver(material, textureLocations).resolve();
}
res = FbxTraditionalMaterialResolver(material, textureLocations).resolve();
}
}
return res;

View File

@ -31,9 +31,9 @@ struct FbxRoughMetMaterialInfo : FbxMaterialInfo {
metallic(metallic),
roughness(roughness) {}
FbxVector4 baseColor;
FbxDouble metallic;
FbxDouble roughness;
const FbxVector4 baseColor;
const FbxDouble metallic;
const FbxDouble roughness;
FbxBool invertRoughnessMap = false;
FbxDouble baseWeight = 1;
@ -60,16 +60,6 @@ class FbxStingrayPBSMaterialResolver : FbxMaterialResolver<FbxRoughMetMaterialIn
virtual std::unique_ptr<FbxRoughMetMaterialInfo> resolve() const;
};
class ArnoldStandardMaterialResolver : FbxMaterialResolver<FbxRoughMetMaterialInfo> {
public:
ArnoldStandardMaterialResolver(
FbxSurfaceMaterial* fbxMaterial,
const std::map<const FbxTexture*, FbxString>& textureLocations)
: FbxMaterialResolver(fbxMaterial, textureLocations) {}
virtual std::unique_ptr<FbxRoughMetMaterialInfo> resolve() const;
};
class Fbx3dsMaxPhysicalMaterialResolver : FbxMaterialResolver<FbxRoughMetMaterialInfo> {
public:
Fbx3dsMaxPhysicalMaterialResolver(