A game about forced loneliness, made by TACStudios
at master 45 lines 2.0 kB view raw
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}