| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
- // SPDX-FileCopyrightText: 2026 Jorrit Rouwe
- // SPDX-License-Identifier: MIT
- #include "HairApplyDeltaTransformBindings.h"
- #include "HairCommon.h"
- JPH_SHADER_FUNCTION_BEGIN(void, main, cHairPerVertexBatch, 1, 1)
- JPH_SHADER_PARAM_THREAD_ID(tid)
- JPH_SHADER_FUNCTION_END
- {
- // Check if this is a valid vertex
- uint vtx = tid.x + cNumStrands; // Skip the root of each strand, it's fixed
- if (vtx >= cNumVertices)
- return;
- if (IsVertexFixed(gVerticesFixed, vtx))
- return;
- // Load the material
- uint strand_idx = vtx % cNumStrands;
- JPH_HairMaterial material = gMaterials[GetStrandMaterialIndex(gStrandMaterialIndex, strand_idx)];
- // Load the vertex
- float strand_fraction = GetVertexStrandFraction(gStrandFractions, vtx);
- JPH_HairPosition pos = gPositions[vtx];
- JPH_HairVelocity vel = gVelocities[vtx];
- // Transform the position so that it stays in the same place in world space (if influence is 1)
- float influence = GradientSamplerSample(material.mWorldTransformInfluence, strand_fraction);
- pos.mPosition += influence * (JPH_Mat44Mul3x4Vec3(cDeltaTransform, pos.mPosition) - pos.mPosition);
- // Linear interpolate the rotation based on the influence
- pos.mRotation = normalize(JPH_QuatMulQuat(influence * cDeltaTransformQuat + float4(0, 0, 0, 1.0f - influence), pos.mRotation));
- // Transform velocities
- vel.mVelocity = JPH_Mat44Mul3x3Vec3(cDeltaTransform, vel.mVelocity);
- vel.mAngularVelocity = JPH_Mat44Mul3x3Vec3(cDeltaTransform, vel.mAngularVelocity);
- // Write back vertex
- gPositions[vtx] = pos;
- gVelocities[vtx] = vel;
- }
|