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

86 lines
2.2 KiB
HLSL

#include "shared/hash-functions.hlsl"
#include "shared/point.hlsl"
#include "shared/quat-functions.hlsl"
#include "shared/bias-functions.hlsl"
cbuffer Params : register(b0)
{
float3 RandomizePosition;
float Amount;
float3 RandomizeRotation;
float RandomizeW;
float UseLocalSpace;
float Seed;
float Bias;
float Offset;
float UseWAsSelection;
}
StructuredBuffer<LegacyPoint> SourcePoints : t0;
RWStructuredBuffer<LegacyPoint> ResultPoints : u0;
[numthreads(64,1,1)]
void main(uint3 i : SV_DispatchThreadID)
{
uint pointCount, stride;
SourcePoints.GetDimensions(pointCount, stride);
// if(i.x >= pointCount) {
// ResultPoints[i.x].w = 0 ;
// return;
// }
LegacyPoint p = SourcePoints[i.x];
int pointId = i.x;
float f = pointId / (float)pointCount;
float phase = Seed + 133.1123 * f + 999;
int phaseId = (int)phase ;
float4 normalizedScatter = lerp(hash41u(pointId * 12341 + phaseId),
hash41u(pointId * 12341 + phaseId + 1),
smoothstep(0, 1,
phase - phaseId));
float4 hashRot = lerp(hash41u(pointId * 2723 + phaseId),
hash41u(pointId * 2723 + phaseId + 1),
smoothstep(0, 1,
phase - phaseId)) * 2 - 1;
float4 hash4 = GetSchlickBias(normalizedScatter, Bias) * 2 -1;
float4 rot = p.Rotation;
float amount = Amount * (UseWAsSelection > 0.5 ? p.W : 1);
float3 offset = hash4.xyz * RandomizePosition * amount;
if(UseLocalSpace < 0.5)
{
offset = qRotateVec3(offset, rot);
}
p.Position += offset;
float3 randomRotate = (hashRot.xyz - 0.5) * (RandomizeRotation / 180 * PI) * amount * hash4.xyz;
rot = normalize(qMul(rot, qFromAngleAxis(randomRotate.x * Offset, float3(1,0,0))));
rot = normalize(qMul(rot, qFromAngleAxis(randomRotate.y * Offset, float3(0,1,0))));
rot = normalize(qMul(rot, qFromAngleAxis(randomRotate.z * Offset, float3(0,0,1))));
p.Rotation = rot;
p.W += hash4.w *RandomizeW * amount;
ResultPoints[i.x] = p;
}