#ifndef MAKE_SKIN_MATRICES_HLSL_ #define MAKE_SKIN_MATRICES_HLSL_ ///////////////////////////////////////////////////////////////////////////////// RWByteAddressBuffer outSkinMatrices; StructuredBuffer rigSpaceBoneTransformsBuf; StructuredBuffer 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_