Files
2026-07-13 13:13:17 +08:00

122 lines
3.5 KiB
HLSL

#include "shared/point.hlsl"
#include "shared/quat-functions.hlsl"
// #include "shared/hash-functions.hlsl"
// #include "points/spatial-hash-map/hash-map-settings.hlsl"
cbuffer Params : register(b0)
{
float CurrentStep_; // 0
float StepCount; // 1
float LinesPerSteps; // 2
float CellSize; // 3
float Time; // 4
float ScatterLookUp; // 5
float TestIndex; // 6
}
cbuffer Params : register(b1)
{
int CurrentStep; // 0
}
#include "points/spatial-hash-map/spatial-hash-map-lookup.hlsl"
StructuredBuffer<Point> points :register(t5);
RWStructuredBuffer<uint2> pointIndexPairs :register(u0);
#define THREADS_PER_GROUP 512
[numthreads( THREADS_PER_GROUP, 1, 1 )]
void ClearPoints(uint3 DTid : SV_DispatchThreadID, uint GI: SV_GroupIndex)
{
pointIndexPairs[DTid.x] = int2( 0, 0);
}
[numthreads( THREADS_PER_GROUP, 1, 1 )]
void ConnectPoints(uint3 DTid : SV_DispatchThreadID, uint GI: SV_GroupIndex)
{
uint pointCount, __;
points.GetDimensions(pointCount, __);
uint pairCount;
pointIndexPairs.GetDimensions(pairCount, __);
// if(TestIndex >= 0)
// {
// int testPointIndex = (int)TestIndex;
// float3 position = points[testPointIndex].position;
// uint rangeStartIndex, rangeEndIndex;
// if(GridFind(position, rangeStartIndex, rangeEndIndex))
// {
// int x2=0;
// for(uint i=rangeStartIndex; i < rangeEndIndex; ++i)
// {
// uint otherIndex = CellPointIndices[i];
// pointIndexPairs[DTid.x + x2] = uint2( testPointIndex, otherIndex);
// x2++;
// }
// }
// return;
// }
uint indexWithingStep = DTid.x;
if(indexWithingStep >= LinesPerSteps)
return;
uint stepIndex = CurrentStep % StepCount;
uint pairIndex = stepIndex * (int)(LinesPerSteps + 0.5) + indexWithingStep;
uint shuffle = hash11(CurrentStep * 0.123 + indexWithingStep * 0.121 ) * ScatterLookUp * pointCount;
uint pointIndex = (CurrentStep + (int)(shuffle + indexWithingStep) ) % pointCount;
if(pairIndex >= pairCount)
return;
float3 position = points[pointIndex].Position;
float3 jitter = (hash33u( uint3(DTid.x, DTid.x + 134775813U, DTid.x + 1664525U) + position * 100 + Time % 123.1 ) -0.5f) * CellSize ;
position+= jitter;
uint rangeStartIndex, rangeEndIndex;
if(GridFind(position, rangeStartIndex, rangeEndIndex))
{
const uint particleCount = rangeEndIndex - rangeStartIndex;
rangeEndIndex = min(rangeStartIndex + 64 , rangeEndIndex);
float minDistance = 100000;
uint closestIndex = -1;
for(uint i=rangeStartIndex ; i < rangeEndIndex; ++i)
{
uint otherIndex = CellPointIndices[i];
if( otherIndex <= DTid.x)
continue;
float3 otherPos = points[otherIndex].Position;
float3 direction = position - otherPos;
float distance = length(position - otherPos);
if(distance < minDistance)
{
minDistance = distance;
closestIndex = otherIndex;
//break;
}
}
if(closestIndex != -1 && minDistance < CellSize)
{
pointIndexPairs[pairIndex] = int2( closestIndex, pointIndex);
}
else {
pointIndexPairs[pairIndex] = int2( 10,0);
}
}
}