HairUpdateVelocityIntegrate.hlsl 1.6 KB

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