DatasmithMaterialElements.h
1 // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
2 #pragma once
3 
4 #include "IDatasmithSceneElements.h"
5 
7 
9 {
10 public:
11  virtual const TCHAR* GetInputName() const = 0;
12 
13  virtual IDatasmithMaterialExpression* GetExpression() = 0;
14  virtual const IDatasmithMaterialExpression* GetExpression() const = 0;
15  virtual void SetExpression( IDatasmithMaterialExpression* InExpression ) = 0;
16 
17  virtual int32 GetOutputIndex() const = 0;
18  virtual void SetOutputIndex( int32 InOutputIndex ) = 0;
19 };
20 
22 {
23 public:
24  virtual ~IDatasmithExpressionOutput() = default;
25 
26  virtual const TCHAR* GetOutputName() const = 0;
27  virtual void SetOutputName( const TCHAR* InOutputName ) = 0;
28 };
29 
31 {
32 public:
33  virtual ~IDatasmithExpressionParameter() = default;
34 
35  virtual const TCHAR* GetGroupName() const = 0;
36  virtual void SetGroupName( const TCHAR* InGroupName ) = 0;
37 };
38 
39 enum class EDatasmithMaterialExpressionType
40 {
41  ConstantBool,
42  ConstantColor,
43  ConstantScalar,
44  FlattenNormal,
45  FunctionCall,
46  Generic,
47  Texture,
48  TextureCoordinate
49 };
50 
52 {
53 public:
54  virtual ~IDatasmithMaterialExpression() = default;
55 
56  /** The name of the expression. Used as parameter name for material instances. */
57  virtual const TCHAR* GetName() const = 0;
58  virtual void SetName( const TCHAR* InName ) = 0;
59 
60  virtual EDatasmithMaterialExpressionType GetType() const = 0;
61  bool IsA( const EDatasmithMaterialExpressionType ExpressionType ) const { return ExpressionType == GetType(); }
62 
63  /** Connects the default output to an expression input */
64  virtual void ConnectExpression( IDatasmithExpressionInput& ExpressionInput ) = 0;
65 
66  /** Connects a specific output to an expression input */
67  virtual void ConnectExpression( IDatasmithExpressionInput& ExpressionInput, int32 OutputIndex ) = 0;
68 
69  virtual int32 GetInputCount() const = 0;
70  virtual IDatasmithExpressionInput* GetInput( int32 Index ) = 0;
71  virtual const IDatasmithExpressionInput* GetInput( int32 Index ) const = 0;
72 
73  /** The output index to use by default for this expression when connecting it to other inputs. */
74  virtual int32 GetDefaultOutputIndex() const = 0;
75  virtual void SetDefaultOutputIndex( int32 OutputIndex ) = 0;
76 };
77 
78 /**
79  * Represents a UMaterialExpressionStaticBoolParameter
80  */
82 {
83 public:
84  virtual bool& GetBool() = 0;
85  virtual const bool& GetBool() const = 0;
86 };
87 
89 {
90 public:
91  virtual FLinearColor& GetColor() = 0;
92  virtual const FLinearColor& GetColor() const = 0;
93 };
94 
96 {
97 public:
98  virtual float& GetScalar() = 0;
99  virtual const float& GetScalar() const = 0;
100 };
101 
103 {
104 public:
105  virtual const TCHAR* GetTexturePathName() const = 0;
106  virtual void SetTexturePathName( const TCHAR* InTexturePathName ) = 0;
107 
108  /**
109  * Inputs
110  */
112  virtual const IDatasmithExpressionInput& GetInputCoordinate() const = 0;
113 
114  /**
115  * Outputs:
116  * - RGB
117  * - R
118  * - G
119  * - B
120  * - A
121  */
122 };
123 
125 {
126 public:
127  virtual int32 GetCoordinateIndex() const = 0;
128  virtual void SetCoordinateIndex( int32 InCoordinateIndex ) = 0;
129 
130  virtual float GetUTiling() const = 0;
131  virtual void SetUTiling( float InUTiling ) = 0;
132 
133  virtual float GetVTiling() const = 0;
134  virtual void SetVTiling( float InCoordinateIndex ) = 0;
135 };
136 
138 {
139 public:
140  /**
141  * Inputs
142  */
143  virtual IDatasmithExpressionInput& GetNormal() = 0;
144  virtual const IDatasmithExpressionInput& GetNormal() const = 0;
145 
146  virtual IDatasmithExpressionInput& GetFlatness() = 0;
147  virtual const IDatasmithExpressionInput& GetFlatness() const = 0;
148 
149  /**
150  * Outputs:
151  * - RGB
152  */
153 };
154 
156 {
157 public:
158  virtual void SetExpressionName( const TCHAR* InExpressionName ) = 0;
159  virtual const TCHAR* GetExpressionName() const = 0;
160 
161  /** Get the total amount of properties in this expression */
162  virtual int32 GetPropertiesCount() const = 0;
163 
164  /** Get the property i-th of this expression */
165  virtual const TSharedPtr< IDatasmithKeyValueProperty >& GetProperty(int32 i) const = 0;
166  virtual TSharedPtr< IDatasmithKeyValueProperty >& GetProperty(int32 i) = 0;
167 
168  /** Get a property by its name if it exists */
169  virtual const TSharedPtr< IDatasmithKeyValueProperty >& GetPropertyByName(const TCHAR* Name) const = 0;
170  virtual TSharedPtr< IDatasmithKeyValueProperty >& GetPropertyByName(const TCHAR* Name) = 0;
171 
172  /** Add a property to this expression*/
173  virtual void AddProperty( const TSharedPtr< IDatasmithKeyValueProperty >& Property ) = 0;
174 };
175 
177 {
178 public:
179  virtual void SetFunctionPathName( const TCHAR* InFunctionPathName ) = 0;
180  virtual const TCHAR* GetFunctionPathName() const = 0;
181 
182 };
183 
185 {
186 public:
187  virtual IDatasmithExpressionInput& GetBaseColor() = 0;
188  virtual IDatasmithExpressionInput& GetMetallic() = 0;
189  virtual IDatasmithExpressionInput& GetSpecular() = 0;
190  virtual IDatasmithExpressionInput& GetRoughness() = 0;
191  virtual IDatasmithExpressionInput& GetEmissiveColor() = 0;
192  virtual IDatasmithExpressionInput& GetOpacity() = 0;
193  virtual IDatasmithExpressionInput& GetNormal() = 0;
194  virtual IDatasmithExpressionInput& GetWorldDisplacement() = 0;
195  virtual IDatasmithExpressionInput& GetRefraction() = 0;
196  virtual IDatasmithExpressionInput& GetAmbientOcclusion() = 0;
197  virtual IDatasmithExpressionInput& GetMaterialAttributes() = 0;
198 
199  virtual int GetBlendMode() const = 0;
200  virtual void SetBlendMode( int bInBlendMode ) = 0;
201 
202  virtual bool GetTwoSided() const = 0;
203  virtual void SetTwoSided( bool bTwoSided ) = 0;
204 
205  virtual bool GetUseMaterialAttributes() const = 0;
206  virtual void SetUseMaterialAttributes( bool bInUseMaterialAttributes ) = 0;
207 
208  /** 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. */
209  virtual bool GetMaterialFunctionOnly() const = 0;
210  virtual void SetMaterialFunctionOnly(bool bInMaterialFunctionOnly) = 0;
211 
212  virtual int32 GetExpressionsCount() const = 0;
213  virtual IDatasmithMaterialExpression* GetExpression( int32 Index ) = 0;
214  virtual int32 GetExpressionIndex( const IDatasmithMaterialExpression* Expression ) const = 0;
215 
216  virtual IDatasmithMaterialExpression* AddMaterialExpression( const EDatasmithMaterialExpressionType ExpressionType ) = 0;
217 
218  template< typename T >
219  T* AddMaterialExpression()
220  {
221  }
222 
223  /** 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. */
224  virtual void SetParentLabel( const TCHAR* InParentLabel ) = 0;
225  virtual const TCHAR* GetParentLabel() const = 0;
226 };
227 
228 template<>
229 inline IDatasmithMaterialExpressionBool* IDatasmithUEPbrMaterialElement::AddMaterialExpression< IDatasmithMaterialExpressionBool >()
230 {
231  return static_cast< IDatasmithMaterialExpressionBool* >( AddMaterialExpression( EDatasmithMaterialExpressionType::ConstantBool ) );
232 }
233 
234 template<>
235 inline IDatasmithMaterialExpressionColor* IDatasmithUEPbrMaterialElement::AddMaterialExpression< IDatasmithMaterialExpressionColor >()
236 {
237  return static_cast< IDatasmithMaterialExpressionColor* >( AddMaterialExpression( EDatasmithMaterialExpressionType::ConstantColor ) );
238 }
239 
240 template<>
241 inline IDatasmithMaterialExpressionFlattenNormal* IDatasmithUEPbrMaterialElement::AddMaterialExpression< IDatasmithMaterialExpressionFlattenNormal >()
242 {
243  return static_cast< IDatasmithMaterialExpressionFlattenNormal* >( AddMaterialExpression( EDatasmithMaterialExpressionType::FlattenNormal ) );
244 }
245 
246 template<>
247 inline IDatasmithMaterialExpressionFunctionCall* IDatasmithUEPbrMaterialElement::AddMaterialExpression< IDatasmithMaterialExpressionFunctionCall >()
248 {
249  return static_cast< IDatasmithMaterialExpressionFunctionCall* >( AddMaterialExpression( EDatasmithMaterialExpressionType::FunctionCall ) );
250 }
251 
252 template<>
253 inline IDatasmithMaterialExpressionGeneric* IDatasmithUEPbrMaterialElement::AddMaterialExpression< IDatasmithMaterialExpressionGeneric >()
254 {
255  return static_cast< IDatasmithMaterialExpressionGeneric* >( AddMaterialExpression( EDatasmithMaterialExpressionType::Generic ) );
256 }
257 
258 template<>
259 inline IDatasmithMaterialExpressionScalar* IDatasmithUEPbrMaterialElement::AddMaterialExpression< IDatasmithMaterialExpressionScalar >()
260 {
261  return static_cast< IDatasmithMaterialExpressionScalar* >( AddMaterialExpression( EDatasmithMaterialExpressionType::ConstantScalar ) );
262 }
263 
264 template<>
265 inline IDatasmithMaterialExpressionTexture* IDatasmithUEPbrMaterialElement::AddMaterialExpression< IDatasmithMaterialExpressionTexture >()
266 {
267  return static_cast< IDatasmithMaterialExpressionTexture* >( AddMaterialExpression( EDatasmithMaterialExpressionType::Texture ) );
268 }
269 
270 template<>
271 inline IDatasmithMaterialExpressionTextureCoordinate* IDatasmithUEPbrMaterialElement::AddMaterialExpression< IDatasmithMaterialExpressionTextureCoordinate >()
272 {
273  return static_cast< IDatasmithMaterialExpressionTextureCoordinate* >( AddMaterialExpression( EDatasmithMaterialExpressionType::TextureCoordinate ) );
274 }
IDatasmithMaterialExpression
Definition: DatasmithMaterialElements.h:51
IDatasmithMaterialExpressionTextureCoordinate
Definition: DatasmithMaterialElements.h:124
IDatasmithMaterialExpressionColor
Definition: DatasmithMaterialElements.h:88
IDatasmithMaterialExpressionTexture::GetInputCoordinate
virtual IDatasmithExpressionInput & GetInputCoordinate()=0
Inputs.
IDatasmithMaterialExpressionFlattenNormal
Definition: DatasmithMaterialElements.h:137
IDatasmithMaterialExpression::GetDefaultOutputIndex
virtual int32 GetDefaultOutputIndex() const =0
The output index to use by default for this expression when connecting it to other inputs.
IDatasmithMaterialExpressionGeneric::GetPropertiesCount
virtual int32 GetPropertiesCount() const =0
Get the total amount of properties in this expression.
IDatasmithMaterialExpressionGeneric::GetPropertyByName
virtual const TSharedPtr< IDatasmithKeyValueProperty > & GetPropertyByName(const TCHAR *Name) const =0
Get a property by its name if it exists.
IDatasmithMaterialExpressionFlattenNormal::GetNormal
virtual IDatasmithExpressionInput & GetNormal()=0
Inputs.
IDatasmithMaterialExpression::ConnectExpression
virtual void ConnectExpression(IDatasmithExpressionInput &ExpressionInput)=0
Connects the default output to an expression input.
IDatasmithExpressionOutput
Definition: DatasmithMaterialElements.h:21
IDatasmithUEPbrMaterialElement
Definition: DatasmithMaterialElements.h:184
IDatasmithMaterialExpressionGeneric::GetProperty
virtual const TSharedPtr< IDatasmithKeyValueProperty > & GetProperty(int32 i) const =0
Get the property i-th of this expression.
IDatasmithMaterialExpressionTexture
Definition: DatasmithMaterialElements.h:102
IDatasmithBaseMaterialElement
Definition: IDatasmithSceneElements.h:592
IDatasmithMaterialExpressionGeneric
Definition: DatasmithMaterialElements.h:155
IDatasmithMaterialExpressionScalar
Definition: DatasmithMaterialElements.h:95
IDatasmithMaterialExpressionFunctionCall
Definition: DatasmithMaterialElements.h:176
IDatasmithMaterialExpressionBool
Represents a UMaterialExpressionStaticBoolParameter.
Definition: DatasmithMaterialElements.h:81
IDatasmithExpressionInput
Definition: DatasmithMaterialElements.h:8
IDatasmithMaterialExpression::GetName
virtual const TCHAR * GetName() const =0
The name of the expression.
IDatasmithMaterialExpressionGeneric::AddProperty
virtual void AddProperty(const TSharedPtr< IDatasmithKeyValueProperty > &Property)=0
Add a property to this expression.
IDatasmithExpressionParameter
Definition: DatasmithMaterialElements.h:30