HairUpdateVelocity.hlsl 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2026 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include "HairUpdateVelocityBindings.h"
  5. #include "HairCommon.h"
  6. #include "HairUpdateVelocity.h"
  7. JPH_SHADER_FUNCTION_BEGIN(void, main, cHairPerVertexBatch, 1, 1)
  8. JPH_SHADER_PARAM_THREAD_ID(tid)
  9. JPH_SHADER_FUNCTION_END
  10. {
  11. // Check if this is a valid vertex
  12. uint vtx = tid.x + cNumStrands; // Skip the root of each strand, it's fixed
  13. if (vtx >= cNumVertices)
  14. return;
  15. if (IsVertexFixed(gVerticesFixed, vtx))
  16. return;
  17. // Load the material
  18. uint strand_idx = vtx % cNumStrands;
  19. JPH_HairMaterial material = gMaterials[GetStrandMaterialIndex(gStrandMaterialIndex, strand_idx)];
  20. // Load the vertex
  21. float strand_fraction = GetVertexStrandFraction(gStrandFractions, vtx);
  22. float3 initial_pos = gInitialPositions[vtx];
  23. float4 initial_bishop = JPH_QuatDecompress(gInitialBishops[vtx]);
  24. JPH_HairGlobalPoseTransform global_pose_transform = gGlobalPoseTransforms[strand_idx];
  25. JPH_HairPosition pos = gPositions[vtx];
  26. JPH_HairPosition prev_pos = gPreviousPositions[vtx];
  27. JPH_HairVelocity vel;
  28. ApplyGlobalPose(pos, initial_pos, initial_bishop, global_pose_transform, material, strand_fraction);
  29. ApplyCollisionAndUpdateVelocity(vtx, pos, prev_pos, material, strand_fraction, vel);
  30. LimitVelocity(vel, material);
  31. // Write back vertex
  32. gPositions[vtx] = pos;
  33. gVelocities[vtx] = vel;
  34. }