Files
2026-05-31 14:27:52 -07:00

42 lines
1.7 KiB
HLSL

#ifndef MAKE_SKIN_MATRICES_HLSL_
#define MAKE_SKIN_MATRICES_HLSL_
/////////////////////////////////////////////////////////////////////////////////
RWByteAddressBuffer outSkinMatrices;
StructuredBuffer<BoneTransform> rigSpaceBoneTransformsBuf;
StructuredBuffer<SkinnedMeshWorkload> skinMatrixWorkloadBuf;
ByteAddressBuffer skinnedMeshBoneData;
uint totalSkinnedMeshes;
/////////////////////////////////////////////////////////////////////////////////
[numthreads(128, 1, 1)]
void ComputeSkinMatrices(uint tid: SV_DispatchThreadID)
{
if (tid >= totalSkinnedMeshes)
return;
CHECK_STRUCTURED_BUFFER_OUT_OF_BOUNDS(RUKHANKADEBUGMARKERS_GPUANIMATOR_COMPUTE_SKIN_MATRICES_SKIN_MATRIX_WORKLOAD_READ, tid, skinMatrixWorkloadBuf);
SkinnedMeshWorkload smw = skinMatrixWorkloadBuf[tid];
float4x4 w2l = smw.skinnedRootBoneToEntityTransform;
for (int i = 0; i < smw.skinMatricesCount; ++i)
{
SkinnedMeshBone smb = SkinnedMeshBone::ReadFromRawBuffer(skinnedMeshBoneData, smw.boneRemapTableIndex + i);
int boneTransformIndex = smb.boneRemapIndex + smw.animatedBoneIndexOffset;
CHECK_STRUCTURED_BUFFER_OUT_OF_BOUNDS(RUKHANKADEBUGMARKERS_GPUANIMATOR_COMPUTE_SKIN_MATRICES_RIG_SPACE_BONE_TRANSFORMS_READ, boneTransformIndex, rigSpaceBoneTransformsBuf);
BoneTransform bt = rigSpaceBoneTransformsBuf[boneTransformIndex];
float4x4 skinMatrix = bt.ToFloat4x4();
skinMatrix = mul(w2l, skinMatrix);
float4x4 outSkinMatrix = mul(skinMatrix, smb.bindPose);
int skinMatrixOutIndex = smw.skinMatrixBaseOutIndex + i;
SkinMatrix::WriteToRawBuffer(outSkinMatrices, (float3x4)outSkinMatrix, skinMatrixOutIndex);
}
}
#endif //MAKE_SKIN_MATRICES_HLSL_