51 lines
1.9 KiB
HLSL
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
|