A game about forced loneliness, made by TACStudios
1#pragma exclude_renderers gles
2
3#pragma kernel MainCopyInstances
4
5//#pragma enable_d3d11_debug_symbols
6
7int _InputValidComponentCounts;
8int _InstanceOffset;
9int _InstanceCounts;
10int _OutputInstanceOffset;
11ByteAddressBuffer _ValidComponentIndices;
12ByteAddressBuffer _ComponentByteCounts;
13ByteAddressBuffer _InputComponentAddresses;
14ByteAddressBuffer _InputComponentInstanceIndexRanges;
15ByteAddressBuffer _OutputComponentAddresses;
16ByteAddressBuffer _OutputComponentInstanceIndexRanges;
17ByteAddressBuffer _InputBuffer;
18RWByteAddressBuffer _OutputBuffer;
19
20[numthreads(64,1,1)]
21void MainCopyInstances(uint3 dispatchThreadID : SV_DispatchThreadID)
22{
23 if (dispatchThreadID.x >= (uint) _InstanceCounts)
24 return;
25
26 uint instanceIndex = _InstanceOffset + dispatchThreadID.x;
27 uint instanceOutputIndex = _OutputInstanceOffset + dispatchThreadID.x;
28
29 [loop]
30 for (int validComponentIndex = 0; validComponentIndex < _InputValidComponentCounts; ++validComponentIndex)
31 {
32 uint componentIndex = _ValidComponentIndices.Load(validComponentIndex << 2);
33 uint instanceInputIndexBegin = _InputComponentInstanceIndexRanges.Load(componentIndex * 8);
34 uint instanceInputIndexEnd = _InputComponentInstanceIndexRanges.Load(componentIndex * 8 + 4);
35 if (instanceIndex < instanceInputIndexBegin || instanceIndex >= instanceInputIndexEnd)
36 continue;
37 uint inputComponentAddress = _InputComponentAddresses.Load(componentIndex << 2);
38 uint outputComponentAddress = _OutputComponentAddresses.Load(componentIndex << 2);
39 uint componentByteSize = _ComponentByteCounts.Load(componentIndex << 2);
40 for (uint uintIndex = 0; uintIndex < componentByteSize / 4u; ++uintIndex)
41 {
42 uint byteOffsetInput = instanceIndex * componentByteSize + uintIndex * 4;
43 uint byteOffsetOutput = instanceOutputIndex * componentByteSize + uintIndex * 4;
44 uint inputAddress = inputComponentAddress + byteOffsetInput;
45 uint outputAddress = outputComponentAddress + byteOffsetOutput;
46 _OutputBuffer.Store(outputAddress, _InputBuffer.Load(inputAddress));
47 }
48 }
49}