58 lines
2.2 KiB
HLSL
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_
|