Files
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

234 lines
11 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "NiagaraBatchedElements.h"
#include "GlobalRenderResources.h"
#include "GlobalShader.h"
#include "PipelineStateCache.h"
#include "RHIStaticStates.h"
#include "SimpleElementShaders.h"
#include "ShaderParameterStruct.h"
#include "ShaderParameterMacros.h"
#include "ShaderParameterUtils.h"
//////////////////////////////////////////////////////////////////////////
class FNiagaraSimpleElement2DArrayAttribute : public FGlobalShader
{
DECLARE_GLOBAL_SHADER(FNiagaraSimpleElement2DArrayAttribute);
SHADER_USE_PARAMETER_STRUCT(FNiagaraSimpleElement2DArrayAttribute, FGlobalShader);
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
{
return true;
}
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
OutEnvironment.SetDefine(TEXT("NIAGARA_2DARRAY_ATTRIBUTE_PS"), 1);
}
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
SHADER_PARAMETER(FIntVector4, InAttributeSlices)
SHADER_PARAMETER(FMatrix44f, InColorWeights)
SHADER_PARAMETER(float, InGamma)
SHADER_PARAMETER_TEXTURE(Texture2D, InTexture)
SHADER_PARAMETER_SAMPLER(SamplerState, InTextureSampler)
END_SHADER_PARAMETER_STRUCT()
};
IMPLEMENT_GLOBAL_SHADER(FNiagaraSimpleElement2DArrayAttribute, "/Plugin/FX/Niagara/Private/NiagaraBatchedElements.usf", "MainPS", SF_Pixel);
void FBatchedElementNiagara2DArrayAttribute::BindShaders(FRHICommandList& RHICmdList, FGraphicsPipelineStateInitializer& GraphicsPSOInit, ERHIFeatureLevel::Type InFeatureLevel, const FMatrix& InTransform, const float InGamma, const FMatrix& ColorWeights, const FTexture* Texture)
{
FRHITexture* RHITexture = nullptr;
FRHISamplerState* RHISamplerState = nullptr;
if (GetTextureAndSampler != nullptr)
{
GetTextureAndSampler(RHITexture, RHISamplerState);
}
else if ( Texture != nullptr )
{
RHITexture = Texture->TextureRHI;
RHISamplerState = Texture->SamplerStateRHI;
}
TShaderMapRef<FSimpleElementVS> VertexShader(GetGlobalShaderMap(InFeatureLevel));
TShaderMapRef<FNiagaraSimpleElement2DArrayAttribute> PixelShader(GetGlobalShaderMap(InFeatureLevel));
GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GSimpleElementVertexDeclaration.VertexDeclarationRHI;
GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader.GetVertexShader();
GraphicsPSOInit.BoundShaderState.PixelShaderRHI = PixelShader.GetPixelShader();
GraphicsPSOInit.PrimitiveType = PT_TriangleList;
GraphicsPSOInit.BlendState = TStaticBlendState<>::GetRHI();
RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit, 0);
SetShaderParametersLegacyVS(RHICmdList, VertexShader, InTransform);
FNiagaraSimpleElement2DArrayAttribute::FParameters PassParameters;
PassParameters.InAttributeSlices = AttributeSlices;
PassParameters.InColorWeights = FMatrix44f(ColorWeights);
PassParameters.InGamma = InGamma;
PassParameters.InTexture = RHITexture ? RHITexture : GWhiteTexture->TextureRHI.GetReference();
PassParameters.InTextureSampler = RHISamplerState ? RHISamplerState : TStaticSamplerState<SF_Bilinear>::GetRHI();
SetShaderParameters(RHICmdList, PixelShader, PixelShader.GetPixelShader(), PassParameters);
}
//////////////////////////////////////////////////////////////////////////
class FNiagaraSimpleElementVolumeAttribute : public FGlobalShader
{
public:
DECLARE_SHADER_TYPE(FNiagaraSimpleElementVolumeAttribute, Global);
SHADER_USE_PARAMETER_STRUCT(FNiagaraSimpleElementVolumeAttribute, FGlobalShader);
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
{
return true;
}
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
OutEnvironment.SetDefine(TEXT("NIAGARA_VOLUME_ATTRIBUTE_PS"), 1);
}
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
SHADER_PARAMETER(int, InNumAttributes)
SHADER_PARAMETER_ARRAY(FVector4f, InAttributeUVAndChannel, [4])
SHADER_PARAMETER(FVector2f, InTileUV)
SHADER_PARAMETER(FMatrix44f, InColorWeights)
SHADER_PARAMETER(float, InGamma)
SHADER_PARAMETER_TEXTURE(Texture2D, InTexture)
SHADER_PARAMETER_SAMPLER(SamplerState, InTextureSampler)
END_SHADER_PARAMETER_STRUCT()
};
IMPLEMENT_GLOBAL_SHADER(FNiagaraSimpleElementVolumeAttribute, "/Plugin/FX/Niagara/Private/NiagaraBatchedElements.usf", "MainPS", SF_Pixel);
void FBatchedElementNiagaraVolumeAttribute::BindShaders(FRHICommandList& RHICmdList, FGraphicsPipelineStateInitializer& GraphicsPSOInit, ERHIFeatureLevel::Type InFeatureLevel, const FMatrix& InTransform, const float InGamma, const FMatrix& ColorWeights, const FTexture* Texture)
{
FRHITexture* RHITexture = nullptr;
FRHISamplerState* RHISamplerState = nullptr;
if (GetTextureAndSampler != nullptr)
{
GetTextureAndSampler(RHITexture, RHISamplerState);
}
else if (Texture != nullptr)
{
RHITexture = Texture->TextureRHI;
RHISamplerState = Texture->SamplerStateRHI;
}
TShaderMapRef<FSimpleElementVS> VertexShader(GetGlobalShaderMap(InFeatureLevel));
TShaderMapRef<FNiagaraSimpleElementVolumeAttribute> PixelShader(GetGlobalShaderMap(InFeatureLevel));
GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GSimpleElementVertexDeclaration.VertexDeclarationRHI;
GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader.GetVertexShader();
GraphicsPSOInit.BoundShaderState.PixelShaderRHI = PixelShader.GetPixelShader();
GraphicsPSOInit.PrimitiveType = PT_TriangleList;
GraphicsPSOInit.BlendState = TStaticBlendState<>::GetRHI();
RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit, 0);
SetShaderParametersLegacyVS(RHICmdList, VertexShader, InTransform);
FNiagaraSimpleElementVolumeAttribute::FParameters PassParameters;
PassParameters.InNumAttributes = AttributeUVs.Num();
for (int32 i=0; i < 4; ++i)
{
const FVector3f AttributeUV = AttributeUVs.IsValidIndex(i) ? AttributeUVs[i] : FVector3f::ZeroVector;
const int AttributeChannel = AttributeChannels.IsValidIndex(i) ? AttributeChannels[i] : 0;
PassParameters.InAttributeUVAndChannel[i].X = AttributeUV.X;
PassParameters.InAttributeUVAndChannel[i].Y = AttributeUV.Y;
PassParameters.InAttributeUVAndChannel[i].Z = AttributeUV.Z;
reinterpret_cast<int32&>(PassParameters.InAttributeUVAndChannel[i].W) = AttributeChannel;
}
PassParameters.InTileUV = TileUVs;
PassParameters.InColorWeights = FMatrix44f(ColorWeights);
PassParameters.InGamma = InGamma;
PassParameters.InTexture = RHITexture ? RHITexture : GWhiteTexture->TextureRHI.GetReference();
PassParameters.InTextureSampler = RHISamplerState ? RHISamplerState : TStaticSamplerState<SF_Bilinear>::GetRHI();
SetShaderParameters(RHICmdList, PixelShader, PixelShader.GetPixelShader(), PassParameters);
}
//////////////////////////////////////////////////////////////////////////
class FNiagaraSimpleElementPS : public FGlobalShader
{
DECLARE_GLOBAL_SHADER(FNiagaraSimpleElementPS);
SHADER_USE_PARAMETER_STRUCT(FNiagaraSimpleElementPS, FGlobalShader);
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
{
return true;
}
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
OutEnvironment.SetDefine(TEXT("NIAGARA_SIMPLE_PS"), 1);
}
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
SHADER_PARAMETER(FMatrix44f, InColorWeights)
SHADER_PARAMETER(float, InGamma)
SHADER_PARAMETER_TEXTURE(Texture2D, InTexture)
SHADER_PARAMETER_SAMPLER(SamplerState, InTextureSampler)
END_SHADER_PARAMETER_STRUCT()
};
IMPLEMENT_GLOBAL_SHADER(FNiagaraSimpleElementPS, "/Plugin/FX/Niagara/Private/NiagaraBatchedElements.usf", "MainPS", SF_Pixel);
void FBatchedElementNiagaraInvertColorChannel::BindShaders(FRHICommandList& RHICmdList, FGraphicsPipelineStateInitializer& GraphicsPSOInit, ERHIFeatureLevel::Type InFeatureLevel, const FMatrix& InTransform, const float InGamma, const FMatrix& ColorWeights, const FTexture* Texture)
{
TShaderMapRef<FSimpleElementVS> VertexShader(GetGlobalShaderMap(InFeatureLevel));
TShaderMapRef<FNiagaraSimpleElementPS> PixelShader(GetGlobalShaderMap(InFeatureLevel));
GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GSimpleElementVertexDeclaration.VertexDeclarationRHI;
GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader.GetVertexShader();
GraphicsPSOInit.BoundShaderState.PixelShaderRHI = PixelShader.GetPixelShader();
GraphicsPSOInit.PrimitiveType = PT_TriangleList;
GraphicsPSOInit.BlendState = TStaticBlendState<CW_ALPHA, BO_Subtract, BF_One, BF_DestColor, BO_Subtract, BF_One, BF_DestAlpha>::GetRHI();
RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit, 0);
SetShaderParametersLegacyVS(RHICmdList, VertexShader, InTransform);
FNiagaraSimpleElementPS::FParameters PassParameters;
PassParameters.InColorWeights = FMatrix44f::Identity;
PassParameters.InGamma = InGamma;
PassParameters.InTexture = GWhiteTexture->TextureRHI;
PassParameters.InTextureSampler = TStaticSamplerState<SF_Point>::GetRHI();
SetShaderParameters(RHICmdList, PixelShader, PixelShader.GetPixelShader(), PassParameters);
}
void FBatchedElementNiagaraSimple::BindShaders(FRHICommandList& RHICmdList, FGraphicsPipelineStateInitializer& GraphicsPSOInit, ERHIFeatureLevel::Type InFeatureLevel, const FMatrix& InTransform, const float InGamma, const FMatrix& ColorWeights, const FTexture* Texture)
{
TShaderMapRef<FSimpleElementVS> VertexShader(GetGlobalShaderMap(InFeatureLevel));
TShaderMapRef<FNiagaraSimpleElementPS> PixelShader(GetGlobalShaderMap(InFeatureLevel));
GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GSimpleElementVertexDeclaration.VertexDeclarationRHI;
GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader.GetVertexShader();
GraphicsPSOInit.BoundShaderState.PixelShaderRHI = PixelShader.GetPixelShader();
GraphicsPSOInit.PrimitiveType = PT_TriangleList;
GraphicsPSOInit.BlendState = bAlphaBlend ? TStaticBlendState<CW_RGBA, BO_Add, BF_One, BF_InverseSourceAlpha, BO_Add, BF_One, BF_InverseSourceAlpha>::GetRHI() : TStaticBlendState<>::GetRHI();
RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit, 0);
SetShaderParametersLegacyVS(RHICmdList, VertexShader, InTransform);
FNiagaraSimpleElementPS::FParameters PassParameters;
PassParameters.InColorWeights = FMatrix44f(ColorTransform);
PassParameters.InGamma = InGamma;
PassParameters.InTexture = Texture ? Texture->TextureRHI : GWhiteTexture->TextureRHI;
PassParameters.InTextureSampler = TStaticSamplerState<SF_Bilinear>::GetRHI();
SetShaderParameters(RHICmdList, PixelShader, PixelShader.GetPixelShader(), PassParameters);
}