126 lines
6.1 KiB
HLSL
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);
|
|
}
|