2#include "MaterialExpressionIVSmoke_TextureSample.h"
3#include "MaterialCompiler.h"
5#define LOCTEXT_NAMESPACE "IVSmokeMaterialExpressions"
7UMaterialExpressionIVSmoke_TextureSample::UMaterialExpressionIVSmoke_TextureSample()
15#if WITH_EDITORONLY_DATA
16 MenuCategories.Add(LOCTEXT(
"IVSmokeCategory",
"IVSmoke"));
20 Outputs.Add(FExpressionOutput(TEXT(
"Color")));
23int32 UMaterialExpressionIVSmoke_TextureSample::Compile(
class FMaterialCompiler* Compiler, int32 OutputIndex)
30 uint32 SceneTextureId = 0;
33 case EIVSmokeTextureType::SmokeColor:
34 SceneTextureId = PPI_PostProcessInput0;
36 case EIVSmokeTextureType::SmokeLocalPos:
37 SceneTextureId = PPI_PostProcessInput1;
39 case EIVSmokeTextureType::SceneColor:
40 SceneTextureId = PPI_PostProcessInput3;
42 case EIVSmokeTextureType::SmokeWorldPosLinearDepth:
43 SceneTextureId = PPI_PostProcessInput4;
46 return Compiler->Errorf(TEXT(
"Invalid texture type"));
49 int32 UVsInput = INDEX_NONE;
53 UVsInput =
UVs.Compile(Compiler);
57 UVsInput = Compiler->GetViewportUV();
61 int32 SceneTexSize = Compiler->GetSceneTextureViewSize(PPI_PostProcessInput3,
false);
62 int32 ViewportSize = Compiler->ViewProperty(MEVP_ViewSize,
false);
63 int32 NormalizedUV = Compiler->Div(UVsInput, SceneTexSize);
64 UVsInput = Compiler->Mul(NormalizedUV, ViewportSize);
67 if (UVsInput == INDEX_NONE)
69 return Compiler->Errorf(TEXT(
"Failed to compile UV input"));
72 int32 SceneTextureLookup = Compiler->SceneTextureLookup(
80 if (SceneTextureLookup == INDEX_NONE)
82 return Compiler->Errorf(TEXT(
"Failed to sample scene texture"));
85 if (!
R && !
G && !
B && !
A)
87 return Compiler->Errorf(TEXT(
"At least one channel must be selected"));
92 return SceneTextureLookup;
95 return Compiler->ComponentMask(SceneTextureLookup,
R,
G,
B,
A);
98void UMaterialExpressionIVSmoke_TextureSample::GetCaption(TArray<FString>& OutCaptions)
const
103 case EIVSmokeTextureType::SmokeColor:
104 TypeName = TEXT(
"SmokeColor");
106 case EIVSmokeTextureType::SmokeLocalPos:
107 TypeName = TEXT(
"SmokeLocalPos");
109 case EIVSmokeTextureType::SceneColor:
110 TypeName = TEXT(
"SceneColor");
112 case EIVSmokeTextureType::SmokeWorldPosLinearDepth:
113 TypeName = TEXT(
"SmokeWorldPosLinearDepth");
116 TypeName = TEXT(
"Unknown");
119 OutCaptions.Add(FString::Printf(TEXT(
"IVSmoke Sample [%s]"), *TypeName));
122uint32 UMaterialExpressionIVSmoke_TextureSample::GetOutputType(int32 OutputIndex)
124 int32 NumChannels = 0;
125 if (
R) NumChannels++;
126 if (
G) NumChannels++;
127 if (
B) NumChannels++;
128 if (
A) NumChannels++;
145#undef LOCTEXT_NAMESPACE
EIVSmokeTextureType TextureType