forked from Unity-Technologies/Graphics
-
Notifications
You must be signed in to change notification settings - Fork 0
/
VFXUpdate.template
134 lines (116 loc) · 3.41 KB
/
VFXUpdate.template
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#pragma kernel CSMain
${VFXGlobalInclude}
${VFXGlobalDeclaration}
${VFXInclude("Shaders/VFXParticleCommon.template")}
#define USE_DEAD_LIST (VFX_USE_ALIVE_CURRENT && !HAS_STRIPS)
RWByteAddressBuffer attributeBuffer;
#if USE_DEAD_LIST
RWStructuredBuffer<uint> deadListOut;
#endif
#if VFX_HAS_INDIRECT_DRAW
RWStructuredBuffer<uint> indirectBuffer;
#endif
#if HAS_STRIPS
RWStructuredBuffer<uint> stripDataBuffer;
#endif
#if VFX_USE_STRIPALIVE_CURRENT
StructuredBuffer<uint> attachedStripDataBuffer;
#endif
CBUFFER_START(updateParams)
uint nbMax;
uint dispatchWidth;
uint systemSeed;
CBUFFER_END
${VFXPerPassInclude}
${VFXGeneratedBlockFunction}
[numthreads(NB_THREADS_PER_GROUP,1,1)]
void CSMain(uint3 groupId : SV_GroupID,
uint3 groupThreadId : SV_GroupThreadID)
{
uint id = groupThreadId.x + groupId.x * NB_THREADS_PER_GROUP + groupId.y * dispatchWidth * NB_THREADS_PER_GROUP;
uint index = id;
#if VFX_COMPUTE_BOUNDS
uint tid = groupThreadId.x;
#endif
if (id < nbMax)
{
Attributes attributes = (Attributes)0;
SourceAttributes sourceAttributes = (SourceAttributes)0;
#if VFX_USE_ALIVE_CURRENT
${VFXLoadAttributes:{alive|stripAlive}}
if (attributes.alive)
{
${VFXLoadAttributes:{(?!(alive|stripAlive))(\b\w)}}
#if HAS_STRIPS
const StripData stripData = GetStripDataFromParticleIndex(index, PARTICLE_PER_STRIP_COUNT);
InitStripAttributes(index, attributes, stripData);
#endif
#if VFX_UPDATE_SKIP_ZERO_DELTA_TIME
${VFXLoadParameter:{deltaTime}}
if (deltaTime != 0.0f)
#endif
{
${VFXProcessBlocks}
}
if (attributes.alive)
{
${VFXStoreAttributes:{(?!(alive))(\b\w)}}
#if VFX_HAS_INDIRECT_DRAW
uint indirectIndex = indirectBuffer.IncrementCounter();
indirectBuffer[indirectIndex] = index;
#endif
#if HAS_STRIPS
uint relativeIndexInStrip = GetRelativeIndex(index, stripData);
InterlockedMin(STRIP_DATA(STRIP_MIN_ALIVE, stripData.stripIndex), relativeIndexInStrip);
InterlockedMax(STRIP_DATA(STRIP_MAX_ALIVE, stripData.stripIndex), relativeIndexInStrip);
#endif
}
else
{
${VFXStoreAttributes:{alive|eventCount}}
#if USE_DEAD_LIST && !VFX_USE_STRIPALIVE_CURRENT
uint deadIndex = deadListOut.IncrementCounter();
deadListOut[deadIndex] = index;
#endif
}
}
#if USE_DEAD_LIST && VFX_USE_STRIPALIVE_CURRENT
else if (attributes.stripAlive)
{
if (STRIP_DATA_X(attachedStripDataBuffer, STRIP_MIN_ALIVE, index) == ~1) // Attached strip is no longer alive, recycle the particle
{
uint deadIndex = deadListOut.IncrementCounter();
deadListOut[deadIndex] = index;
attributes.stripAlive = false;
${VFXStoreAttributes:{stripAlive}}
}
}
#endif
#else
${VFXLoadAttributes}
#if HAS_STRIPS
const StripData stripData = GetStripDataFromParticleIndex(index, PARTICLE_PER_STRIP_COUNT);
InitStripAttributes(index, attributes, stripData);
#endif
#if VFX_UPDATE_SKIP_ZERO_DELTA_TIME
${VFXLoadParameter:{deltaTime}}
if (deltaTime != 0.0f)
#endif
{
${VFXProcessBlocks}
}
${VFXStoreAttributes}
#if VFX_HAS_INDIRECT_DRAW
uint indirectIndex = indirectBuffer.IncrementCounter();
indirectBuffer[indirectIndex] = index;
#endif
#endif
#if VFX_COMPUTE_BOUNDS
${VFXLoadSize}
InitReduction(attributes, size3, tid);
#endif
}
#if VFX_COMPUTE_BOUNDS
PerformBoundsReduction(id, tid);
#endif
}