Files
UnrealEngine/Engine/Plugins/FX/Niagara/Shaders/Private/NiagaraDataInterfaceSocketReaderTemplate.ush
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

126 lines
6.1 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#include "/Plugin/FX/Niagara/Private/NiagaraTransformUtils.ush"
uint {ParameterName}_IsDataValid;
float {ParameterName}_InvDeltaSeconds;
int {ParameterName}_NumSockets;
int {ParameterName}_NumFilteredSockets;
int {ParameterName}_NumUnfilteredSockets;
float3 {ParameterName}_ComponentToTranslatedWorld_Translation;
float4 {ParameterName}_ComponentToTranslatedWorld_Rotation;
float3 {ParameterName}_ComponentToTranslatedWorld_Scale;
float3 {ParameterName}_PreviousComponentToTranslatedWorld_Translation;
float4 {ParameterName}_PreviousComponentToTranslatedWorld_Rotation;
float3 {ParameterName}_PreviousComponentToTranslatedWorld_Scale;
uint {ParameterName}_SocketTransformOffset;
uint {ParameterName}_PreviousSocketTransformOffset;
ByteAddressBuffer {ParameterName}_SocketData;
////////////////////////////////////////////////////
// Note that when reading socket / socket index indirection we allocate +1 entries, this is to avoid branching when OOB
int SanitizeSocketIndex_{ParameterName}(int SocketIndex)
{
return SocketIndex >= 0 && SocketIndex < {ParameterName}_NumSockets ? SocketIndex : {ParameterName}_NumSockets;
}
int SanitizeFilteredSocketIndex_{ParameterName}(int SocketIndex)
{
const int FilteredSocketIndex = SocketIndex >= 0 && SocketIndex < {ParameterName}_NumFilteredSockets ? (SocketIndex + 1) : 0;
return {ParameterName}_SocketData.Load(FilteredSocketIndex * 4);
}
int SanitizeUnfilteredSocketIndex_{ParameterName}(int SocketIndex)
{
const int UnfilteredSocketIndex = SocketIndex >= 0 && SocketIndex < {ParameterName}_NumUnfilteredSockets ? (SocketIndex + 1 + {ParameterName}_NumFilteredSockets) : 0;
return {ParameterName}_SocketData.Load(UnfilteredSocketIndex * 4);
}
void GetSocketData_{ParameterName}(int SocketIndex, float Interp, out float3 OutPosition, out float4 OutRotation, out float3 OutScale, out float3 OutVelocity)
{
uint CurrTransformOffset = {ParameterName}_SocketTransformOffset;
uint PrevTransformOffset = {ParameterName}_PreviousSocketTransformOffset;
CurrTransformOffset += SocketIndex * 10 * 4;
PrevTransformOffset += SocketIndex * 10 * 4;
FNiagaraTransform ComponentToTranslatedWorld = MakeTransform({ParameterName}_ComponentToTranslatedWorld_Translation, {ParameterName}_ComponentToTranslatedWorld_Rotation, {ParameterName}_ComponentToTranslatedWorld_Scale);
FNiagaraTransform PreviousComponentToTranslatedWorld = MakeTransform({ParameterName}_PreviousComponentToTranslatedWorld_Translation, {ParameterName}_PreviousComponentToTranslatedWorld_Rotation, {ParameterName}_PreviousComponentToTranslatedWorld_Scale);
FNiagaraTransform CurrTransform = LoadTransform({ParameterName}_SocketData, CurrTransformOffset);
FNiagaraTransform PrevTransform = LoadTransform({ParameterName}_SocketData, PrevTransformOffset);
CurrTransform = MultiplyTransform(CurrTransform, ComponentToTranslatedWorld);
PrevTransform = MultiplyTransform(PrevTransform, PreviousComponentToTranslatedWorld);
OutPosition = lerp(PrevTransform.Translation, CurrTransform.Translation, Interp);
OutRotation = SlerpQuat(PrevTransform.Rotation, CurrTransform.Rotation, Interp);
OutScale = lerp(PrevTransform.Scale, CurrTransform.Scale, Interp);
OutVelocity = (CurrTransform.Translation - PrevTransform.Translation) * {ParameterName}_InvDeltaSeconds;
}
////////////////////////////////////////////////////
void GetComponentToWorld_{ParameterName}(out float3 Translation, out float4 Rotation, out float3 Scale)
{
Translation = {ParameterName}_ComponentToTranslatedWorld_Translation;
Rotation = {ParameterName}_ComponentToTranslatedWorld_Rotation;
Scale = {ParameterName}_ComponentToTranslatedWorld_Scale;
}
void IsValid_{ParameterName}(out bool bValid)
{
bValid = {ParameterName}_IsDataValid != 0;
}
void GetSocketCount_{ParameterName}(out int Count)
{
Count = {ParameterName}_NumSockets;
}
void GetFilteredSocketCount_{ParameterName}(out int Count)
{
Count = {ParameterName}_NumFilteredSockets;
}
void GetUnfilteredSocketCount_{ParameterName}(out int Count)
{
Count = {ParameterName}_NumUnfilteredSockets;
}
void GetSocketTransform_{ParameterName}(int SocketIndex, out float3 OutPosition, out float4 OutRotation, out float3 OutScale, out float3 OutVelocity)
{
SocketIndex = SanitizeSocketIndex_{ParameterName}(SocketIndex);
GetSocketData_{ParameterName}(SocketIndex, 1.0f, OutPosition, OutRotation, OutScale, OutVelocity);
}
void GetFilteredSocketTransform_{ParameterName}(int SocketIndex, out float3 OutPosition, out float4 OutRotation, out float3 OutScale, out float3 OutVelocity)
{
SocketIndex = SanitizeFilteredSocketIndex_{ParameterName}(SocketIndex);
GetSocketData_{ParameterName}(SocketIndex, 1.0f, OutPosition, OutRotation, OutScale, OutVelocity);
}
void GetUnfilteredSocketTransform_{ParameterName}(int SocketIndex, out float3 OutPosition, out float4 OutRotation, out float3 OutScale, out float3 OutVelocity)
{
SocketIndex = SanitizeUnfilteredSocketIndex_{ParameterName}(SocketIndex);
GetSocketData_{ParameterName}(SocketIndex, 1.0f, OutPosition, OutRotation, OutScale, OutVelocity);
}
void GetSocketTransformInterpolated_{ParameterName}(int SocketIndex, float Interpolation, out float3 OutPosition, out float4 OutRotation, out float3 OutScale, out float3 OutVelocity)
{
SocketIndex = SanitizeSocketIndex_{ParameterName}(SocketIndex);
GetSocketData_{ParameterName}(SocketIndex, Interpolation, OutPosition, OutRotation, OutScale, OutVelocity);
}
void GetFilteredSocketTransformInterpolated_{ParameterName}(int SocketIndex, float Interpolation, out float3 OutPosition, out float4 OutRotation, out float3 OutScale, out float3 OutVelocity)
{
SocketIndex = SanitizeFilteredSocketIndex_{ParameterName}(SocketIndex);
GetSocketData_{ParameterName}(SocketIndex, Interpolation, OutPosition, OutRotation, OutScale, OutVelocity);
}
void GetUnfilteredSocketTransformInterpolated_{ParameterName}(int SocketIndex, float Interpolation, out float3 OutPosition, out float4 OutRotation, out float3 OutScale, out float3 OutVelocity)
{
SocketIndex = SanitizeUnfilteredSocketIndex_{ParameterName}(SocketIndex);
GetSocketData_{ParameterName}(SocketIndex, Interpolation, OutPosition, OutRotation, OutScale, OutVelocity);
}