HairGridAccumulate.hlsl 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2026 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include "HairGridAccumulateBindings.h"
  5. #include "HairCommon.h"
  6. void AtomicAddVelocityAndDensity(uint inIndex, int4 inValue)
  7. {
  8. JPH_AtomicAdd(gVelocityAndDensity[inIndex].x, inValue.x);
  9. JPH_AtomicAdd(gVelocityAndDensity[inIndex].y, inValue.y);
  10. JPH_AtomicAdd(gVelocityAndDensity[inIndex].z, inValue.z);
  11. JPH_AtomicAdd(gVelocityAndDensity[inIndex].w, inValue.w);
  12. }
  13. JPH_SHADER_FUNCTION_BEGIN(void, main, cHairPerVertexBatch, 1, 1)
  14. JPH_SHADER_PARAM_THREAD_ID(tid)
  15. JPH_SHADER_FUNCTION_END
  16. {
  17. // Check that we are processing a valid vertex
  18. uint vtx = tid.x + cNumStrands; // Skip the root of each strand, it's fixed
  19. if (vtx >= cNumVertices)
  20. return;
  21. if (IsVertexFixed(gVerticesFixed, vtx))
  22. return;
  23. // Convert position to grid index and fraction
  24. uint3 index;
  25. float3 ma;
  26. GridPositionToIndexAndFraction(gPositions[vtx].mPosition, index, ma);
  27. float3 a = float3(1, 1, 1) - ma;
  28. // Get velocity
  29. float4 velocity_and_density = float4(gVelocities[vtx].mVelocity, 1) * cFloatToFixed;
  30. // Calculate contribution of density and velocity for each cell
  31. uint3 stride = cGridStride;
  32. uint adr_000 = GridIndexToBufferIndex(index);
  33. uint adr_100 = adr_000 + 1;
  34. uint adr_010 = adr_000 + stride.y;
  35. uint adr_110 = adr_010 + 1;
  36. AtomicAddVelocityAndDensity(adr_000, (int4)round( a.x * a.y * a.z * velocity_and_density));
  37. AtomicAddVelocityAndDensity(adr_100, (int4)round(ma.x * a.y * a.z * velocity_and_density));
  38. AtomicAddVelocityAndDensity(adr_010, (int4)round( a.x * ma.y * a.z * velocity_and_density));
  39. AtomicAddVelocityAndDensity(adr_110, (int4)round(ma.x * ma.y * a.z * velocity_and_density));
  40. AtomicAddVelocityAndDensity(adr_000 + stride.z, (int4)round( a.x * a.y * ma.z * velocity_and_density));
  41. AtomicAddVelocityAndDensity(adr_100 + stride.z, (int4)round(ma.x * a.y * ma.z * velocity_and_density));
  42. AtomicAddVelocityAndDensity(adr_010 + stride.z, (int4)round( a.x * ma.y * ma.z * velocity_and_density));
  43. AtomicAddVelocityAndDensity(adr_110 + stride.z, (int4)round(ma.x * ma.y * ma.z * velocity_and_density));
  44. }