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

111 lines
2.5 KiB
HLSL

#include "shared/point.hlsl"
#include "shared/quat-functions.hlsl"
cbuffer Params : register(b0)
{
float AddNewPoints;
float UseAging;
float AgingRate;
float MaxAge;
float ClampAtMaxAge;
float Reset;
float DeltaTime;
float ApplyMovement;
float Speed;
float Drag;
float SetInitialVelocity;
float InitialVelocity;
}
cbuffer IntParams : register(b1)
{
int CollectCycleIndex;
}
StructuredBuffer<LegacyPoint> NewPoints : t0;
RWStructuredBuffer<LegacyPoint> CollectedPoints : u0;
[numthreads(64,1,1)]
void main(uint3 i : SV_DispatchThreadID)
{
uint newPointCount, pointStride;
NewPoints.GetDimensions(newPointCount, pointStride);
uint collectedPointCount, pointStride2;
CollectedPoints.GetDimensions(collectedPointCount, pointStride2);
uint gi = i.x;
if(i.x >= collectedPointCount)
return;
if(Reset > 0.5)
{
CollectedPoints[gi].W = sqrt(-1);
return;
}
int addIndex = (gi - CollectCycleIndex) % collectedPointCount;
// Insert emit points
if( AddNewPoints > 0.5 && addIndex >= 0 && addIndex < (int)newPointCount )
{
CollectedPoints[gi] = NewPoints[addIndex];
if(UseAging > 0.5)
{
CollectedPoints[gi].W = 0.0001;
}
if(SetInitialVelocity > 0.5)
{
CollectedPoints[gi].Rotation = q_encode_v(CollectedPoints[gi].Rotation, InitialVelocity);
}
}
// Update other points
else if(UseAging > 0.5 || ApplyMovement > 0.5)
{
if(UseAging > 0.5 )
{
float age = CollectedPoints[gi].W;
if(!isnan(age))
{
if(age <= 0)
{
CollectedPoints[gi].W = sqrt(-1); // Flag non-initialized points
}
else if(age < MaxAge)
{
CollectedPoints[gi].W = age+ DeltaTime * AgingRate;
}
else if(ClampAtMaxAge) {
CollectedPoints[gi].W = MaxAge;
}
}
}
if(ApplyMovement > 0.5)
{
LegacyPoint p = CollectedPoints[gi];
float4 rot;
float v = q_separate_v(p.Rotation, rot);
float3 forward = normalize(qRotateVec3(float3(0, 0, 1), rot));
forward *= v * 0.01 * Speed;
p.Position += forward;
v *= (1-Drag);
p.Rotation = q_encode_v(rot, v);
CollectedPoints[gi] = p;
}
}
}