Files
UnrealEngine/Engine/Source/Developer/Datasmith/DatasmithFacade/Public/DatasmithFacadeUEPbrMaterial.h
2025-05-18 13:04:45 +08:00

435 lines
16 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
// Datasmith facade.
#include "DatasmithFacadeElement.h"
#include "DatasmithFacadeMaterial.h"
#include "CoreMinimal.h"
class IDatasmithExpressionInput;
class IDatasmithExpressionParameter;
class FDatasmithFacadeKeyValueProperty;
class IDatasmithMaterialExpression;
class IDatasmithUEPbrMaterialElement;
class FDatasmithFacadeMaterialExpression;
class DATASMITHFACADE_API FDatasmithFacadeExpressionInput
{
public:
const TCHAR* GetName() const;
void SetName(const TCHAR* InName);
/** Returns a new FDatasmithFacadeMaterialExpression pointing to the connected expression, the returned value must be deleted after used, can be nullptr. */
FDatasmithFacadeMaterialExpression* GetNewFacadeExpression();
void SetExpression( FDatasmithFacadeMaterialExpression* InExpression );
int32 GetOutputIndex() const;
void SetOutputIndex( int32 InOutputIndex );
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeExpressionInput( IDatasmithExpressionInput* InExpressionInput, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: InternalExpressionInput(InExpressionInput)
, ReferencedMaterial(InMaterialElement)
{}
IDatasmithExpressionInput& GetExpressionInput() { return *InternalExpressionInput; }
const IDatasmithExpressionInput& GetExpressionInput() const { return *InternalExpressionInput; }
private:
IDatasmithExpressionInput* InternalExpressionInput;
//We hold a shared pointer to the material to make sure it stays valid while a facade objects points to it.
TSharedPtr<IDatasmithUEPbrMaterialElement> ReferencedMaterial;
};
enum class EDatasmithFacadeMaterialExpressionType : uint64
{
ConstantBool,
ConstantColor,
ConstantScalar,
FlattenNormal,
FunctionCall,
Generic,
Texture,
TextureCoordinate,
None = 255,
};
// not trivial to reuse EDatasmithMaterialExpressionType (eg with a "using" declaration). #swig
#define DS_CHECK_ENUM_MISMATCH(name) static_assert((uint64)EDatasmithFacadeMaterialExpressionType::name == (uint64)EDatasmithMaterialExpressionType::name, "enum mismatch");
DS_CHECK_ENUM_MISMATCH(None)
DS_CHECK_ENUM_MISMATCH(ConstantBool)
DS_CHECK_ENUM_MISMATCH(ConstantColor)
DS_CHECK_ENUM_MISMATCH(ConstantScalar)
DS_CHECK_ENUM_MISMATCH(FlattenNormal)
DS_CHECK_ENUM_MISMATCH(FunctionCall)
DS_CHECK_ENUM_MISMATCH(Generic)
DS_CHECK_ENUM_MISMATCH(Texture)
DS_CHECK_ENUM_MISMATCH(TextureCoordinate)
#undef DS_CHECK_ENUM_MISMATCH
class DATASMITHFACADE_API FDatasmithFacadeMaterialExpression
{
public:
/** The name of the expression. Used as parameter name for material instances. */
const TCHAR* GetName() const;
void SetName( const TCHAR* InName );
EDatasmithFacadeMaterialExpressionType GetExpressionType() const;
/** Connects the default output to an expression input */
void ConnectExpression( FDatasmithFacadeExpressionInput& ExpressionInput );
/** Connects a specific output to an expression input */
void ConnectExpression( FDatasmithFacadeExpressionInput& ExpressionInput, int32 OutputIndex );
int32 GetInputCount() const;
/**
* Returns a pointer to a new FDatasmithFacadeExpressionInput object wrapping the IDatasmithExpressionInput at the specified index if it exists.
* Returns null if the index is invalid.
* The caller is responsible for the destruction of returned object.
*/
FDatasmithFacadeExpressionInput* GetNewFacadeInput( int32 Index );
/** The output index to use by default for this expression when connecting it to other inputs. */
int32 GetDefaultOutputIndex() const;
void SetDefaultOutputIndex( int32 OutputIndex );
virtual ~FDatasmithFacadeMaterialExpression() = default;
void ResetExpression() { GetMaterialExpression()->ResetExpression(); }
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeMaterialExpression( IDatasmithMaterialExpression* InMaterialExpression, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: InternalMaterialExpression( InMaterialExpression )
, ReferencedMaterial( InMaterialElement )
{}
IDatasmithMaterialExpression* GetMaterialExpression() { return InternalMaterialExpression; }
const IDatasmithMaterialExpression* GetMaterialExpression() const { return InternalMaterialExpression; }
IDatasmithMaterialExpression* InternalMaterialExpression;
//We hold a shared pointer to the material to make sure it stays valid while a facade objects points to it.
TSharedPtr<IDatasmithUEPbrMaterialElement> ReferencedMaterial;
};
/**
* Facade representation of Abstract class IDatasmithExpressionParameter
*/
class FDatasmithFacadeExpressionParameter
{
public:
virtual ~FDatasmithFacadeExpressionParameter() = default;
virtual const TCHAR* GetGroupName() const = 0;
virtual void SetGroupName( const TCHAR* InGroupName ) = 0;
};
/**
* Represents a UMaterialExpressionStaticBoolParameter
*/
class FDatasmithFacadeMaterialExpressionBool : public FDatasmithFacadeMaterialExpression, public FDatasmithFacadeExpressionParameter
{
public:
bool GetBool() const;
void SetBool(bool InValue);
virtual const TCHAR* GetGroupName() const override;
virtual void SetGroupName( const TCHAR* InGroupName ) override;
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeMaterialExpressionBool( IDatasmithMaterialExpression* InMaterialExpression, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: FDatasmithFacadeMaterialExpression( InMaterialExpression, InMaterialElement )
{}
};
class FDatasmithFacadeMaterialExpressionColor : public FDatasmithFacadeMaterialExpression, public FDatasmithFacadeExpressionParameter
{
public:
/**
* Get the color value of the expression in a sRGB format
*/
void GetsRGBColor( uint8& OutR, uint8& OutG, uint8& OutB, uint8& OutA ) const;
/**
* Set the color value of the expression in a sRGB format
*/
void SetsRGBColor( uint8 R, uint8 G, uint8 B, uint8 A );
/**
* Get the color value of the expression in a linear format with values between 0 and 1.
*/
void GetColor( float& OutR, float& OutG, float& OutB, float& OutA ) const;
/**
* Set the color value of the expression in a linear format with values between 0 and 1.
*/
void SetColor( float R, float G, float B, float A );
virtual const TCHAR* GetGroupName() const override;
virtual void SetGroupName( const TCHAR* InGroupName ) override;
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeMaterialExpressionColor( IDatasmithMaterialExpression* InMaterialExpression, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: FDatasmithFacadeMaterialExpression( InMaterialExpression, InMaterialElement )
{}
};
class FDatasmithFacadeMaterialExpressionScalar : public FDatasmithFacadeMaterialExpression, public FDatasmithFacadeExpressionParameter
{
public:
float GetScalar() const;
void SetScalar( float InScalar );
virtual const TCHAR* GetGroupName() const override;
virtual void SetGroupName( const TCHAR* InGroupName ) override;
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeMaterialExpressionScalar( IDatasmithMaterialExpression* InMaterialExpression, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: FDatasmithFacadeMaterialExpression( InMaterialExpression, InMaterialElement )
{}
};
class FDatasmithFacadeMaterialExpressionTexture : public FDatasmithFacadeMaterialExpression, public FDatasmithFacadeExpressionParameter
{
public:
const TCHAR* GetTexturePathName() const;
void SetTexturePathName( const TCHAR* InTexturePathName );
/**
* Inputs
*/
FDatasmithFacadeExpressionInput GetInputCoordinate();
/**
* Outputs:
* - RGB
* - R
* - G
* - B
* - A
*/
virtual const TCHAR* GetGroupName() const override;
virtual void SetGroupName( const TCHAR* InGroupName ) override;
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeMaterialExpressionTexture( IDatasmithMaterialExpression* InMaterialExpression, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: FDatasmithFacadeMaterialExpression( InMaterialExpression, InMaterialElement )
{}
};
class FDatasmithFacadeMaterialExpressionTextureCoordinate : public FDatasmithFacadeMaterialExpression
{
public:
int32 GetCoordinateIndex() const;
void SetCoordinateIndex( int32 InCoordinateIndex );
float GetUTiling() const;
void SetUTiling( float InUTiling );
float GetVTiling() const;
void SetVTiling( float InVTiling );
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeMaterialExpressionTextureCoordinate( IDatasmithMaterialExpression* InMaterialExpression, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: FDatasmithFacadeMaterialExpression( InMaterialExpression, InMaterialElement )
{}
};
class FDatasmithFacadeMaterialExpressionFlattenNormal : public FDatasmithFacadeMaterialExpression
{
public:
/**
* Inputs
*/
FDatasmithFacadeExpressionInput GetNormal() const;
FDatasmithFacadeExpressionInput GetFlatness() const;
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeMaterialExpressionFlattenNormal( IDatasmithMaterialExpression* InMaterialExpression, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: FDatasmithFacadeMaterialExpression( InMaterialExpression, InMaterialElement )
{}
};
class FDatasmithFacadeMaterialExpressionGeneric : public FDatasmithFacadeMaterialExpression
{
public:
void SetExpressionName( const TCHAR* InExpressionName );
const TCHAR* GetExpressionName() const;
/** Get the total amount of properties in this expression */
int32 GetPropertiesCount() const;
/** Add a property to this expression*/
void AddProperty( const FDatasmithFacadeKeyValueProperty* InPropertyPtr );
/** Returns a new FDatasmithFacadeKeyValueProperty pointing to the property at the given index, the returned value must be deleted after used, can be nullptr. */
FDatasmithFacadeKeyValueProperty* GetNewProperty( int32 Index );
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeMaterialExpressionGeneric( IDatasmithMaterialExpression* InMaterialExpression, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: FDatasmithFacadeMaterialExpression( InMaterialExpression, InMaterialElement )
{}
};
class FDatasmithFacadeMaterialExpressionFunctionCall : public FDatasmithFacadeMaterialExpression
{
public:
void SetFunctionPathName( const TCHAR* InFunctionPathName );
const TCHAR* GetFunctionPathName() const;
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeMaterialExpressionFunctionCall( IDatasmithMaterialExpression* InMaterialExpression, const TSharedPtr<IDatasmithUEPbrMaterialElement>& InMaterialElement )
: FDatasmithFacadeMaterialExpression( InMaterialExpression, InMaterialElement )
{}
};
class DATASMITHFACADE_API FDatasmithFacadeUEPbrMaterial :
public FDatasmithFacadeBaseMaterial
{
friend class FDatasmithFacadeScene;
public:
FDatasmithFacadeUEPbrMaterial( const TCHAR* InElementName );
virtual ~FDatasmithFacadeUEPbrMaterial() {}
FDatasmithFacadeExpressionInput GetBaseColor() const;
FDatasmithFacadeExpressionInput GetMetallic() const;
FDatasmithFacadeExpressionInput GetSpecular() const;
FDatasmithFacadeExpressionInput GetRoughness() const;
FDatasmithFacadeExpressionInput GetEmissiveColor() const;
FDatasmithFacadeExpressionInput GetOpacity() const;
FDatasmithFacadeExpressionInput GetNormal() const;
FDatasmithFacadeExpressionInput GetRefraction() const;
FDatasmithFacadeExpressionInput GetAmbientOcclusion() const;
FDatasmithFacadeExpressionInput GetClearCoat() const;
FDatasmithFacadeExpressionInput GetClearCoatRoughness() const;
FDatasmithFacadeExpressionInput GetWorldPositionOffset() const;
FDatasmithFacadeExpressionInput GetMaterialAttributes() const;
int GetBlendMode() const;
void SetBlendMode( int bInBlendMode );
bool GetTwoSided() const;
void SetTwoSided( bool bTwoSided );
bool GetUseMaterialAttributes() const;
void SetUseMaterialAttributes( bool bInUseMaterialAttributes );
/** If a material is only referenced by other materials then it is only used as a material function and there is no need to instantiate it. */
bool GetMaterialFunctionOnly() const;
void SetMaterialFunctionOnly(bool bInMaterialFunctionOnly);
float GetOpacityMaskClipValue() const;
void SetOpacityMaskClipValue(float InClipValue);
int32 GetExpressionsCount() const;
/** Returns a new FDatasmithFacadeMaterialExpression pointing to the expression at the given index, the returned value must be deleted after used, can be nullptr. */
FDatasmithFacadeMaterialExpression* GetNewFacadeExpression( int32 Index );
int32 GetExpressionIndex( const FDatasmithFacadeMaterialExpression& Expression ) const;
template< typename T >
T AddMaterialExpression()
{
}
/** Reset all expression to their default values and remove all connections */
void ResetExpressionGraph()
{
constexpr bool bRemoveAllExpressions = false;
GetDatasmithUEPbrMaterialElement()->ResetExpressionGraph( bRemoveAllExpressions );
}
/** If a parent material is generated from this material, this will be its label. If none, the instance and the parent will have the same label. */
void SetParentLabel( const TCHAR* InParentLabel );
const TCHAR* GetParentLabel() const;
#ifdef SWIG_FACADE
protected:
#endif
FDatasmithFacadeUEPbrMaterial( const TSharedRef<IDatasmithUEPbrMaterialElement>& InMaterialRef );
IDatasmithMaterialExpression* AddMaterialExpression( const EDatasmithFacadeMaterialExpressionType ExpressionType );
TSharedRef<IDatasmithUEPbrMaterialElement> GetDatasmithUEPbrMaterialElement() const;
};
template<>
inline FDatasmithFacadeMaterialExpressionBool FDatasmithFacadeUEPbrMaterial::AddMaterialExpression< FDatasmithFacadeMaterialExpressionBool >()
{
return FDatasmithFacadeMaterialExpressionBool( AddMaterialExpression( EDatasmithFacadeMaterialExpressionType::ConstantBool), GetDatasmithUEPbrMaterialElement() );
}
template<>
inline FDatasmithFacadeMaterialExpressionColor FDatasmithFacadeUEPbrMaterial::AddMaterialExpression< FDatasmithFacadeMaterialExpressionColor >()
{
return FDatasmithFacadeMaterialExpressionColor( AddMaterialExpression( EDatasmithFacadeMaterialExpressionType::ConstantColor ), GetDatasmithUEPbrMaterialElement() );
}
template<>
inline FDatasmithFacadeMaterialExpressionFlattenNormal FDatasmithFacadeUEPbrMaterial::AddMaterialExpression< FDatasmithFacadeMaterialExpressionFlattenNormal >()
{
return FDatasmithFacadeMaterialExpressionFlattenNormal( AddMaterialExpression( EDatasmithFacadeMaterialExpressionType::FlattenNormal ), GetDatasmithUEPbrMaterialElement() );
}
template<>
inline FDatasmithFacadeMaterialExpressionFunctionCall FDatasmithFacadeUEPbrMaterial::AddMaterialExpression< FDatasmithFacadeMaterialExpressionFunctionCall >()
{
return FDatasmithFacadeMaterialExpressionFunctionCall( AddMaterialExpression( EDatasmithFacadeMaterialExpressionType::FunctionCall ), GetDatasmithUEPbrMaterialElement() );
}
template<>
inline FDatasmithFacadeMaterialExpressionGeneric FDatasmithFacadeUEPbrMaterial::AddMaterialExpression< FDatasmithFacadeMaterialExpressionGeneric >()
{
return FDatasmithFacadeMaterialExpressionGeneric( AddMaterialExpression( EDatasmithFacadeMaterialExpressionType::Generic ), GetDatasmithUEPbrMaterialElement() );
}
template<>
inline FDatasmithFacadeMaterialExpressionScalar FDatasmithFacadeUEPbrMaterial::AddMaterialExpression< FDatasmithFacadeMaterialExpressionScalar >()
{
return FDatasmithFacadeMaterialExpressionScalar( AddMaterialExpression( EDatasmithFacadeMaterialExpressionType::ConstantScalar ), GetDatasmithUEPbrMaterialElement() );
}
template<>
inline FDatasmithFacadeMaterialExpressionTexture FDatasmithFacadeUEPbrMaterial::AddMaterialExpression< FDatasmithFacadeMaterialExpressionTexture >()
{
return FDatasmithFacadeMaterialExpressionTexture( AddMaterialExpression( EDatasmithFacadeMaterialExpressionType::Texture ), GetDatasmithUEPbrMaterialElement() );
}
template<>
inline FDatasmithFacadeMaterialExpressionTextureCoordinate FDatasmithFacadeUEPbrMaterial::AddMaterialExpression< FDatasmithFacadeMaterialExpressionTextureCoordinate >()
{
return FDatasmithFacadeMaterialExpressionTextureCoordinate( AddMaterialExpression( EDatasmithFacadeMaterialExpressionType::TextureCoordinate ), GetDatasmithUEPbrMaterialElement() );
}