2021-09-09 20:42:29 -04:00

33 lines
1.4 KiB
Plaintext

#pragma kernel UpdateParticleStrip
#include "HLSLSupport.cginc"
#define NB_THREADS_PER_GROUP 64
CBUFFER_START(params)
uint dispatchWidth;
uint stripCount;
uint particlePerStripCount;
CBUFFER_END
RWStructuredBuffer<uint> stripDataBuffer;
#include "Packages/com.unity.visualeffectgraph/Shaders/VFXParticleStripCommon.hlsl"
[numthreads(NB_THREADS_PER_GROUP,1,1)]
void UpdateParticleStrip(uint3 groupId : SV_GroupID,
uint3 groupThreadId : SV_GroupThreadID)
{
uint stripIndex = groupThreadId.x + groupId.x * NB_THREADS_PER_GROUP + groupId.y * dispatchWidth * NB_THREADS_PER_GROUP;
if (stripIndex < stripCount)
{
bool isEmpty = (STRIP_DATA(STRIP_MIN_ALIVE, stripIndex) & ~1) == ~1;
STRIP_DATA(STRIP_FIRST_INDEX, stripIndex) = isEmpty ? 0 : (STRIP_DATA(STRIP_FIRST_INDEX, stripIndex) + STRIP_DATA(STRIP_MIN_ALIVE, stripIndex)) % particlePerStripCount;
STRIP_DATA(STRIP_NEXT_INDEX, stripIndex) = isEmpty ? 0 : STRIP_DATA(STRIP_MAX_ALIVE, stripIndex) - STRIP_DATA(STRIP_MIN_ALIVE, stripIndex) + 1;
STRIP_DATA(STRIP_PREV_NEXT_INDEX, stripIndex) = STRIP_DATA(STRIP_NEXT_INDEX, stripIndex); // Store particle count twice so that it can be read consistenly in next Init (as next index will be atomically incremented in init)
STRIP_DATA(STRIP_MIN_ALIVE, stripIndex) = isEmpty ? ~1 : ~0;
STRIP_DATA(STRIP_MAX_ALIVE, stripIndex) = 0;
}
}