Files
UnrealEngine/Engine/Plugins/FX/Niagara/Shaders/Private/Stateless/NiagaraStatelessDistribution.ush
2025-05-18 13:04:45 +08:00

51 lines
1.9 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#define DefineStatelessDistributionSampler(HLSLTYPE, NAMETYPE) \
struct FStatelessDistributionSampler##NAMETYPE \
{ \
void Init(uint RandomSeedOffset, FNiagaraStatelessBuiltDistributionType InBuildDistribution) \
{ \
BuildDistribution = InBuildDistribution; \
RandomOffset = 0.0f; \
if ( FNiagaraStatelessBuiltDistribution::IsRandom(BuildDistribution) != 0) \
{ \
RandomOffset = Random##NAMETYPE##(RandomSeedOffset); \
} \
} \
\
bool IsValid() { return FNiagaraStatelessBuiltDistribution::IsValid(BuildDistribution); } \
\
HLSLTYPE GetValue(float Time) \
{ \
const uint DataOffset = FNiagaraStatelessBuiltDistribution::GetDataOffset(BuildDistribution); \
if (FNiagaraStatelessBuiltDistribution::IsBinding(BuildDistribution)) \
{ \
return GetParameterBuffer##NAMETYPE##(DataOffset, 0); \
} \
else if (FNiagaraStatelessBuiltDistribution::IsRandom(BuildDistribution)) \
{ \
const HLSLTYPE Value0 = GetStatic##NAMETYPE##(DataOffset, 0); \
const HLSLTYPE Value1 = GetStatic##NAMETYPE##(DataOffset, 1); \
return StatelessLerp(Value0, Value1, RandomOffset, FNiagaraStatelessBuiltDistribution::IsUniform(BuildDistribution)); \
} \
else \
{ \
const float Offset = FNiagaraStatelessBuiltDistribution::ConvertTimeToLookup(BuildDistribution, Time); \
const HLSLTYPE Value0 = GetStatic##NAMETYPE##(DataOffset, floor(Offset)); \
const HLSLTYPE Value1 = GetStatic##NAMETYPE##(DataOffset, ceil(Offset)); \
return lerp(Value0, Value1, frac(Offset)); \
} \
} \
\
FNiagaraStatelessBuiltDistributionType BuildDistribution; \
HLSLTYPE RandomOffset; \
}
DefineStatelessDistributionSampler(float, Float);
DefineStatelessDistributionSampler(float2, Float2);
DefineStatelessDistributionSampler(float3, Float3);
DefineStatelessDistributionSampler(float4, Float4);
#undef DefineStatelessDistributionSampler