60 lines
1.7 KiB
HLSL
60 lines
1.7 KiB
HLSL
#ifndef SKIN_MATRIX_HLSL_
|
|
#define SKIN_MATRIX_HLSL_
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
struct SkinMatrix
|
|
{
|
|
static const uint size = 4 * 3 * 4;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
static float3x4 Identity()
|
|
{
|
|
float3x4 rv = float3x4
|
|
(
|
|
float3(1, 0, 0),
|
|
float3(0, 1, 0),
|
|
float3(0, 0, 1),
|
|
float3(0, 0, 0)
|
|
);
|
|
return rv;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
static float3x4 ReadFromRawBuffer(ByteAddressBuffer b, int index)
|
|
{
|
|
uint byteAddress = index * size;
|
|
|
|
float3x4 rv;
|
|
|
|
rv._11_21_31_12 = asfloat(b.Load4(byteAddress + 00));
|
|
rv._22_32_13_23 = asfloat(b.Load4(byteAddress + 16));
|
|
rv._33_14_24_34 = asfloat(b.Load4(byteAddress + 32));
|
|
|
|
CHECK_RAW_BUFFER_OUT_OF_BOUNDS(RUKHANKADEBUGMARKERS_DEFORMATION_FRAME_SKIN_MATRICES_READ, byteAddress, size, b);
|
|
|
|
return rv;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
static void WriteToRawBuffer(RWByteAddressBuffer b, float3x4 v, int index)
|
|
{
|
|
uint byteAddress = index * size;
|
|
|
|
b.Store4(byteAddress + 00, asuint(v._11_21_31_12));
|
|
b.Store4(byteAddress + 16, asuint(v._22_32_13_23));
|
|
b.Store4(byteAddress + 32, asuint(v._33_14_24_34));
|
|
|
|
CHECK_RAW_BUFFER_OUT_OF_BOUNDS(RUKHANKADEBUGMARKERS_GPUANIMATOR_COMPUTE_SKIN_MATRICES_OUT_SKIN_MATRICES_WRITE, byteAddress, size, b);
|
|
}
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#endif
|
|
|
|
|