519 lines
20 KiB
C++
519 lines
20 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "DatasmithMaxWriter.h"
|
|
|
|
#include "DatasmithSceneFactory.h"
|
|
#include "DatasmithMaxSceneHelper.h"
|
|
|
|
#include "Misc/Paths.h"
|
|
|
|
void FDatasmithMaxMatWriter::ExportPhysicalMaterialProperty(TSharedRef< IDatasmithScene > DatasmithScene, Texmap* Texture, bool bTextureEnabled, Texmap* TextureWeight, bool bTextureWeightEnabled, BMM_Color_fl Color, float Weight, TSharedPtr<IDatasmithCompositeTexture>& CompTex, FString TextureAliasName, FString ColorAliasName, bool bForceInvert, bool bIsGrayscale)
|
|
{
|
|
// there is nothing to write
|
|
if ((Texture == NULL || bTextureEnabled == false) && (Color.r <= 0 && Color.g <= 0 && Color.b <= 0))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// if they are weighted we init the mix
|
|
if (TextureWeight != NULL)
|
|
{
|
|
CompTex->SetMode(EDatasmithCompMode::Mix);
|
|
TextureAliasName = FString(DATASMITH_TEXTURENAME);
|
|
ColorAliasName = FString(DATASMITH_COLORNAME);
|
|
|
|
TSharedPtr<IDatasmithCompositeTexture> MaskTextureMap = FDatasmithSceneFactory::CreateCompositeTexture();
|
|
|
|
DumpTexture(DatasmithScene, MaskTextureMap, TextureWeight, DATASMITH_MASKNAME, DATASMITH_COLORNAME, bForceInvert, bIsGrayscale);
|
|
CompTex->AddMaskSurface(MaskTextureMap);
|
|
}
|
|
|
|
if (Texture != NULL && bTextureEnabled)
|
|
{
|
|
|
|
if (Weight == 1)
|
|
{
|
|
DumpTexture(DatasmithScene, CompTex, Texture, *TextureAliasName, *ColorAliasName, bForceInvert, bIsGrayscale);
|
|
}
|
|
else
|
|
{
|
|
DumpWeightedTexture(DatasmithScene, CompTex, Texture, BMM_Color_fl(0.0, 0.0, 0.0, 0.0), Weight, *TextureAliasName, *ColorAliasName, bForceInvert, bIsGrayscale);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if (Weight == 1)
|
|
{
|
|
CompTex->AddSurface(FDatasmithMaxMatHelper::MaxColorToFLinearColor(Color));
|
|
}
|
|
else
|
|
{
|
|
DumpWeightedColor(CompTex, Color, BMM_Color_fl(0.0, 0.0, 0.0, 0.0), Weight, *ColorAliasName);
|
|
}
|
|
}
|
|
|
|
// if they are weighted we finish the mix
|
|
if (TextureWeight != NULL)
|
|
{
|
|
CompTex->AddSurface(FDatasmithMaxMatHelper::MaxColorToFLinearColor(BMM_Color_fl(0.0, 0.0, 0.0, 0.0)));
|
|
}
|
|
}
|
|
|
|
void FDatasmithMaxMatWriter::ExportPhysicalMaterialCoat(TSharedRef< IDatasmithScene > DatasmithScene, TSharedPtr< IDatasmithMaterialElement >& MaterialElement, Mtl* Material)
|
|
{
|
|
const int NumParamBlocks = Material->NumParamBlocks();
|
|
|
|
bool bCoatMapOn = true;
|
|
bool bCoatColorMapOn = true;
|
|
bool bCoatRoughnessMapOn = true;
|
|
bool bCoatRoughnessInverted = true;
|
|
|
|
float CoatAmount = 0.f;
|
|
float CoatRoughness = 0.f;
|
|
float CoatIOR = 1.5f;
|
|
|
|
Texmap* CoatWeightMap = nullptr;
|
|
Texmap* CoatColorMap = nullptr;
|
|
Texmap* CoatRoughnessMap = nullptr;
|
|
|
|
BMM_Color_fl CoatColor;
|
|
|
|
for (int j = 0; j < NumParamBlocks; j++)
|
|
{
|
|
IParamBlock2* ParamBlock2 = Material->GetParamBlockByID(j);
|
|
ParamBlockDesc2* ParamBlockDesc = ParamBlock2->GetDesc();
|
|
|
|
// Loop through all the defined parameters therein
|
|
for (int i = 0; i < ParamBlockDesc->count; i++)
|
|
{
|
|
const ParamDef& ParamDefinition = ParamBlockDesc->paramdefs[i];
|
|
|
|
if (FCString::Stricmp(ParamDefinition.int_name, TEXT("coat_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bCoatMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("coat_color_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bCoatColorMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("coat_rough_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bCoatRoughnessMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("coat_roughness_inv")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bCoatRoughnessInverted = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Coating_Weight_Map")) == 0)
|
|
{
|
|
CoatWeightMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Coating_Color_Map")) == 0)
|
|
{
|
|
CoatColorMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Coating_Roughness_Map")) == 0)
|
|
{
|
|
CoatRoughnessMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("coating")) == 0)
|
|
{
|
|
CoatAmount = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("coat_roughness")) == 0)
|
|
{
|
|
CoatRoughness = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("coat_ior")) == 0)
|
|
{
|
|
CoatIOR = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("coat_color")) == 0)
|
|
{
|
|
CoatColor = (BMM_Color_fl)ParamBlock2->GetColor(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
}
|
|
|
|
ParamBlock2->ReleaseDesc();
|
|
}
|
|
|
|
// There is no coating effect
|
|
if (CoatAmount <= 0.0f || ((CoatColorMap == nullptr || bCoatColorMapOn == false) && CoatColor.r == 0.0f && CoatColor.g == 0.0f && CoatColor.b == 0))
|
|
{
|
|
return;
|
|
}
|
|
|
|
FString CoatShaderName = FString(Material->GetName().data()) + FString(_T("_coat"));
|
|
TSharedPtr< IDatasmithShaderElement > MaterialShaderCoat = FDatasmithSceneFactory::CreateShader(*CoatShaderName);
|
|
|
|
MaterialShaderCoat->SetBlendMode(EDatasmithBlendMode::ClearCoat);
|
|
MaterialShaderCoat->SetIsStackedLayer(true);
|
|
MaterialShaderCoat->SetIOR(CoatIOR);;
|
|
|
|
ExportPhysicalMaterialProperty(DatasmithScene, CoatColorMap, bCoatColorMapOn, CoatWeightMap, bCoatMapOn, CoatColor, CoatAmount, MaterialShaderCoat->GetRefleComp(), DATASMITH_REFLETEXNAME, DATASMITH_REFLECOLNAME,false,false);
|
|
|
|
if (CoatRoughnessMap != NULL)
|
|
{
|
|
ExportPhysicalMaterialProperty(DatasmithScene, CoatRoughnessMap, bCoatRoughnessMapOn, NULL, false, BMM_Color_fl(0.0, 0.0, 0.0, 0.0), CoatRoughness, MaterialShaderCoat->GetRoughnessComp(), DATASMITH_ROUGHNESSTEXNAME, DATASMITH_ROUGHNESSVALUENAME, bCoatRoughnessInverted, true);
|
|
}
|
|
else
|
|
{
|
|
MaterialShaderCoat->GetRoughnessComp()->AddParamVal1(IDatasmithCompositeTexture::ParamVal(CoatRoughness, TEXT("Roughness")));
|
|
}
|
|
|
|
MaterialElement->AddShader(MaterialShaderCoat);
|
|
}
|
|
|
|
void FDatasmithMaxMatWriter::ExportPhysicalMaterial(TSharedRef< IDatasmithScene > DatasmithScene, TSharedPtr< IDatasmithMaterialElement >& MaterialElement, Mtl* Material)
|
|
{
|
|
TSharedPtr< IDatasmithShaderElement > MaterialShader = FDatasmithSceneFactory::CreateShader((TCHAR*)Material->GetName().data());
|
|
int NumParamBlocks = Material->NumParamBlocks();
|
|
|
|
bool bDiffuseWeightMapOn = true, bDiffuseColorMapOn = true, bReflectivityMapOn = true, bReflectivityColorMapOn = true;
|
|
bool bRoughnessMapOn = true, bMetalnessMapOn = true;
|
|
bool bTransparencyMapOn = true, bTransparencyColorMapOn = true, bTransparencyRoughessMapOn = true;
|
|
bool bEmittanceMapOn = true, bEmittanceColorMapOn = true;
|
|
bool bRoughnessInverted = true;
|
|
bool bThinWalled = true;
|
|
bool bBumpmapOn = true, bCutoutMapOn = true;
|
|
|
|
float DiffuseWeight = 0, Roughness = 0, Metalness = 0, Ior = 0;
|
|
float Transparency = 0;
|
|
float Reflectivity = 0;
|
|
float EmittanceMultiplier = 0, EmittanceLuminance = 0, EmittanceTemperature = 0;
|
|
float BumpMapAmount = 0, DisplacementMapAmount = 0;
|
|
|
|
BMM_Color_fl DiffuseColor, TransparencyColor, EmittanceColor, ReflectionColor;
|
|
|
|
Texmap* DiffuseWeightMap = NULL, *DiffuseColorMap = NULL;
|
|
Texmap* ReflectivityMap = NULL, *RoughnessMap = NULL, *MetalnessMap = NULL, *ReflectionColorMap = NULL;
|
|
Texmap* TransparencyMap = NULL, *TransparencyColorMap = NULL;
|
|
Texmap* EmittanceMap = NULL, *EmittanceColorMap = NULL;
|
|
Texmap* BumpMap = NULL, *CutoutMap = NULL;
|
|
|
|
int MaterialMode = 0; //0 means simple, just metalness, 1 means specular + metalness
|
|
|
|
|
|
|
|
for (int j = 0; j < NumParamBlocks; j++)
|
|
{
|
|
IParamBlock2 *ParamBlock2 = Material->GetParamBlockByID(j);
|
|
// The the descriptor to 'decode'
|
|
ParamBlockDesc2 *ParamBlockDesc = ParamBlock2->GetDesc();
|
|
// Loop through all the defined parameters therein
|
|
for (int i = 0; i < ParamBlockDesc->count; i++)
|
|
{
|
|
const ParamDef& ParamDefinition = ParamBlockDesc->paramdefs[i];
|
|
|
|
|
|
if (FCString::Stricmp(ParamDefinition.int_name, TEXT("material_mode")) == 0)
|
|
{
|
|
MaterialMode = ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
|
|
// booleans
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("base_weight_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bDiffuseWeightMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("base_color_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bDiffuseColorMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("reflectivity_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bReflectivityMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("refl_color_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bReflectivityColorMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("roughness_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bRoughnessMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("metalness_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bMetalnessMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("transparency_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bTransparencyMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("trans_color_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bTransparencyColorMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("trans_rough_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bTransparencyRoughessMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("emission_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bEmittanceMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("emit_color_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bEmittanceColorMapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("roughness_inv")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bRoughnessInverted = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("thin_walled")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bThinWalled = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("bump_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bBumpmapOn = false;
|
|
}
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("cutout_map_on")) == 0)
|
|
{
|
|
if (ParamBlock2->GetInt(ParamDefinition.ID, GetCOREInterface()->GetTime()) == 0)
|
|
{
|
|
bCutoutMapOn = false;
|
|
}
|
|
}
|
|
|
|
// float values
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("base_weight")) == 0)
|
|
{
|
|
DiffuseWeight = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("roughness")) == 0)
|
|
{
|
|
Roughness = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("metalness")) == 0)
|
|
{
|
|
Metalness = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("trans_ior")) == 0)
|
|
{
|
|
Ior = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("transparency")) == 0)
|
|
{
|
|
Transparency = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("reflectivity")) == 0)
|
|
{
|
|
Reflectivity = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("emission")) == 0)
|
|
{
|
|
EmittanceMultiplier = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("emit_luminance")) == 0)
|
|
{
|
|
EmittanceLuminance = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("emit_kelvin")) == 0)
|
|
{
|
|
EmittanceTemperature = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("bump_map_amt")) == 0)
|
|
{
|
|
BumpMapAmount = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("displacement_map_amt")) == 0)
|
|
{
|
|
DisplacementMapAmount = ParamBlock2->GetFloat(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
|
|
// plain colors
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("base_color")) == 0)
|
|
{
|
|
DiffuseColor = (BMM_Color_fl)ParamBlock2->GetColor(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("trans_color")) == 0)
|
|
{
|
|
TransparencyColor = (BMM_Color_fl)ParamBlock2->GetColor(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("emit_color")) == 0)
|
|
{
|
|
EmittanceColor = (BMM_Color_fl)ParamBlock2->GetColor(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("refl_color")) == 0)
|
|
{
|
|
ReflectionColor = (BMM_Color_fl)ParamBlock2->GetColor(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
|
|
// textures
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Base_Weight_Map")) == 0)
|
|
{
|
|
DiffuseWeightMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Base_Color_Map")) == 0)
|
|
{
|
|
DiffuseColorMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Reflectivity_Map")) == 0)
|
|
{
|
|
ReflectivityMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Roughness_Map")) == 0)
|
|
{
|
|
RoughnessMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Metalness_Map")) == 0)
|
|
{
|
|
MetalnessMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Refl_Color_Map")) == 0)
|
|
{
|
|
ReflectionColorMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Transparency_Map")) == 0)
|
|
{
|
|
TransparencyMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("trans_color_map")) == 0)
|
|
{
|
|
TransparencyColorMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Emission_Map")) == 0)
|
|
{
|
|
EmittanceMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("Emission_Color_Map")) == 0)
|
|
{
|
|
EmittanceColorMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("bump_map")) == 0)
|
|
{
|
|
BumpMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
else if (FCString::Stricmp(ParamDefinition.int_name, TEXT("cutout_map")) == 0)
|
|
{
|
|
CutoutMap = ParamBlock2->GetTexmap(ParamDefinition.ID, GetCOREInterface()->GetTime());
|
|
}
|
|
}
|
|
|
|
ParamBlock2->ReleaseDesc();
|
|
}
|
|
|
|
ExportPhysicalMaterialProperty(DatasmithScene, DiffuseColorMap, bDiffuseColorMapOn, DiffuseWeightMap, bDiffuseWeightMapOn, DiffuseColor, DiffuseWeight, MaterialShader->GetDiffuseComp(), DATASMITH_DIFFUSETEXNAME, DATASMITH_DIFFUSECOLNAME, false, false);
|
|
ExportPhysicalMaterialProperty(DatasmithScene, TransparencyColorMap, bTransparencyColorMapOn, TransparencyMap, bTransparencyMapOn, TransparencyColor, Transparency, MaterialShader->GetTransComp(), DATASMITH_TRANSPTEXNAME, DATASMITH_TRANSPCOLNAME, false, false);
|
|
ExportPhysicalMaterialProperty(DatasmithScene, EmittanceColorMap, bEmittanceColorMapOn, EmittanceMap, bEmittanceMapOn, EmittanceColor, EmittanceMultiplier, MaterialShader->GetEmitComp(), DATASMITH_EMITTEXNAME, DATASMITH_EMITCOLNAME, false, false);
|
|
ExportPhysicalMaterialProperty(DatasmithScene, CutoutMap, bCutoutMapOn, NULL, NULL, BMM_Color_fl(0.0, 0.0, 0.0, 0.0), 1.0, MaterialShader->GetMaskComp(), DATASMITH_CLIPTEXNAME, DATASMITH_CLIPTEXNAME, false, true);
|
|
|
|
if (MetalnessMap != NULL && bMetalnessMapOn)
|
|
{
|
|
ExportPhysicalMaterialProperty(DatasmithScene, MetalnessMap, bMetalnessMapOn, NULL, false, BMM_Color_fl(0.0, 0.0, 0.0, 0.0), Metalness, MaterialShader->GetMetalComp(), DATASMITH_METALTEXNAME, DATASMITH_METALTEXNAME, false, true);
|
|
}
|
|
else
|
|
{
|
|
MaterialShader->SetMetal(Metalness);
|
|
}
|
|
|
|
if (MaterialMode == 1)
|
|
{
|
|
ExportPhysicalMaterialProperty(DatasmithScene, ReflectionColorMap, bReflectivityColorMapOn, ReflectivityMap, bReflectivityMapOn, ReflectionColor, Reflectivity, MaterialShader->GetRefleComp(), DATASMITH_REFLETEXNAME, DATASMITH_REFLECOLNAME, false, false);
|
|
}
|
|
|
|
if (RoughnessMap != NULL)
|
|
{
|
|
ExportPhysicalMaterialProperty(DatasmithScene, RoughnessMap, true, NULL, NULL, BMM_Color_fl(0.0, 0.0, 0.0, 0.0), Roughness, MaterialShader->GetRoughnessComp(), DATASMITH_ROUGHNESSTEXNAME, DATASMITH_ROUGHNESSVALUENAME, bRoughnessInverted, true);
|
|
}
|
|
else
|
|
{
|
|
if ((MetalnessMap != NULL && bMetalnessMapOn) || Metalness > 0 || (MaterialMode == 1 && ((ReflectionColorMap != NULL && bReflectivityColorMapOn) || Reflectivity > 0)))
|
|
{
|
|
if (bRoughnessInverted == false)
|
|
{
|
|
MaterialShader->GetRoughnessComp()->AddParamVal1(IDatasmithCompositeTexture::ParamVal(Roughness, TEXT("Roughness")));
|
|
}
|
|
else
|
|
{
|
|
MaterialShader->GetRoughnessComp()->AddParamVal1(IDatasmithCompositeTexture::ParamVal(1-Roughness, TEXT("Roughness")));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MaterialShader->GetRoughnessComp()->AddParamVal1(IDatasmithCompositeTexture::ParamVal(0.75, TEXT("Roughness")));
|
|
}
|
|
}
|
|
|
|
if (BumpMap != NULL && bBumpmapOn == true)
|
|
{
|
|
MaterialShader->SetBumpAmount(BumpMapAmount);
|
|
|
|
if (FDatasmithMaxMatHelper::GetTextureClass(BumpMap) == EDSBitmapType::NormalMap)
|
|
{
|
|
ExportPhysicalMaterialProperty(DatasmithScene, BumpMap, bBumpmapOn, NULL, NULL, BMM_Color_fl(0.0, 0.0, 0.0, 0.0), 1.0, MaterialShader->GetNormalComp(), DATASMITH_NORMALTEXNAME, DATASMITH_NORMALTEXNAME, false, false);
|
|
ExportPhysicalMaterialProperty(DatasmithScene, BumpMap, bBumpmapOn, NULL, NULL, BMM_Color_fl(0.0, 0.0, 0.0, 0.0), 1.0, MaterialShader->GetBumpComp(), DATASMITH_BUMPTEXNAME, DATASMITH_BUMPTEXNAME, false, true);
|
|
}
|
|
else
|
|
{
|
|
ExportPhysicalMaterialProperty(DatasmithScene, BumpMap, bBumpmapOn, NULL, NULL, BMM_Color_fl(0.0, 0.0, 0.0, 0.0), 1.0, MaterialShader->GetBumpComp(), DATASMITH_BUMPTEXNAME, DATASMITH_BUMPTEXNAME, false, true);
|
|
}
|
|
}
|
|
|
|
MaterialShader->SetIOR(Ior);
|
|
if (bThinWalled)
|
|
{
|
|
MaterialShader->SetIORRefra(1.0);
|
|
}
|
|
|
|
MaterialElement->AddShader(MaterialShader);
|
|
|
|
ExportPhysicalMaterialCoat(DatasmithScene, MaterialElement, Material);
|
|
}
|