DirectXMath 3.08
directxmathOriginally posted to Chuck Walbourn's Blog on MSDN,
DirectXMath version 3.08 is included in the Windows 10 SDK November 2015 update (10586) that ships with VS 2015 Update 1 with the Windows Tools 1.2 for Windows 10.
This new version includes the following:
- Added use of ``_mm_sfence`` for Stream methods
- Fixed bug with non-uniform scaling transforms for
BoundingOrientedBox
- Added asserts for Near/FarZ in XMMatrix* methods
- Added use of
=default
for PODs with VS 2013/2015 - Additional SSE and ARM-NEON optimizations for PackedVector functions
It’s a fairly minor update compared to DirectXMath 3.07, but does have one interesting side-effect worth discussing further. Because of the use of the C++11 =default
construct, existing DirectXMath code may generate new previously latent warnings when building with VS 2013 or VS 2015:
warning C4101: 'X': unreferenced local variable
warning C4701: potentially uninitialized local variable 'X' used
The warnings are easy to address, but may surprise developers when they pop up in existing code. Note that the =default
construct is not merely syntactic fluff: In some use cases, it can make the compiler generate much better code by understanding the constructor does nothing at all and the type in question is in fact ‘trivial plain-old-data’. This mostly shows up in the cases of inheritance, so it may not be obviously different in simple codegen cases. It does, however, cause these compiler to notice when a variable is not actually used or initialized.
BoundingOrientedBox
The fix for non-uniform scaling transformations is trivial to apply to older versions of the library:
inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, FXMMATRIX M) const
{
// Load the box.
XMVECTOR vCenter = XMLoadFloat3(&Center);
XMVECTOR vExtents = XMLoadFloat3(&Extents);
XMVECTOR vOrientation = XMLoadFloat4(&Orientation);
assert(DirectX::Internal::XMQuaternionIsUnit(vOrientation));
// Composite the box rotation and the transform rotation.
XMMATRIX nM;
nM.r[0] = XMVector3Normalize(M.r[0]);
nM.r[1] = XMVector3Normalize(M.r[1]);
nM.r[2] = XMVector3Normalize(M.r[2]);
nM.r[3] = g_XMIdentityR3;
XMVECTOR Rotation = XMQuaternionRotationMatrix(nM);
vOrientation = XMQuaternionMultiply(vOrientation, Rotation);
// Transform the center.
vCenter = XMVector3Transform(vCenter, M);
// Scale the box extents.
XMVECTOR dX = XMVector3Length(M.r[0]);
XMVECTOR dY = XMVector3Length(M.r[1]);
XMVECTOR dZ = XMVector3Length(M.r[2]);
XMVECTOR VectorScale = XMVectorSelect(dY, dX, g_XMSelect1000); // !!swapped dX and dY
VectorScale = XMVectorSelect(dZ, VectorScale, g_XMSelect1100); // !!swapped dZ and VectorScale
vExtents = vExtents * VectorScale;
// Store the box.
XMStoreFloat3(&Out.Center, vCenter);
XMStoreFloat3(&Out.Extents, vExtents);
XMStoreFloat4(&Out.Orientation, vOrientation);
}
Xbox One: DirectXMath 3.08 shipped in the Xbox One XDK (July 2015 or later)
GitHub: Note that DirectXMath is now hosted on GitHub.
Related: Known Issues: DirectXMath 3.03, DirectXMath 3.06, DirectXMath 3.09, DirectXMath 3.10, DirectXMath 3.11