84 lines
3.6 KiB
HLSL
84 lines
3.6 KiB
HLSL
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
#pragma once
|
|
|
|
#define SAMPLEFUNC(HLSLTYPE, HLSLPAIRTYPE, NAMETYPE) \
|
|
HLSLPAIRTYPE Private_GetDistributionTableValues##NAMETYPE##(FNiagaraStatelessBuiltDistributionType BuiltData, uint IndexA, uint IndexB) \
|
|
{ \
|
|
const uint BaseOffset = FNiagaraStatelessBuiltDistribution::GetBufferOffset(BuiltData); \
|
|
if (FNiagaraStatelessBuiltDistribution::IsBufferReadModeStatic(BuiltData)) \
|
|
{ \
|
|
return HLSLPAIRTYPE(GetStatic##NAMETYPE##(BaseOffset, IndexA), GetStatic##NAMETYPE##(BaseOffset, IndexB)); \
|
|
} \
|
|
else \
|
|
{ \
|
|
return HLSLPAIRTYPE(GetParameterBuffer##NAMETYPE##(BaseOffset, IndexA), GetParameterBuffer##NAMETYPE##(BaseOffset, IndexB)); \
|
|
} \
|
|
} \
|
|
\
|
|
HLSLTYPE Private_GetDistributionRandomValue##NAMETYPE##(FNiagaraStatelessBuiltDistributionType BuiltData, uint RandomSeedOffset) \
|
|
{ \
|
|
const float Random = RandomFloat(RandomSeedOffset); \
|
|
uint Indicies[2]; \
|
|
float Interp; \
|
|
FNiagaraStatelessBuiltDistribution::ConvertRandomToLookup(BuiltData, Random, Indicies[0], Indicies[1], Interp); \
|
|
HLSLPAIRTYPE Values = Private_GetDistributionTableValues##NAMETYPE##(BuiltData, Indicies[0], Indicies[1]); \
|
|
if (FNiagaraStatelessBuiltDistribution::IsInterpolationModeLinear(BuiltData)) \
|
|
{ \
|
|
const bool bUniformRandom = FNiagaraStatelessBuiltDistribution::IsUniformRandomEnabled(BuiltData); \
|
|
return StatelessLerp(Values[0], Values[1], Random##NAMETYPE##(RandomSeedOffset), bUniformRandom); \
|
|
} \
|
|
else \
|
|
{ \
|
|
return Values[0]; \
|
|
} \
|
|
} \
|
|
HLSLTYPE Private_GetDistributionTimeValue##NAMETYPE##(FNiagaraStatelessBuiltDistributionType BuiltData, float Time) \
|
|
{ \
|
|
uint Indicies[2]; \
|
|
float Interp; \
|
|
FNiagaraStatelessBuiltDistribution::ConvertTimeToLookup(BuiltData, Time, Indicies[0], Indicies[1], Interp); \
|
|
HLSLPAIRTYPE Values = Private_GetDistributionTableValues##NAMETYPE##(BuiltData, Indicies[0], Indicies[1]); \
|
|
return lerp(Values[0], Values[1], Interp); \
|
|
} \
|
|
\
|
|
HLSLTYPE SampleDistributionValue##NAMETYPE##(FNiagaraStatelessBuiltDistributionType BuiltData, uint RandomSeedOffset, float Time) \
|
|
{ \
|
|
if (FNiagaraStatelessBuiltDistribution::IsLookupValueModeRandom(BuiltData)) \
|
|
{ \
|
|
return Private_GetDistributionRandomValue##NAMETYPE##(BuiltData, RandomSeedOffset); \
|
|
} \
|
|
else \
|
|
{ \
|
|
return Private_GetDistributionTimeValue##NAMETYPE##(BuiltData, Time); \
|
|
} \
|
|
} \
|
|
HLSLPAIRTYPE SampleDistributionValues##NAMETYPE##(FNiagaraStatelessBuiltDistributionType BuiltData, uint RandomSeedOffset, float TimeA, float TimeB) \
|
|
{ \
|
|
if (FNiagaraStatelessBuiltDistribution::IsLookupValueModeRandom(BuiltData)) \
|
|
{ \
|
|
HLSLTYPE Value = Private_GetDistributionRandomValue##NAMETYPE##(BuiltData, RandomSeedOffset); \
|
|
return HLSLPAIRTYPE(Value, Value); \
|
|
} \
|
|
else \
|
|
{ \
|
|
return HLSLPAIRTYPE(Private_GetDistributionTimeValue##NAMETYPE##(BuiltData, TimeA), Private_GetDistributionTimeValue##NAMETYPE##(BuiltData, TimeB)); \
|
|
} \
|
|
}\
|
|
HLSLTYPE SampleCurve##NAMETYPE##(FNiagaraStatelessBuiltDistributionType Distribution, float Time) \
|
|
{ \
|
|
uint Indicies[2]; \
|
|
float Interp; \
|
|
FNiagaraStatelessBuiltDistribution::ConvertTimeToLookup(Distribution, Time, Indicies[0], Indicies[1], Interp); \
|
|
const uint DataOffset = FNiagaraStatelessBuiltDistribution::GetBufferOffset(Distribution); \
|
|
const HLSLTYPE Value0 = GetStatic##NAMETYPE##(DataOffset, Indicies[0]); \
|
|
const HLSLTYPE Value1 = GetStatic##NAMETYPE##(DataOffset, Indicies[1]); \
|
|
return lerp(Value0, Value1, Interp); \
|
|
}
|
|
|
|
SAMPLEFUNC(float, float2, Float)
|
|
SAMPLEFUNC(float2, float2x2, Float2)
|
|
SAMPLEFUNC(float3, float2x3, Float3)
|
|
SAMPLEFUNC(float4, float2x4, Float4)
|
|
|
|
#undef READFUNCS
|