Skip to content

Commit 6be498c

Browse files
authored
Reimplemented XMMatrixRotationRollPitchYaw(FromVector) (#144)
1 parent 706722d commit 6be498c

File tree

1 file changed

+96
-2
lines changed

1 file changed

+96
-2
lines changed

Inc/DirectXMathMatrix.inl

Lines changed: 96 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,8 +1655,41 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYaw
16551655
float Roll
16561656
) noexcept
16571657
{
1658+
#if defined(_XM_NO_INTRINSICS_)
1659+
float cp = cosf(Pitch);
1660+
float sp = sinf(Pitch);
1661+
1662+
float cy = cosf(Yaw);
1663+
float sy = sinf(Yaw);
1664+
1665+
float cr = cosf(Roll);
1666+
float sr = sinf(Roll);
1667+
1668+
XMMATRIX M;
1669+
M.m[0][0] = cr * cy + sr * sp * sy;
1670+
M.m[0][1] = sr * cp;
1671+
M.m[0][2] = sr * sp * cy - cr * sy;
1672+
M.m[0][3] = 0.0f;
1673+
1674+
M.m[1][0] = cr * sp * sy - sr * cy;
1675+
M.m[1][1] = cr * cp;
1676+
M.m[1][2] = sr * sy + cr * sp * cy;
1677+
M.m[1][3] = 0.0f;
1678+
1679+
M.m[2][0] = cp * sy;
1680+
M.m[2][1] = -sp;
1681+
M.m[2][2] = cp * cy;
1682+
M.m[2][3] = 0.0f;
1683+
1684+
M.m[3][0] = 0.0f;
1685+
M.m[3][1] = 0.0f;
1686+
M.m[3][2] = 0.0f;
1687+
M.m[3][3] = 1.0f;
1688+
return M;
1689+
#else
16581690
XMVECTOR Angles = XMVectorSet(Pitch, Yaw, Roll, 0.0f);
16591691
return XMMatrixRotationRollPitchYawFromVector(Angles);
1692+
#endif
16601693
}
16611694

16621695
//------------------------------------------------------------------------------
@@ -1666,8 +1699,69 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYawFromVector
16661699
FXMVECTOR Angles // <Pitch, Yaw, Roll, undefined>
16671700
) noexcept
16681701
{
1669-
XMVECTOR Q = XMQuaternionRotationRollPitchYawFromVector(Angles);
1670-
return XMMatrixRotationQuaternion(Q);
1702+
#if defined(_XM_NO_INTRINSICS_)
1703+
float cp = cosf(Angles.vector4_f32[0]);
1704+
float sp = sinf(Angles.vector4_f32[0]);
1705+
1706+
float cy = cosf(Angles.vector4_f32[1]);
1707+
float sy = sinf(Angles.vector4_f32[1]);
1708+
1709+
float cr = cosf(Angles.vector4_f32[2]);
1710+
float sr = sinf(Angles.vector4_f32[2]);
1711+
1712+
XMMATRIX M;
1713+
M.m[0][0] = cr * cy + sr * sp * sy;
1714+
M.m[0][1] = sr * cp;
1715+
M.m[0][2] = sr * sp * cy - cr * sy;
1716+
M.m[0][3] = 0.0f;
1717+
1718+
M.m[1][0] = cr * sp * sy - sr * cy;
1719+
M.m[1][1] = cr * cp;
1720+
M.m[1][2] = sr * sy + cr * sp * cy;
1721+
M.m[1][3] = 0.0f;
1722+
1723+
M.m[2][0] = cp * sy;
1724+
M.m[2][1] = -sp;
1725+
M.m[2][2] = cp * cy;
1726+
M.m[2][3] = 0.0f;
1727+
1728+
M.m[3][0] = 0.0f;
1729+
M.m[3][1] = 0.0f;
1730+
M.m[3][2] = 0.0f;
1731+
M.m[3][3] = 1.0f;
1732+
return M;
1733+
#else
1734+
static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, -1.0f, 1.0f } } };
1735+
1736+
XMVECTOR SinAngles, CosAngles;
1737+
XMVectorSinCos(&SinAngles, &CosAngles, Angles);
1738+
1739+
XMVECTOR P0 = XMVectorPermute<XM_PERMUTE_1X, XM_PERMUTE_0Z, XM_PERMUTE_1Z, XM_PERMUTE_1X>(SinAngles, CosAngles);
1740+
XMVECTOR Y0 = XMVectorPermute<XM_PERMUTE_0Y, XM_PERMUTE_1X, XM_PERMUTE_1X, XM_PERMUTE_1Y>(SinAngles, CosAngles);
1741+
XMVECTOR P1 = XMVectorPermute<XM_PERMUTE_1Z, XM_PERMUTE_0Z, XM_PERMUTE_1Z, XM_PERMUTE_0Z>(SinAngles, CosAngles);
1742+
XMVECTOR Y1 = XMVectorPermute<XM_PERMUTE_1Y, XM_PERMUTE_1Y, XM_PERMUTE_0Y, XM_PERMUTE_0Y>(SinAngles, CosAngles);
1743+
XMVECTOR P2 = XMVectorPermute<XM_PERMUTE_0Z, XM_PERMUTE_1Z, XM_PERMUTE_0Z, XM_PERMUTE_1Z>(SinAngles, CosAngles);
1744+
XMVECTOR P3 = XMVectorPermute<XM_PERMUTE_0Y, XM_PERMUTE_0Y, XM_PERMUTE_1Y, XM_PERMUTE_1Y>(SinAngles, CosAngles);
1745+
XMVECTOR Y2 = XMVectorSplatX(SinAngles);
1746+
XMVECTOR NS = XMVectorNegate(SinAngles);
1747+
1748+
XMVECTOR Q0 = XMVectorMultiply(P0, Y0);
1749+
XMVECTOR Q1 = XMVectorMultiply(P1, Sign.v);
1750+
Q1 = XMVectorMultiply(Q1, Y1);
1751+
XMVECTOR Q2 = XMVectorMultiply(P2, Y2);
1752+
Q2 = XMVectorMultiplyAdd(Q2, P3, Q1);
1753+
1754+
XMVECTOR V0 = XMVectorPermute<XM_PERMUTE_1X, XM_PERMUTE_0Y, XM_PERMUTE_1Z, XM_PERMUTE_0W>(Q0, Q2);
1755+
XMVECTOR V1 = XMVectorPermute<XM_PERMUTE_1Y, XM_PERMUTE_0Z, XM_PERMUTE_1W, XM_PERMUTE_0W>(Q0, Q2);
1756+
XMVECTOR V2 = XMVectorPermute<XM_PERMUTE_0X, XM_PERMUTE_1X, XM_PERMUTE_0W, XM_PERMUTE_0W>(Q0, NS);
1757+
1758+
XMMATRIX M;
1759+
M.r[0] = XMVectorSelect(g_XMZero, V0, g_XMSelect1110.v);
1760+
M.r[1] = XMVectorSelect(g_XMZero, V1, g_XMSelect1110.v);
1761+
M.r[2] = XMVectorSelect(g_XMZero, V2, g_XMSelect1110.v);
1762+
M.r[3] = g_XMIdentityR3;
1763+
return M;
1764+
#endif
16711765
}
16721766

16731767
//------------------------------------------------------------------------------

0 commit comments

Comments
 (0)