DatasmithMaterialElementsImpl.h
1 // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
2 #pragma once
3 
4 #include "DatasmithMaterialElements.h"
5 #include "DatasmithSceneElementsImpl.h"
6 
7 #include "Algo/Find.h"
8 #include "Containers/Array.h"
9 
10 template< typename InterfaceType >
11 class FDatasmithExpressionInputImpl : public InterfaceType
12 {
13 public:
14  inline explicit FDatasmithExpressionInputImpl( const TCHAR* InInputName );
15  virtual ~FDatasmithExpressionInputImpl() = default;
16 
17  virtual const TCHAR* GetInputName() const override { return *InputName; }
18 
19  virtual IDatasmithMaterialExpression* GetExpression() override { return Expression; }
20  virtual const IDatasmithMaterialExpression* GetExpression() const { return Expression; }
21  virtual void SetExpression( IDatasmithMaterialExpression* InExpression ) override { Expression = InExpression; }
22 
23  virtual int32 GetOutputIndex() const override { return OutputIndex; }
24  virtual void SetOutputIndex( int32 InOutputIndex ) override { OutputIndex = InOutputIndex; }
25 
26 protected:
27  FString InputName;
28  IDatasmithMaterialExpression* Expression;
29  int32 OutputIndex;
30 };
31 
33 {
34 public:
35  explicit FDatasmithExpressionOutputImpl( const TCHAR* InOutputName )
36  : OutputName( InOutputName )
37  {
38  }
39 
40  virtual const TCHAR* GetOutputName() const override { return *OutputName; }
41  virtual void SetOutputName( const TCHAR* InOutputName ) override { OutputName = InOutputName; }
42 
43 protected:
44  FString OutputName;
45 };
46 
47 template< typename InterfaceType >
48 class FDatasmithMaterialExpressionImpl : public InterfaceType
49 {
50 public:
52  : DefaultOutputIndex( 0 )
53  {
54  }
55 
56  virtual ~FDatasmithMaterialExpressionImpl() = default;
57 
58  virtual const TCHAR* GetName() const override { return *Name; }
59  virtual void SetName( const TCHAR* InName ) override { Name = InName; }
60 
61  virtual void ConnectExpression( IDatasmithExpressionInput& ExpressionInput ) override
62  {
63  ConnectExpression( ExpressionInput, GetDefaultOutputIndex() );
64  }
65 
66  inline virtual void ConnectExpression( IDatasmithExpressionInput& ExpressionInput, int32 OutputIndex ) override;
67 
68  virtual int32 GetInputCount() const override { return 0; }
69  virtual IDatasmithExpressionInput* GetInput( int32 Index ) override { return nullptr; }
70  virtual const IDatasmithExpressionInput* GetInput( int32 Index ) const override { return nullptr; }
71 
72  virtual int32 GetDefaultOutputIndex() const override { return DefaultOutputIndex; }
73  virtual void SetDefaultOutputIndex( int32 InDefaultOutputIndex ) override { DefaultOutputIndex = InDefaultOutputIndex; }
74 
75 protected:
76  TArray< FDatasmithExpressionOutputImpl > Outputs;
77 
78  FString Name;
79  int32 DefaultOutputIndex;
80 };
81 
82 template< typename InterfaceType >
84 {
85 public:
86  virtual const TCHAR* GetGroupName() const override { return *GroupName; }
87  virtual void SetGroupName( const TCHAR* InGroupName ) override { GroupName = InGroupName; }
88 
89 protected:
90  FString GroupName;
91 };
92 
93 class FDatasmithMaterialExpressionBoolImpl : public FDatasmithExpressionParameterImpl< IDatasmithMaterialExpressionBool >
94 {
95 public:
97 
98  virtual EDatasmithMaterialExpressionType GetType() const override { return EDatasmithMaterialExpressionType::ConstantBool; }
99 
100  virtual bool& GetBool() override { return bValue; }
101  virtual const bool& GetBool() const override { return bValue; }
102 
103 protected:
104  bool bValue;
105 };
106 
107 class FDatasmithMaterialExpressionColorImpl : public FDatasmithExpressionParameterImpl< IDatasmithMaterialExpressionColor >
108 {
109 public:
111 
112  virtual EDatasmithMaterialExpressionType GetType() const override { return EDatasmithMaterialExpressionType::ConstantColor; }
113 
114  virtual FLinearColor& GetColor() override { return LinearColor; }
115  virtual const FLinearColor& GetColor() const override { return LinearColor; }
116 
117 protected:
118  FLinearColor LinearColor;
119 };
120 
121 class FDatasmithMaterialExpressionScalarImpl : public FDatasmithExpressionParameterImpl< IDatasmithMaterialExpressionScalar >
122 {
123 public:
125 
126  virtual EDatasmithMaterialExpressionType GetType() const override { return EDatasmithMaterialExpressionType::ConstantScalar; }
127 
128  virtual float& GetScalar() override { return Scalar; }
129  virtual const float& GetScalar() const override { return Scalar; }
130 
131 protected:
132  float Scalar;
133 };
134 
135 class FDatasmithMaterialExpressionTextureImpl : public FDatasmithExpressionParameterImpl< IDatasmithMaterialExpressionTexture >
136 {
137 public:
139 
140  virtual EDatasmithMaterialExpressionType GetType() const override { return EDatasmithMaterialExpressionType::Texture; }
141 
142  virtual const TCHAR* GetTexturePathName() const override { return *TexturePathName; }
143  virtual void SetTexturePathName( const TCHAR* InTexturePathName ) { TexturePathName = InTexturePathName; }
144 
145  /**
146  * Inputs
147  */
148  virtual IDatasmithExpressionInput& GetInputCoordinate() override { return TextureCoordinate; }
149  virtual const IDatasmithExpressionInput& GetInputCoordinate() const override { return TextureCoordinate; }
150 
151  virtual int32 GetInputCount() const override { return 1; }
152  virtual IDatasmithExpressionInput* GetInput( int32 Index ) override { return &TextureCoordinate; }
153  virtual const IDatasmithExpressionInput* GetInput( int32 Index ) const override { return &TextureCoordinate; }
154 
155 protected:
156  FString TexturePathName;
157 
159 
160  /**
161  * Outputs:
162  * - RGB
163  * - R
164  * - G
165  * - B
166  * - A
167  */
168 };
169 
170 class FDatasmithMaterialExpressionTextureCoordinateImpl : public FDatasmithMaterialExpressionImpl< IDatasmithMaterialExpressionTextureCoordinate >
171 {
172 public:
174 
175  virtual EDatasmithMaterialExpressionType GetType() const override { return EDatasmithMaterialExpressionType::TextureCoordinate; }
176 
177  virtual int32 GetCoordinateIndex() const override { return CoordinateIndex; }
178  virtual void SetCoordinateIndex( int32 InCoordinateIndex ) override { CoordinateIndex = InCoordinateIndex; }
179 
180  virtual float GetUTiling() const override { return UTiling; }
181  virtual void SetUTiling( float InUTiling ) override { UTiling = InUTiling; }
182 
183  virtual float GetVTiling() const override { return VTiling;}
184  virtual void SetVTiling( float InVTiling ) override { VTiling = InVTiling; }
185 
186 protected:
187  int32 CoordinateIndex;
188  float UTiling;
189  float VTiling;
190 };
191 
192 class FDatasmithMaterialExpressionFlattenNormalImpl : public FDatasmithMaterialExpressionImpl< IDatasmithMaterialExpressionFlattenNormal >
193 {
194 public:
196 
197  virtual EDatasmithMaterialExpressionType GetType() const override { return EDatasmithMaterialExpressionType::FlattenNormal; }
198 
199  virtual IDatasmithExpressionInput& GetNormal() override { return Normal; }
200  virtual const IDatasmithExpressionInput& GetNormal() const override { return Normal; }
201 
202  virtual IDatasmithExpressionInput& GetFlatness() override { return Normal; }
203  virtual const IDatasmithExpressionInput& GetFlatness() const override { return Normal; }
204 
205  virtual int32 GetInputCount() const override { return 2; }
206  virtual IDatasmithExpressionInput* GetInput( int32 Index ) override { return Index == 0 ? &Normal : &Flatness; }
207  virtual const IDatasmithExpressionInput* GetInput( int32 Index ) const override { return Index == 0 ? &Normal : &Flatness; }
208 
209 protected:
212 };
213 
214 class FDatasmithMaterialExpressionGenericImpl : public FDatasmithMaterialExpressionImpl< IDatasmithMaterialExpressionGeneric >
215 {
216 public:
217  static TSharedPtr< IDatasmithKeyValueProperty > NullPropertyPtr;
218 
219  virtual EDatasmithMaterialExpressionType GetType() const override { return EDatasmithMaterialExpressionType::Generic; }
220 
221  virtual void SetExpressionName( const TCHAR* InExpressionName ) override { ExpressionName = InExpressionName; }
222  virtual const TCHAR* GetExpressionName() const override { return *ExpressionName; }
223 
224  int32 GetPropertiesCount() const override { return Properties.Num(); }
225 
226  const TSharedPtr< IDatasmithKeyValueProperty >& GetProperty( int32 InIndex ) const override;
227  TSharedPtr< IDatasmithKeyValueProperty >& GetProperty( int32 InIndex ) override;
228 
229  const TSharedPtr< IDatasmithKeyValueProperty >& GetPropertyByName( const TCHAR* InName ) const override;
230  TSharedPtr< IDatasmithKeyValueProperty >& GetPropertyByName( const TCHAR* InName ) override;
231 
232  void AddProperty( const TSharedPtr< IDatasmithKeyValueProperty >& InProperty ) override;
233 
234  virtual int32 GetInputCount() const override { return Inputs.Num(); }
235  virtual IDatasmithExpressionInput* GetInput( int32 Index ) override
236  {
237  while ( !Inputs.IsValidIndex( Index ) )
238  {
239  Inputs.Emplace( *FString::FromInt( Inputs.Num() ) );
240  }
241 
242  return &Inputs[ Index ];
243  }
244 
245  virtual const IDatasmithExpressionInput* GetInput( int32 Index ) const override { return Inputs.IsValidIndex( Index ) ? &Inputs[ Index ] : nullptr; }
246 
247 protected:
248  TArray< FDatasmithExpressionInputImpl< IDatasmithExpressionInput > > Inputs;
249  FString ExpressionName;
250 
251  TArray< TSharedPtr< IDatasmithKeyValueProperty > > Properties;
252  TMap< FString, int > PropertyIndexMap;
253 };
254 
255 class FDatasmithMaterialExpressionFunctionCallImpl : public FDatasmithMaterialExpressionImpl< IDatasmithMaterialExpressionFunctionCall >
256 {
257 public:
258  virtual EDatasmithMaterialExpressionType GetType() const override { return EDatasmithMaterialExpressionType::FunctionCall; }
259 
260  virtual void SetFunctionPathName( const TCHAR* InFunctionPathName ) override { FunctionPathName = InFunctionPathName; }
261  virtual const TCHAR* GetFunctionPathName() const override { return *FunctionPathName; }
262 
263  virtual int32 GetInputCount() const override { return Inputs.Num(); }
264  virtual IDatasmithExpressionInput* GetInput( int32 Index ) override
265  {
266  while ( !Inputs.IsValidIndex( Index ) )
267  {
268  Inputs.Emplace( *FString::FromInt( Inputs.Num() ) );
269  }
270 
271  return &Inputs[ Index ];
272  }
273 
274  virtual const IDatasmithExpressionInput* GetInput( int32 Index ) const override { return Inputs.IsValidIndex( Index ) ? &Inputs[ Index ] : nullptr; }
275 
276 protected:
277  TArray< FDatasmithExpressionInputImpl< IDatasmithExpressionInput > > Inputs;
278  FString FunctionPathName;
279 
280 };
281 
282 class DATASMITHCORE_API FDatasmithUEPbrMaterialElementImpl : public FDatasmithBaseMaterialElementImpl< IDatasmithUEPbrMaterialElement >
283 {
284 public:
285  explicit FDatasmithUEPbrMaterialElementImpl( const TCHAR* InName );
287 
288  virtual IDatasmithExpressionInput& GetBaseColor() override { return BaseColor; }
289  virtual IDatasmithExpressionInput& GetMetallic() override { return Metallic; }
290  virtual IDatasmithExpressionInput& GetSpecular() override { return Specular; }
291  virtual IDatasmithExpressionInput& GetRoughness() override { return Roughness; }
292  virtual IDatasmithExpressionInput& GetEmissiveColor() override { return EmissiveColor; }
293  virtual IDatasmithExpressionInput& GetOpacity() override { return Opacity; }
294  virtual IDatasmithExpressionInput& GetNormal() override { return Normal; }
295  virtual IDatasmithExpressionInput& GetWorldDisplacement() override { return WorldDisplacement; }
296  virtual IDatasmithExpressionInput& GetRefraction() override { return Refraction; }
297  virtual IDatasmithExpressionInput& GetAmbientOcclusion() override { return AmbientOcclusion; }
298  virtual IDatasmithExpressionInput& GetMaterialAttributes() override { return MaterialAttributes; }
299 
300  virtual int GetBlendMode() const override {return BlendMode; }
301  virtual void SetBlendMode( int InBlendMode ) override { BlendMode = InBlendMode; }
302 
303  virtual bool GetTwoSided() const override {return bTwoSided; }
304  virtual void SetTwoSided( bool bInTwoSided ) override { bTwoSided = bInTwoSided; }
305 
306  virtual bool GetUseMaterialAttributes() const override{ return bUseMaterialAttributes; }
307  virtual void SetUseMaterialAttributes( bool bInUseMaterialAttributes ) override { bUseMaterialAttributes = bInUseMaterialAttributes; }
308 
309  virtual bool GetMaterialFunctionOnly() const override { return bMaterialFunctionOnly; };
310  virtual void SetMaterialFunctionOnly(bool bInMaterialFunctionOnly) override { bMaterialFunctionOnly = bInMaterialFunctionOnly; };
311 
312  virtual int32 GetExpressionsCount() const override { return Expressions.Num(); }
313  virtual IDatasmithMaterialExpression* GetExpression( int32 Index ) override { IDatasmithMaterialExpression* Expression = Expressions.IsValidIndex( Index ) ? Expressions[ Index ] : nullptr; return Expression; }
314  virtual int32 GetExpressionIndex( const IDatasmithMaterialExpression* Expression ) const override;
315 
316  virtual IDatasmithMaterialExpression* AddMaterialExpression( const EDatasmithMaterialExpressionType ExpressionType ) override;
317 
318  virtual void SetParentLabel( const TCHAR* InParentLabel ) override { ParentLabel = InParentLabel; }
319  virtual const TCHAR* GetParentLabel() const override;
320 
321 protected:
333 
334  TArray< IDatasmithMaterialExpression* > Expressions;
335 
336  int BlendMode;
337  bool bTwoSided;
338  bool bUseMaterialAttributes;
339  bool bMaterialFunctionOnly;
340 
341  FString ParentLabel;
342 };
343 
344 template< typename InterfaceType >
346  : InputName( InInputName )
347  , Expression( nullptr )
348  , OutputIndex( 0 )
349 {
350 }
351 
352 template< typename InterfaceType >
354 {
355  while ( !Outputs.IsValidIndex( InOutputIndex ) )
356  {
357  Outputs.Emplace( TEXT("Ouput") );
358  }
359 
360  int32 OutputIndex = Outputs.IsValidIndex( InOutputIndex ) ? InOutputIndex : INDEX_NONE;
361 
362  if ( OutputIndex != INDEX_NONE )
363  {
364  ExpressionInput.SetExpression( this );
365  ExpressionInput.SetOutputIndex( OutputIndex );
366  }
367 }
IDatasmithMaterialExpression
Definition: DatasmithMaterialElements.h:51
FDatasmithMaterialExpressionGenericImpl::GetPropertyByName
const TSharedPtr< IDatasmithKeyValueProperty > & GetPropertyByName(const TCHAR *InName) const override
Get a property by its name if it exists.
FDatasmithUEPbrMaterialElementImpl::GetMaterialFunctionOnly
virtual bool GetMaterialFunctionOnly() const override
If a material is only referenced by other materials then it is only used as a material function and t...
Definition: DatasmithMaterialElementsImpl.h:309
FDatasmithMaterialExpressionGenericImpl::GetProperty
const TSharedPtr< IDatasmithKeyValueProperty > & GetProperty(int32 InIndex) const override
Get the property i-th of this expression.
FDatasmithMaterialExpressionGenericImpl::GetPropertiesCount
int32 GetPropertiesCount() const override
Get the total amount of properties in this expression.
Definition: DatasmithMaterialElementsImpl.h:224
FDatasmithMaterialExpressionGenericImpl
Definition: DatasmithMaterialElementsImpl.h:214
FDatasmithMaterialExpressionFlattenNormalImpl
Definition: DatasmithMaterialElementsImpl.h:192
FDatasmithExpressionInputImpl
Definition: DatasmithMaterialElementsImpl.h:11
FDatasmithMaterialExpressionTextureImpl::GetInputCoordinate
virtual IDatasmithExpressionInput & GetInputCoordinate() override
Inputs.
Definition: DatasmithMaterialElementsImpl.h:148
IDatasmithExpressionOutput
Definition: DatasmithMaterialElements.h:21
FDatasmithMaterialExpressionBoolImpl
Definition: DatasmithMaterialElementsImpl.h:93
FDatasmithMaterialExpressionScalarImpl
Definition: DatasmithMaterialElementsImpl.h:121
FDatasmithBaseMaterialElementImpl
Definition: DatasmithSceneElementsImpl.h:1134
FDatasmithMaterialExpressionFlattenNormalImpl::GetNormal
virtual IDatasmithExpressionInput & GetNormal() override
Inputs.
Definition: DatasmithMaterialElementsImpl.h:199
FDatasmithMaterialExpressionFunctionCallImpl
Definition: DatasmithMaterialElementsImpl.h:255
FDatasmithMaterialExpressionColorImpl
Definition: DatasmithMaterialElementsImpl.h:107
FDatasmithMaterialExpressionTextureImpl
Definition: DatasmithMaterialElementsImpl.h:135
IDatasmithExpressionInput
Definition: DatasmithMaterialElements.h:8
FDatasmithExpressionOutputImpl
Definition: DatasmithMaterialElementsImpl.h:32
FDatasmithMaterialExpressionImpl
Definition: DatasmithMaterialElementsImpl.h:48
FDatasmithMaterialExpressionTextureCoordinateImpl
Definition: DatasmithMaterialElementsImpl.h:170
FDatasmithUEPbrMaterialElementImpl::SetParentLabel
virtual void SetParentLabel(const TCHAR *InParentLabel) override
If a parent material is generated from this material, this will be its label.
Definition: DatasmithMaterialElementsImpl.h:318
FDatasmithMaterialExpressionGenericImpl::AddProperty
void AddProperty(const TSharedPtr< IDatasmithKeyValueProperty > &InProperty) override
Add a property to this expression.
FDatasmithExpressionParameterImpl
Definition: DatasmithMaterialElementsImpl.h:83
FDatasmithUEPbrMaterialElementImpl
Definition: DatasmithMaterialElementsImpl.h:282