Files
Project-M/Packages/com.rukhanka.animation/Rukhanka.Runtime/Deformation/Resources/CopyInitialMeshData.hlsl
T
2026-05-31 14:27:52 -07:00

58 lines
2.2 KiB
HLSL

#ifndef COPY_INITIAL_MESH_DATA_HLSL_
#define COPY_INITIAL_MESH_DATA_HLSL_
/////////////////////////////////////////////////////////////////////////////////
ByteAddressBuffer meshVertexData;
ByteAddressBuffer meshBonesPerVertexData;
RWByteAddressBuffer outInitialDeformedMeshData;
int inputVertexSizeInBytes;
int outDataVertexOffset;
uint totalMeshVertices;
int outBonesWeightsDataOffset;
int inputBonesWeightsDataOffset;
/////////////////////////////////////////////////////////////////////////////////
SourceSkinnedMeshVertex ReadSourceVertex(int vertexIndex)
{
int vertexByteOffset = vertexIndex * inputVertexSizeInBytes;
SourceSkinnedMeshVertex rv = (SourceSkinnedMeshVertex)0;
#ifndef RUKHANKA_INPLACE_SKINNING
CHECK_RAW_BUFFER_OUT_OF_BOUNDS(RUKHANKADEBUGMARKERS_DEFORMATION_COPY_MESH_DATA, vertexByteOffset, 40, meshVertexData);
float4 v0 = asfloat(meshVertexData.Load4(vertexByteOffset + 0));
float4 v1 = asfloat(meshVertexData.Load4(vertexByteOffset + 16));
float1 v2 = asfloat(meshVertexData.Load(vertexByteOffset + 32));
rv.position = v0.xyz;
rv.normal = float3(v0.w, v1.xy);
rv.tangent = float3(v1.zw, v2.x);
#endif
int baseBoneWeightIndex = inputBonesWeightsDataOffset + vertexIndex;
CHECK_RAW_BUFFER_OUT_OF_BOUNDS(RUKHANKADEBUGMARKERS_DEFORMATION_COPY_MESH_DATA, baseBoneWeightIndex * 4, 4, meshBonesPerVertexData);
uint boneWeightsOffsetAndCountPacked = meshBonesPerVertexData.Load(baseBoneWeightIndex * 4);
rv.boneWeightsOffset = SourceSkinnedMeshVertex::GetBoneWeightsOffsetFromPackedUINT(boneWeightsOffsetAndCountPacked) + outBonesWeightsDataOffset;
rv.boneWeightsCount = SourceSkinnedMeshVertex::GetBoneWeightsCountFromPackedUINT(boneWeightsOffsetAndCountPacked);
return rv;
}
/////////////////////////////////////////////////////////////////////////////////
[numthreads(128, 1, 1)]
void CopyInitialMeshData(uint tid: SV_DispatchThreadID)
{
if (tid >= totalMeshVertices)
return;
SourceSkinnedMeshVertex v = ReadSourceVertex(tid);
int outVertexOffset = tid + outDataVertexOffset;
v.WriteIntoRawBuffer(outInitialDeformedMeshData, outVertexOffset);
}
#endif // COPY_INITIAL_MESH_DATA_HLSL_