Created
April 8, 2020 08:39
-
-
Save djbelyak/4654eb726ca419d551a7ac226d730bb1 to your computer and use it in GitHub Desktop.
Linalg and DirectXMath comparison
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file | |
#define CATCH_CONFIG_ENABLE_BENCHMARKING | |
#include "catch.hpp" | |
#include "linalg.h" | |
using namespace linalg::aliases; | |
using namespace linalg::ostream_overloads; | |
#define _XM_NO_INTRINSICS_ | |
#include <DirectXMath.h> | |
using namespace DirectX; | |
TEST_CASE("Linalg test") | |
{ | |
float4x4 A = { {1, 5, 9, 13}, {2, 6, 10, 14}, {3, 7, 11, 15}, {4, 8, 12, 16} }; | |
float4x4 B = { {16, 12, 8, 4 }, {15, 11, 7, 3 }, {14, 10, 6, 2}, {13, 9, 5, 1} }; | |
float4x4 ExpectedMatrix = { { 80, 240.0f, 400.0f, 560.0f }, { 70.0f, 214.0f, 358.0f, 502.0f }, | |
{ 60.0f, 188.0f, 316.0f, 444.0f }, { 50.0f, 162.0f, 274.0f, 386.0f } }; | |
REQUIRE(mul(A, B) != (A * B)); | |
REQUIRE(mul(A, B) == ExpectedMatrix); | |
REQUIRE(mul(B, A) != ExpectedMatrix); | |
REQUIRE(mul(transpose(B), transpose(A)) == transpose(mul(A, B))); | |
REQUIRE(transpose(mul(transpose(B), transpose(A))) == ExpectedMatrix); | |
float4 X = { 1.f, 2.f, 3.f, 4.f }; | |
float4 ExpectedVector = { 30.0f, 70.0f, 110.0f, 150.0f }; | |
REQUIRE(mul(A, X) == ExpectedVector); | |
} | |
bool IsXMMATRIXAreEqual(const XMMATRIX& expected, const XMMATRIX& result) | |
{ | |
bool equal = true; | |
for (UINT i = 0; i < 4; i++) | |
{ | |
for (UINT j = 0; j < 4; j++) | |
{ | |
equal &= (expected.m[i][j] == result.m[i][j]); | |
} | |
} | |
return equal; | |
} | |
TEST_CASE("DirecX Math test") | |
{ | |
XMMATRIX A (1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10., 11.f, 12.f, 13.f, 14.f, 15.f, 16.f); | |
XMMATRIX B (16.f, 15.f, 14.f, 13.f, 12.f, 11.f, 10.f, 9.f, 8.f, 7.f, 6.f, 5.f, 4.f, 3.f, 2.f, 1.f); | |
XMMATRIX ExpectedMatrix (80.f, 70.0f, 60.0f, 50.0f, 240.0f, 214.0f, 188.0f, 162.0f, 400.0f, 358.0f, 316.0f, 274.0f, 560.0f, 502.0f, 444.0f, 386.0f); | |
REQUIRE(IsXMMATRIXAreEqual(XMMatrixMultiply(A, B), (A * B))); | |
REQUIRE(IsXMMATRIXAreEqual(ExpectedMatrix, (A * B))); | |
REQUIRE(!IsXMMATRIXAreEqual(ExpectedMatrix, (B * A))); | |
REQUIRE(IsXMMATRIXAreEqual(ExpectedMatrix, XMMatrixTranspose(XMMatrixTranspose(B) * XMMatrixTranspose(A)))); | |
REQUIRE(IsXMMATRIXAreEqual(XMMatrixTranspose(A * B), XMMatrixTranspose(B) * XMMatrixTranspose(A))); | |
XMFLOAT4 X(1.f, 2.f, 3.f, 4.f); | |
XMFLOAT4 ExpectedVector(30.0f, 70.0f, 110.0f, 150.0f); | |
REQUIRE(XMVector4Equal(XMVector4Transform(XMLoadFloat4(&X), XMMatrixTranspose(A)), XMLoadFloat4(&ExpectedVector))); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment