HairApplyGlobalPose.h 1.2 KB

12345678910111213141516171819
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2026 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. void ApplyGlobalPose(JPH_IN_OUT(JPH_HairPosition) ioPos, float3 inRestPosition, JPH_Quat inRestOrientation, JPH_IN(JPH_HairGlobalPoseTransform) inGlobalPoseTransform, JPH_IN(JPH_HairMaterial) inMaterial, float inStrandFraction)
  5. {
  6. // LERP between stored global pose and global pose skinned to the scalp
  7. float skin_factor = GradientSamplerSample(inMaterial.mSkinGlobalPose, inStrandFraction);
  8. float3 in_position = inRestPosition;
  9. in_position += skin_factor * (inGlobalPoseTransform.mPosition + JPH_QuatMulVec3(inGlobalPoseTransform.mRotation, in_position) - in_position);
  10. JPH_Quat in_rotation = inRestOrientation;
  11. in_rotation += skin_factor * (JPH_QuatMulQuat(inGlobalPoseTransform.mRotation, in_rotation) - in_rotation);
  12. // LERP between simulated position and skinned position
  13. float pose_factor = GradientSamplerSample(inMaterial.mGlobalPose, inStrandFraction);
  14. ioPos.mPosition += pose_factor * (in_position - ioPos.mPosition);
  15. ioPos.mRotation += pose_factor * (in_rotation - ioPos.mRotation);
  16. ioPos.mRotation = normalize(ioPos.mRotation);
  17. }