// Copyright Epic Games, Inc. All Rights Reserved. #include "DatasmithFacadeUEPbrMaterial.h" #include "DatasmithFacadeKeyValueProperty.h" #include "DatasmithFacadeScene.h" #include "DatasmithUtils.h" #include "Misc/Paths.h" FDatasmithFacadeMaterialExpression* CreateFacadeExpression( IDatasmithMaterialExpression* MaterialExpression, const TSharedPtr& ReferencedMaterial ) { if ( MaterialExpression ) { switch ( MaterialExpression->GetExpressionType() ) { case EDatasmithMaterialExpressionType::ConstantBool: return new FDatasmithFacadeMaterialExpressionBool( MaterialExpression, ReferencedMaterial ); case EDatasmithMaterialExpressionType::ConstantColor: return new FDatasmithFacadeMaterialExpressionColor( MaterialExpression, ReferencedMaterial ); case EDatasmithMaterialExpressionType::ConstantScalar: return new FDatasmithFacadeMaterialExpressionScalar( MaterialExpression, ReferencedMaterial ); case EDatasmithMaterialExpressionType::FlattenNormal: return new FDatasmithFacadeMaterialExpressionFlattenNormal( MaterialExpression, ReferencedMaterial ); case EDatasmithMaterialExpressionType::FunctionCall: return new FDatasmithFacadeMaterialExpressionFunctionCall( MaterialExpression, ReferencedMaterial ); case EDatasmithMaterialExpressionType::Generic: return new FDatasmithFacadeMaterialExpressionGeneric( MaterialExpression, ReferencedMaterial ); case EDatasmithMaterialExpressionType::Texture: return new FDatasmithFacadeMaterialExpressionTexture( MaterialExpression, ReferencedMaterial ); case EDatasmithMaterialExpressionType::TextureCoordinate: return new FDatasmithFacadeMaterialExpressionTextureCoordinate( MaterialExpression, ReferencedMaterial ); default: break; } } return nullptr; } const TCHAR* FDatasmithFacadeExpressionInput::GetName() const { return InternalExpressionInput->GetName(); } void FDatasmithFacadeExpressionInput::SetName(const TCHAR* InName) { InternalExpressionInput->SetName(InName); } FDatasmithFacadeMaterialExpression* FDatasmithFacadeExpressionInput::GetNewFacadeExpression() { return CreateFacadeExpression( InternalExpressionInput->GetExpression(), ReferencedMaterial ); } void FDatasmithFacadeExpressionInput::SetExpression( FDatasmithFacadeMaterialExpression* InExpression ) { InternalExpressionInput->SetExpression( InExpression->GetMaterialExpression() ); } int32 FDatasmithFacadeExpressionInput::GetOutputIndex() const { return InternalExpressionInput->GetOutputIndex(); } void FDatasmithFacadeExpressionInput::SetOutputIndex( int32 InOutputIndex ) { InternalExpressionInput->SetOutputIndex( InOutputIndex ); } const TCHAR* FDatasmithFacadeMaterialExpression::GetName() const { return InternalMaterialExpression->GetName(); } void FDatasmithFacadeMaterialExpression::SetName( const TCHAR* InName ) { InternalMaterialExpression->SetName( InName ); } EDatasmithFacadeMaterialExpressionType FDatasmithFacadeMaterialExpression::GetExpressionType() const { return static_cast(InternalMaterialExpression->GetExpressionType()); } void FDatasmithFacadeMaterialExpression::ConnectExpression( FDatasmithFacadeExpressionInput& ExpressionInput ) { InternalMaterialExpression->ConnectExpression( ExpressionInput.GetExpressionInput() ); } void FDatasmithFacadeMaterialExpression::ConnectExpression( FDatasmithFacadeExpressionInput& ExpressionInput, int32 OutputIndex ) { InternalMaterialExpression->ConnectExpression( ExpressionInput.GetExpressionInput(), OutputIndex ); } int32 FDatasmithFacadeMaterialExpression::GetInputCount() const { return InternalMaterialExpression->GetInputCount(); } FDatasmithFacadeExpressionInput* FDatasmithFacadeMaterialExpression::GetNewFacadeInput( int32 Index ) { if ( IDatasmithExpressionInput* ExpressionInput = InternalMaterialExpression->GetInput( Index ) ) { return new FDatasmithFacadeExpressionInput( ExpressionInput, ReferencedMaterial ); } return nullptr; } int32 FDatasmithFacadeMaterialExpression::GetDefaultOutputIndex() const { return InternalMaterialExpression->GetDefaultOutputIndex(); } void FDatasmithFacadeMaterialExpression::SetDefaultOutputIndex( int32 OutputIndex ) { InternalMaterialExpression->SetDefaultOutputIndex( OutputIndex ); } bool FDatasmithFacadeMaterialExpressionBool::GetBool() const { return static_cast( InternalMaterialExpression )->GetBool(); } void FDatasmithFacadeMaterialExpressionBool::SetBool( bool InValue ) { static_cast( InternalMaterialExpression )->GetBool() = InValue; } const TCHAR* FDatasmithFacadeMaterialExpressionBool::GetGroupName() const { return static_cast( InternalMaterialExpression )->GetGroupName(); } void FDatasmithFacadeMaterialExpressionBool::SetGroupName( const TCHAR* InGroupName ) { static_cast( InternalMaterialExpression )->SetGroupName( InGroupName ); } void FDatasmithFacadeMaterialExpressionColor::GetsRGBColor( uint8& OutR, uint8& OutG, uint8& OutB, uint8& OutA ) const { const FLinearColor& ExpressionColor = static_cast( InternalMaterialExpression )->GetColor(); FColor Color = ExpressionColor.ToFColor( /*bSRGB=*/true ); OutR = Color.R; OutG = Color.G; OutB = Color.B; OutA = Color.A; } void FDatasmithFacadeMaterialExpressionColor::SetsRGBColor( uint8 R, uint8 G, uint8 B, uint8 A ) { //Passing a FColor to the FLinearColor constructor will do the proper color space conversion. static_cast( InternalMaterialExpression )->GetColor() = FLinearColor( FColor( R, G, B, A ) ); } void FDatasmithFacadeMaterialExpressionColor::GetColor( float& OutR, float& OutG, float& OutB, float& OutA ) const { const FLinearColor& ExpressionColor = static_cast( InternalMaterialExpression )->GetColor(); OutR = ExpressionColor.R; OutG = ExpressionColor.G; OutB = ExpressionColor.B; OutA = ExpressionColor.A; } void FDatasmithFacadeMaterialExpressionColor::SetColor( float R, float G, float B, float A ) { static_cast( InternalMaterialExpression )->GetColor() = FLinearColor( R, G, B, A ); } const TCHAR* FDatasmithFacadeMaterialExpressionColor::GetGroupName() const { return static_cast( InternalMaterialExpression )->GetGroupName(); } void FDatasmithFacadeMaterialExpressionColor::SetGroupName( const TCHAR* InGroupName ) { static_cast( InternalMaterialExpression )->SetGroupName( InGroupName ); } float FDatasmithFacadeMaterialExpressionScalar::GetScalar() const { return static_cast( InternalMaterialExpression )->GetScalar(); } void FDatasmithFacadeMaterialExpressionScalar::SetScalar( float InScalar ) { static_cast( InternalMaterialExpression )->GetScalar() = InScalar; } const TCHAR* FDatasmithFacadeMaterialExpressionScalar::GetGroupName() const { return static_cast( InternalMaterialExpression )->GetGroupName(); } void FDatasmithFacadeMaterialExpressionScalar::SetGroupName( const TCHAR* InGroupName ) { static_cast( InternalMaterialExpression )->SetGroupName( InGroupName ); } const TCHAR* FDatasmithFacadeMaterialExpressionTexture::GetTexturePathName() const { return static_cast( InternalMaterialExpression )->GetTexturePathName(); } void FDatasmithFacadeMaterialExpressionTexture::SetTexturePathName( const TCHAR* InTexturePathName ) { static_cast( InternalMaterialExpression )->SetTexturePathName( InTexturePathName ); } FDatasmithFacadeExpressionInput FDatasmithFacadeMaterialExpressionTexture::GetInputCoordinate() { return FDatasmithFacadeExpressionInput( &static_cast( InternalMaterialExpression )->GetInputCoordinate(), ReferencedMaterial ); } const TCHAR* FDatasmithFacadeMaterialExpressionTexture::GetGroupName() const { return static_cast( InternalMaterialExpression )->GetGroupName(); } void FDatasmithFacadeMaterialExpressionTexture::SetGroupName( const TCHAR* InGroupName ) { static_cast( InternalMaterialExpression )->SetGroupName( InGroupName ); } int32 FDatasmithFacadeMaterialExpressionTextureCoordinate::GetCoordinateIndex() const { return static_cast( InternalMaterialExpression )->GetCoordinateIndex(); } void FDatasmithFacadeMaterialExpressionTextureCoordinate::SetCoordinateIndex( int32 InCoordinateIndex ) { static_cast( InternalMaterialExpression )->SetCoordinateIndex( InCoordinateIndex ); } float FDatasmithFacadeMaterialExpressionTextureCoordinate::GetUTiling() const { return static_cast( InternalMaterialExpression )->GetUTiling(); } void FDatasmithFacadeMaterialExpressionTextureCoordinate::SetUTiling( float InUTiling ) { static_cast( InternalMaterialExpression )->SetUTiling( InUTiling ); } float FDatasmithFacadeMaterialExpressionTextureCoordinate::GetVTiling() const { return static_cast( InternalMaterialExpression )->GetVTiling(); } void FDatasmithFacadeMaterialExpressionTextureCoordinate::SetVTiling( float InVTiling ) { static_cast( InternalMaterialExpression )->SetVTiling( InVTiling ); } FDatasmithFacadeExpressionInput FDatasmithFacadeMaterialExpressionFlattenNormal::GetNormal() const { return FDatasmithFacadeExpressionInput( &static_cast( InternalMaterialExpression )->GetNormal(), ReferencedMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeMaterialExpressionFlattenNormal::GetFlatness() const { return FDatasmithFacadeExpressionInput( &static_cast( InternalMaterialExpression )->GetFlatness(), ReferencedMaterial ); } void FDatasmithFacadeMaterialExpressionGeneric::SetExpressionName( const TCHAR* InExpressionName ) { static_cast( InternalMaterialExpression )->SetExpressionName( InExpressionName ); } const TCHAR* FDatasmithFacadeMaterialExpressionGeneric::GetExpressionName() const { return static_cast( InternalMaterialExpression )->GetExpressionName(); } int32 FDatasmithFacadeMaterialExpressionGeneric::GetPropertiesCount() const { return static_cast( InternalMaterialExpression )->GetPropertiesCount(); } void FDatasmithFacadeMaterialExpressionGeneric::AddProperty( const FDatasmithFacadeKeyValueProperty* InPropertyPtr ) { if ( InPropertyPtr ) { static_cast( InternalMaterialExpression )->AddProperty( InPropertyPtr->GetDatasmithKeyValueProperty() ); } } FDatasmithFacadeKeyValueProperty* FDatasmithFacadeMaterialExpressionGeneric::GetNewProperty( int32 Index ) { if ( const TSharedPtr& Property = static_cast( InternalMaterialExpression )->GetProperty( Index ) ) { return new FDatasmithFacadeKeyValueProperty( Property.ToSharedRef() ); } return nullptr; } void FDatasmithFacadeMaterialExpressionFunctionCall::SetFunctionPathName( const TCHAR* InFunctionPathName ) { static_cast( InternalMaterialExpression )->SetFunctionPathName( InFunctionPathName ); } const TCHAR* FDatasmithFacadeMaterialExpressionFunctionCall::GetFunctionPathName() const { return static_cast( InternalMaterialExpression )->GetFunctionPathName(); } FDatasmithFacadeUEPbrMaterial::FDatasmithFacadeUEPbrMaterial( const TCHAR* InElementName ) : FDatasmithFacadeBaseMaterial( FDatasmithSceneFactory::CreateUEPbrMaterial( InElementName ) ) {} FDatasmithFacadeUEPbrMaterial::FDatasmithFacadeUEPbrMaterial( const TSharedRef& InMaterialRef ) : FDatasmithFacadeBaseMaterial( InMaterialRef ) {} FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetBaseColor() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetBaseColor(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetMetallic() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetMetallic(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetSpecular() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetSpecular(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetRoughness() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetRoughness(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetEmissiveColor() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetEmissiveColor(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetOpacity() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetOpacity(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetNormal() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetNormal(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetRefraction() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetRefraction(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetAmbientOcclusion() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetAmbientOcclusion(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetClearCoat() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetClearCoat(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetClearCoatRoughness() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetClearCoatRoughness(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetWorldPositionOffset() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetWorldPositionOffset(), UEPbrMaterial ); } FDatasmithFacadeExpressionInput FDatasmithFacadeUEPbrMaterial::GetMaterialAttributes() const { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return FDatasmithFacadeExpressionInput( &UEPbrMaterial->GetMaterialAttributes(), UEPbrMaterial ); } int FDatasmithFacadeUEPbrMaterial::GetBlendMode() const { return GetDatasmithUEPbrMaterialElement()->GetBlendMode(); } void FDatasmithFacadeUEPbrMaterial::SetBlendMode( int bInBlendMode ) { GetDatasmithUEPbrMaterialElement()->SetBlendMode( bInBlendMode ); } bool FDatasmithFacadeUEPbrMaterial::GetTwoSided() const { return GetDatasmithUEPbrMaterialElement()->GetTwoSided(); } void FDatasmithFacadeUEPbrMaterial::SetTwoSided( bool bTwoSided ) { GetDatasmithUEPbrMaterialElement()->SetTwoSided( bTwoSided ); } bool FDatasmithFacadeUEPbrMaterial::GetUseMaterialAttributes() const { return GetDatasmithUEPbrMaterialElement()->GetUseMaterialAttributes(); } void FDatasmithFacadeUEPbrMaterial::SetUseMaterialAttributes( bool bInUseMaterialAttributes ) { GetDatasmithUEPbrMaterialElement()->SetUseMaterialAttributes( bInUseMaterialAttributes ); } bool FDatasmithFacadeUEPbrMaterial::GetMaterialFunctionOnly() const { return GetDatasmithUEPbrMaterialElement()->GetMaterialFunctionOnly(); } void FDatasmithFacadeUEPbrMaterial::SetMaterialFunctionOnly( bool bInMaterialFunctionOnly ) { GetDatasmithUEPbrMaterialElement()->SetMaterialFunctionOnly( bInMaterialFunctionOnly ); } float FDatasmithFacadeUEPbrMaterial::GetOpacityMaskClipValue() const { return GetDatasmithUEPbrMaterialElement()->GetOpacityMaskClipValue(); } void FDatasmithFacadeUEPbrMaterial::SetOpacityMaskClipValue( float InClipValue ) { GetDatasmithUEPbrMaterialElement()->SetOpacityMaskClipValue( InClipValue ); } int32 FDatasmithFacadeUEPbrMaterial::GetExpressionsCount() const { return GetDatasmithUEPbrMaterialElement()->GetExpressionsCount(); } FDatasmithFacadeMaterialExpression* FDatasmithFacadeUEPbrMaterial::GetNewFacadeExpression( int32 Index ) { TSharedPtr UEPbrMaterial = GetDatasmithUEPbrMaterialElement(); return CreateFacadeExpression( UEPbrMaterial->GetExpression( Index ), UEPbrMaterial ); } int32 FDatasmithFacadeUEPbrMaterial::GetExpressionIndex( const FDatasmithFacadeMaterialExpression& Expression ) const { return GetDatasmithUEPbrMaterialElement()->GetExpressionIndex( Expression.GetMaterialExpression() ); } IDatasmithMaterialExpression* FDatasmithFacadeUEPbrMaterial::AddMaterialExpression( const EDatasmithFacadeMaterialExpressionType ExpressionType ) { return GetDatasmithUEPbrMaterialElement()->AddMaterialExpression( static_cast( ExpressionType ) ); } void FDatasmithFacadeUEPbrMaterial::SetParentLabel( const TCHAR* InParentLabel ) { GetDatasmithUEPbrMaterialElement()->SetParentLabel( InParentLabel ); } const TCHAR* FDatasmithFacadeUEPbrMaterial::GetParentLabel() const { return GetDatasmithUEPbrMaterialElement()->GetParentLabel(); } TSharedRef FDatasmithFacadeUEPbrMaterial::GetDatasmithUEPbrMaterialElement() const { return StaticCastSharedRef( InternalDatasmithElement ); }