A game about forced loneliness, made by TACStudios
1#pragma exclude_renderers gles
2
3#pragma kernel MainUploadScatterInstances
4
5//#pragma enable_d3d11_debug_symbols
6
7int _InputValidComponentCounts;
8int _InputInstanceCounts;
9int _InputInstanceByteSize;
10ByteAddressBuffer _InputInstanceData;
11ByteAddressBuffer _InputInstanceIndices;
12ByteAddressBuffer _InputComponentOffsets;
13ByteAddressBuffer _InputValidComponentIndices;
14ByteAddressBuffer _InputComponentAddresses;
15ByteAddressBuffer _InputComponentByteCounts;
16ByteAddressBuffer _InputComponentInstanceIndexRanges;
17RWByteAddressBuffer _OutputBuffer;
18
19[numthreads(64,1,1)]
20void MainUploadScatterInstances(uint3 dispatchThreadID : SV_DispatchThreadID)
21{
22 uint instanceOffset = dispatchThreadID.x;
23 if (instanceOffset >= (uint)_InputInstanceCounts)
24 return;
25
26 uint instanceIndex = _InputInstanceIndices.Load(instanceOffset << 2);
27
28 [loop]
29 for (int validComponentIndex = 0; validComponentIndex < _InputValidComponentCounts; ++validComponentIndex)
30 {
31 uint componentIndex = _InputValidComponentIndices.Load(validComponentIndex << 2);
32 uint instanceIndexBegin = _InputComponentInstanceIndexRanges.Load(componentIndex * 8);
33 uint instanceIndexEnd = _InputComponentInstanceIndexRanges.Load(componentIndex * 8 + 4);
34 if (instanceIndex < instanceIndexBegin || instanceIndex >= instanceIndexEnd)
35 continue;
36 uint inputComponentOffset = _InputComponentOffsets.Load(componentIndex << 2);
37 uint componentAddress = _InputComponentAddresses.Load(componentIndex << 2);
38 uint componentByteSize = _InputComponentByteCounts.Load(componentIndex << 2);
39 for (uint uintIndex = 0; uintIndex < componentByteSize / 4u; ++uintIndex)
40 {
41 uint outputAddress = componentAddress + instanceIndex * componentByteSize + uintIndex * 4;
42 _OutputBuffer.Store(outputAddress, _InputInstanceData.Load(instanceOffset * _InputInstanceByteSize + (inputComponentOffset + uintIndex) * 4));
43 }
44 }
45}