diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt index ff4eb05..83ef890 100644 --- a/framework/CMakeLists.txt +++ b/framework/CMakeLists.txt @@ -21,7 +21,6 @@ add_executable (xna WIN32 "platform/rasterizerstate-dx.cpp" "platform/vertexbuffer-dx.cpp" "platform/indexbuffer-dx.cpp" -"common/matrix.cpp" "platform/constbuffer-dx.cpp" "platform/databuffer-dx.cpp" "platform/samplerstate-dx.cpp" @@ -31,7 +30,6 @@ add_executable (xna WIN32 "platform/keyboard-dx.cpp" "platform/mouse-dx.cpp" "platform/gamepad-dx.cpp" - "platform/soundeffect-dx.cpp" "platform/displaymode-dx.cpp" "platform/presentparameters-dx.cpp" @@ -47,11 +45,9 @@ add_executable (xna WIN32 "platform/init-dx.cpp" "game/servicecontainer.cpp" "common/color.cpp" -"common/math.cpp" -"common/quaternion.cpp" "common/collision.cpp" "common/gjk.cpp" - "common/numerics.cpp") +"common/numerics.cpp") if (CMAKE_VERSION VERSION_GREATER 3.12) set_property(TARGET xna PROPERTY CXX_STANDARD 20) diff --git a/framework/common/math.cpp b/framework/common/math.cpp deleted file mode 100644 index 2dac1f8..0000000 --- a/framework/common/math.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "common/math.hpp" - -namespace xna { - float MathHelper::CatmullRom(float value1, float value2, float value3, float value4, float amount) { - const auto num1 = amount * amount; - const auto num2 = amount * num1; - return (0.5F * (2.0F * value2 + (-value1 + value3) * amount + (2.0F * value1 - 5.0F * value2 + 4.0F * value3 - value4) * num1 + (-value1 + 3.0F * value2 - 3.0F * value3 + value4) * num2)); - } - - float MathHelper::Hermite(float value1, float tangent1, float value2, float tangent2, float amount) { - const auto num1 = amount; - const auto num2 = num1 * num1; - const auto num3 = num1 * num2; - const auto num4 = (2.0F * num3 - 3.0F * num2 + 1.0F); - const auto num5 = (-2.0F * num3 + 3.0F * num2); - const auto num6 = num3 - 2.0f * num2 + num1; - const auto num7 = num3 - num2; - return value1 * num4 + value2 * num5 + tangent1 * num6 + tangent2 * num7; - } -} \ No newline at end of file diff --git a/framework/common/matrix.cpp b/framework/common/matrix.cpp deleted file mode 100644 index 929c77c..0000000 --- a/framework/common/matrix.cpp +++ /dev/null @@ -1,287 +0,0 @@ -#include "common/matrix.hpp" - -namespace xna { - Matrix Matrix::CreateBillboard(Vector3 const& objectPosition, Vector3 const& cameraPosition, Vector3 const& cameraUpVector, Vector3* cameraForwardVector) - { - Vector3 result1 = Vector3::Subtract(objectPosition, cameraPosition); - const auto d = result1.LengthSquared(); - - if (d < 9.9999997473787516E-05) - result1 = cameraForwardVector ? -*cameraForwardVector : Vector3::Forward(); - else - result1 = Vector3::Multiply(result1, static_cast(1.0 / sqrt(d))); - - Vector3 result2 = Vector3::Cross(cameraUpVector, result1); - result2.Normalize(); - - Vector3 result3 = Vector3::Cross(result1, result2); - - Matrix result; - result.M11 = result2.X; - result.M12 = result2.Y; - result.M13 = result2.Z; - result.M14 = 0.0f; - result.M21 = result3.X; - result.M22 = result3.Y; - result.M23 = result3.Z; - result.M24 = 0.0f; - result.M31 = result1.X; - result.M32 = result1.Y; - result.M33 = result1.Z; - result.M34 = 0.0f; - result.M41 = objectPosition.X; - result.M42 = objectPosition.Y; - result.M43 = objectPosition.Z; - result.M44 = 1.0f; - - return result; - } - - Matrix Matrix::CreateConstrainedBillboard(Vector3 const& objectPosition, Vector3 const& cameraPosition, Vector3 const& rotateAxis, Vector3* cameraForwardVector, Vector3* objectForwardVector) - { - Vector3 result1 = Vector3::Subtract(objectPosition, cameraPosition); - const auto d = result1.LengthSquared(); - - if (d < 9.9999997473787516E-05) - result1 = cameraForwardVector ? -*cameraForwardVector : Vector3::Forward(); - else - result1 = Vector3::Multiply(result1, static_cast(1.0 / sqrt(d))); - - //Vector3 vector2 = rotateAxis; - float result2 = Vector3::Dot(rotateAxis, result1); - const auto factor = 0.998254656791687; - const auto forward = Vector3::Forward(); - Vector3 result3 = forward; - Vector3 result4; - - if (abs(result2) > factor) { - if (objectForwardVector) { - result2 = Vector3::Dot(rotateAxis, *objectForwardVector); - - if (abs(result2) > factor) { - auto const _abs = abs(rotateAxis.X * forward.X + rotateAxis.Y * forward.Y + rotateAxis.Z * forward.Z); - - if (_abs > factor) - result3 = Vector3::Right(); - } - } - else { - if (abs(rotateAxis.X * forward.X + rotateAxis.Y * forward.Y + rotateAxis.Z * forward.Z) > factor) - result3 = Vector3::Right(); - } - - result4 = Vector3::Cross(rotateAxis, result3); - result4.Normalize(); - - result3 = Vector3::Cross(result4, rotateAxis); - result3.Normalize(); - } - else - { - result4 = Vector3::Cross(rotateAxis, result1); - result4.Normalize(); - result3 = Vector3::Cross(result4, rotateAxis); - result3.Normalize(); - } - - Matrix constrainedBillboard; - constrainedBillboard.M11 = result4.X; - constrainedBillboard.M12 = result4.Y; - constrainedBillboard.M13 = result4.Z; - constrainedBillboard.M14 = 0.0f; - constrainedBillboard.M21 = rotateAxis.X; - constrainedBillboard.M22 = rotateAxis.Y; - constrainedBillboard.M23 = rotateAxis.Z; - constrainedBillboard.M24 = 0.0f; - constrainedBillboard.M31 = result3.X; - constrainedBillboard.M32 = result3.Y; - constrainedBillboard.M33 = result3.Z; - constrainedBillboard.M34 = 0.0f; - constrainedBillboard.M41 = objectPosition.X; - constrainedBillboard.M42 = objectPosition.Y; - constrainedBillboard.M43 = objectPosition.Z; - constrainedBillboard.M44 = 1.0f; - return constrainedBillboard; - } - - Matrix Matrix::CreateRotationX(float radians) - { - const auto num1 = static_cast(cos(radians)); - const auto num2 = static_cast(sin(radians)); - - Matrix rotationX; - rotationX.M11 = 1.0f; - rotationX.M12 = 0.0f; - rotationX.M13 = 0.0f; - rotationX.M14 = 0.0f; - rotationX.M21 = 0.0f; - rotationX.M22 = num1; - rotationX.M23 = num2; - rotationX.M24 = 0.0f; - rotationX.M31 = 0.0f; - rotationX.M32 = -num2; - rotationX.M33 = num1; - rotationX.M34 = 0.0f; - rotationX.M41 = 0.0f; - rotationX.M42 = 0.0f; - rotationX.M43 = 0.0f; - rotationX.M44 = 1.0f; - return rotationX; - } - - Matrix Matrix::CreateRotationY(float radians) - { - const auto num1 = static_cast(cos(radians)); - const auto num2 = static_cast(sin(radians)); - Matrix rotationY; - rotationY.M11 = num1; - rotationY.M12 = 0.0f; - rotationY.M13 = -num2; - rotationY.M14 = 0.0f; - rotationY.M21 = 0.0f; - rotationY.M22 = 1.0f; - rotationY.M23 = 0.0f; - rotationY.M24 = 0.0f; - rotationY.M31 = num2; - rotationY.M32 = 0.0f; - rotationY.M33 = num1; - rotationY.M34 = 0.0f; - rotationY.M41 = 0.0f; - rotationY.M42 = 0.0f; - rotationY.M43 = 0.0f; - rotationY.M44 = 1.0f; - return rotationY; - } - - Matrix Matrix::CreateRotationZ(float radians) - { - const auto num1 = static_cast(cos(radians)); - const auto num2 = static_cast(sin(radians)); - Matrix rotationZ; - rotationZ.M11 = num1; - rotationZ.M12 = num2; - rotationZ.M13 = 0.0f; - rotationZ.M14 = 0.0f; - rotationZ.M21 = -num2; - rotationZ.M22 = num1; - rotationZ.M23 = 0.0f; - rotationZ.M24 = 0.0f; - rotationZ.M31 = 0.0f; - rotationZ.M32 = 0.0f; - rotationZ.M33 = 1.0f; - rotationZ.M34 = 0.0f; - rotationZ.M41 = 0.0f; - rotationZ.M42 = 0.0f; - rotationZ.M43 = 0.0f; - rotationZ.M44 = 1.0f; - return rotationZ; - } - - Matrix Matrix::CreateFromAxisAngle(Vector3 const& axis, float angle) - { - const auto x = axis.X; - const auto y = axis.Y; - const auto z = axis.Z; - const auto num1 = static_cast(sin(angle)); - const auto num2 = static_cast(cos(angle)); - const auto num3 = x * x; - const auto num4 = y * y; - const auto num5 = z * z; - const auto num6 = x * y; - const auto num7 = x * z; - const auto num8 = y * z; - - Matrix fromAxisAngle; - fromAxisAngle.M11 = num3 + num2 * (1.0f - num3); - fromAxisAngle.M12 = (num6 - num2 * num6 + num1 * z); - fromAxisAngle.M13 = (num7 - num2 * num7 - num1 * y); - fromAxisAngle.M14 = 0.0f; - fromAxisAngle.M21 = (num6 - num2 * num6 - num1 * z); - fromAxisAngle.M22 = num4 + num2 * (1.0f - num4); - fromAxisAngle.M23 = (num8 - num2 * num8 + num1 * x); - fromAxisAngle.M24 = 0.0f; - fromAxisAngle.M31 = (num7 - num2 * num7 + num1 * y); - fromAxisAngle.M32 = (num8 - num2 * num8 - num1 * x); - fromAxisAngle.M33 = num5 + num2 * (1.0f - num5); - fromAxisAngle.M34 = 0.0f; - fromAxisAngle.M41 = 0.0f; - fromAxisAngle.M42 = 0.0f; - fromAxisAngle.M43 = 0.0f; - fromAxisAngle.M44 = 1.0f; - return fromAxisAngle; - } - - Matrix Matrix::CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance) { - if (fieldOfView <= 0.0 || fieldOfView >= MathHelper::PI || nearPlaneDistance <= 0.0 || farPlaneDistance <= 0.0 || nearPlaneDistance >= farPlaneDistance) { - return Matrix(); - } - - const auto num1 = static_cast(1.0 / tan(fieldOfView * 0.5)); - const auto num2 = num1 / aspectRatio; - - Matrix perspectiveFieldOfView; - perspectiveFieldOfView.M11 = num2; - perspectiveFieldOfView.M12 = perspectiveFieldOfView.M13 = perspectiveFieldOfView.M14 = 0.0f; - perspectiveFieldOfView.M22 = num1; - perspectiveFieldOfView.M21 = perspectiveFieldOfView.M23 = perspectiveFieldOfView.M24 = 0.0f; - perspectiveFieldOfView.M31 = perspectiveFieldOfView.M32 = 0.0f; - perspectiveFieldOfView.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance); - perspectiveFieldOfView.M34 = -1.0f; - perspectiveFieldOfView.M41 = perspectiveFieldOfView.M42 = perspectiveFieldOfView.M44 = 0.0f; - perspectiveFieldOfView.M43 = (nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance)); - return perspectiveFieldOfView; - } - - Matrix Matrix::CreateLookAt(Vector3 const& cameraPosition, Vector3 const& cameraTarget, Vector3 const& cameraUpVector) - { - Vector3 vector3_1 = Vector3::Normalize(cameraPosition - cameraTarget); - Vector3 vector3_2 = Vector3::Normalize(Vector3::Cross(cameraUpVector, vector3_1)); - Vector3 vector1 = Vector3::Cross(vector3_1, vector3_2); - - Matrix lookAt; - lookAt.M11 = vector3_2.X; - lookAt.M12 = vector1.X; - lookAt.M13 = vector3_1.X; - lookAt.M14 = 0.0f; - lookAt.M21 = vector3_2.Y; - lookAt.M22 = vector1.Y; - lookAt.M23 = vector3_1.Y; - lookAt.M24 = 0.0f; - lookAt.M31 = vector3_2.Z; - lookAt.M32 = vector1.Z; - lookAt.M33 = vector3_1.Z; - lookAt.M34 = 0.0f; - lookAt.M41 = -Vector3::Dot(vector3_2, cameraPosition); - lookAt.M42 = -Vector3::Dot(vector1, cameraPosition); - lookAt.M43 = -Vector3::Dot(vector3_1, cameraPosition); - lookAt.M44 = 1.0f; - return lookAt; - } - - Matrix Matrix::CreateWorld(Vector3 const& position, Vector3 const& forward, Vector3 const& up) - { - Vector3 vector3_1 = Vector3::Normalize(-forward); - Vector3 vector2 = Vector3::Normalize(Vector3::Cross(up, vector3_1)); - Vector3 vector3_2 = Vector3::Cross(vector3_1, vector2); - - Matrix world; - world.M11 = vector2.X; - world.M12 = vector2.Y; - world.M13 = vector2.Z; - world.M14 = 0.0f; - world.M21 = vector3_2.X; - world.M22 = vector3_2.Y; - world.M23 = vector3_2.Z; - world.M24 = 0.0f; - world.M31 = vector3_1.X; - world.M32 = vector3_1.Y; - world.M33 = vector3_1.Z; - world.M34 = 0.0f; - world.M41 = position.X; - world.M42 = position.Y; - world.M43 = position.Z; - world.M44 = 1.0f; - - return world; - } -} \ No newline at end of file diff --git a/framework/common/numerics.cpp b/framework/common/numerics.cpp index 512d38f..f0bd44c 100644 --- a/framework/common/numerics.cpp +++ b/framework/common/numerics.cpp @@ -1,6 +1,4 @@ #include "common/numerics.hpp" -#include "common/matrix.hpp" -#include "common/quaternion.hpp" namespace xna { bool Vector2::Transform(Vector2 const* sourceArray, size_t sourceArrayLength, Matrix const& matrix, Vector2* destinationArray, size_t destinationArrayLength) { @@ -493,5 +491,134 @@ namespace xna { destinationArray.resize(sourceArray.size()); return Transform(sourceArray.data(), sourceArray.size(), sourceIndex, rotation, destinationArray.data(), destinationArray.size(), destinationIndex, length); + } + + Quaternion Quaternion::CreateFromAxisAngle(Vector3 const& axis, float angle) { + const auto num1 = angle * 0.5f; + const auto num2 = std::sin(num1); + const auto num3 = std::cos(num1); + Quaternion fromAxisAngle; + fromAxisAngle.X = axis.X * num2; + fromAxisAngle.Y = axis.Y * num2; + fromAxisAngle.Z = axis.Z * num2; + fromAxisAngle.W = num3; + return fromAxisAngle; + } + + Quaternion Quaternion::CreateFromYawPitchRoll(float yaw, float pitch, float roll) { + const auto num1 = roll * 0.5f; + const auto num2 = std::sin(num1); + const auto num3 = std::cos(num1); + const auto num4 = pitch * 0.5f; + const auto num5 = std::sin(num4); + const auto num6 = std::cos(num4); + const auto num7 = yaw * 0.5f; + const auto num8 = std::sin(num7); + const auto num9 = std::cos(num7); + Quaternion fromYawPitchRoll; + fromYawPitchRoll.X = (num9 * num5 * num3 + num8 * num6 * num2); + fromYawPitchRoll.Y = (num8 * num6 * num3 - num9 * num5 * num2); + fromYawPitchRoll.Z = (num9 * num6 * num2 - num8 * num5 * num3); + fromYawPitchRoll.W = (num9 * num6 * num3 + num8 * num5 * num2); + return fromYawPitchRoll; + } + + Quaternion Quaternion::CreateFromRotationMatrix(Matrix const& matrix) { + const auto num1 = matrix.M11 + matrix.M22 + matrix.M33; + + Quaternion fromRotationMatrix; + if (num1 > 0.0) + { + const auto num2 = std::sqrt(num1 + 1.0F); + fromRotationMatrix.W = num2 * 0.5f; + const auto num3 = 0.5f / num2; + fromRotationMatrix.X = (matrix.M23 - matrix.M32) * num3; + fromRotationMatrix.Y = (matrix.M31 - matrix.M13) * num3; + fromRotationMatrix.Z = (matrix.M12 - matrix.M21) * num3; + } + else if (matrix.M11 >= matrix.M22 && matrix.M11 >= matrix.M33) + { + const auto num4 = std::sqrt(1.0F + matrix.M11 - matrix.M22 - matrix.M33); + const auto num5 = 0.5f / num4; + fromRotationMatrix.X = 0.5f * num4; + fromRotationMatrix.Y = (matrix.M12 + matrix.M21) * num5; + fromRotationMatrix.Z = (matrix.M13 + matrix.M31) * num5; + fromRotationMatrix.W = (matrix.M23 - matrix.M32) * num5; + } + else if (matrix.M22 > matrix.M33) + { + const auto num6 = std::sqrt(1.0F + matrix.M22 - matrix.M11 - matrix.M33); + const auto num7 = 0.5f / num6; + fromRotationMatrix.X = (matrix.M21 + matrix.M12) * num7; + fromRotationMatrix.Y = 0.5f * num6; + fromRotationMatrix.Z = (matrix.M32 + matrix.M23) * num7; + fromRotationMatrix.W = (matrix.M31 - matrix.M13) * num7; + } + else + { + const auto num8 = std::sqrt(1.0F + matrix.M33 - matrix.M11 - matrix.M22); + const auto num9 = 0.5f / num8; + fromRotationMatrix.X = (matrix.M31 + matrix.M13) * num9; + fromRotationMatrix.Y = (matrix.M32 + matrix.M23) * num9; + fromRotationMatrix.Z = 0.5f * num8; + fromRotationMatrix.W = (matrix.M12 - matrix.M21) * num9; + } + return fromRotationMatrix; + } + + Quaternion Quaternion::Slerp(Quaternion const& quaternion1, Quaternion const& quaternion2, float amount) { + const auto num1 = amount; + auto d = quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W; + bool flag = false; + + if (d < 0.0) { + flag = true; + d = -d; + } + + float num2 = 0; + float num3 = 0; + + if (d > 0.99999898672103882) { + num2 = 1.0f - num1; + num3 = flag ? -num1 : num1; + } + else { + const auto a = std::acos(d); + const auto num4 = 1.0F / std::sin(a); + num2 = std::sin((1.0F - num1) * a) * num4; + num3 = flag ? -std::sin(num1 * a) * num4 : std::sin(num1 * a) * num4; + } + Quaternion quaternion; + quaternion.X = num2 * quaternion1.X + num3 * quaternion2.X; + quaternion.Y = num2 * quaternion1.Y + num3 * quaternion2.Y; + quaternion.Z = num2 * quaternion1.Z + num3 * quaternion2.Z; + quaternion.W = num2 * quaternion1.W + num3 * quaternion2.W; + return quaternion; + } + + Quaternion Quaternion::Lerp(Quaternion const& quaternion1, Quaternion const& quaternion2, float amount) { + const auto num1 = amount; + const auto num2 = 1.0f - num1; + Quaternion quaternion; + + if (quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W >= 0.0) { + quaternion.X = num2 * quaternion1.X + num1 * quaternion2.X; + quaternion.Y = num2 * quaternion1.Y + num1 * quaternion2.Y; + quaternion.Z = num2 * quaternion1.Z + num1 * quaternion2.Z; + quaternion.W = num2 * quaternion1.W + num1 * quaternion2.W; + } + else { + quaternion.X = num2 * quaternion1.X - num1 * quaternion2.X; + quaternion.Y = num2 * quaternion1.Y - num1 * quaternion2.Y; + quaternion.Z = num2 * quaternion1.Z - num1 * quaternion2.Z; + quaternion.W = num2 * quaternion1.W - num1 * quaternion2.W; + } + const auto num3 = 1.0f / std::sqrt(quaternion.X * quaternion.X + quaternion.Y * quaternion.Y + quaternion.Z * quaternion.Z + quaternion.W * quaternion.W); + quaternion.X *= num3; + quaternion.Y *= num3; + quaternion.Z *= num3; + quaternion.W *= num3; + return quaternion; } } diff --git a/framework/common/quaternion.cpp b/framework/common/quaternion.cpp deleted file mode 100644 index 725d000..0000000 --- a/framework/common/quaternion.cpp +++ /dev/null @@ -1,133 +0,0 @@ -#include "common/quaternion.hpp" -#include "common/matrix.hpp" - -namespace xna { - Quaternion Quaternion::CreateFromAxisAngle(Vector3 const& axis, float angle) { - const auto num1 = angle * 0.5f; - const auto num2 = std::sin(num1); - const auto num3 = std::cos(num1); - Quaternion fromAxisAngle; - fromAxisAngle.X = axis.X * num2; - fromAxisAngle.Y = axis.Y * num2; - fromAxisAngle.Z = axis.Z * num2; - fromAxisAngle.W = num3; - return fromAxisAngle; - } - - Quaternion Quaternion::CreateFromYawPitchRoll(float yaw, float pitch, float roll) { - const auto num1 = roll * 0.5f; - const auto num2 = std::sin(num1); - const auto num3 = std::cos(num1); - const auto num4 = pitch * 0.5f; - const auto num5 = std::sin(num4); - const auto num6 = std::cos(num4); - const auto num7 = yaw * 0.5f; - const auto num8 = std::sin(num7); - const auto num9 = std::cos(num7); - Quaternion fromYawPitchRoll; - fromYawPitchRoll.X = (num9 * num5 * num3 + num8 * num6 * num2); - fromYawPitchRoll.Y = (num8 * num6 * num3 - num9 * num5 * num2); - fromYawPitchRoll.Z = (num9 * num6 * num2 - num8 * num5 * num3); - fromYawPitchRoll.W = (num9 * num6 * num3 + num8 * num5 * num2); - return fromYawPitchRoll; - } - - Quaternion Quaternion::CreateFromRotationMatrix(Matrix const& matrix) { - const auto num1 = matrix.M11 + matrix.M22 + matrix.M33; - - Quaternion fromRotationMatrix; - if (num1 > 0.0) - { - const auto num2 = std::sqrt(num1 + 1.0F); - fromRotationMatrix.W = num2 * 0.5f; - const auto num3 = 0.5f / num2; - fromRotationMatrix.X = (matrix.M23 - matrix.M32) * num3; - fromRotationMatrix.Y = (matrix.M31 - matrix.M13) * num3; - fromRotationMatrix.Z = (matrix.M12 - matrix.M21) * num3; - } - else if (matrix.M11 >= matrix.M22 && matrix.M11 >= matrix.M33) - { - const auto num4 = std::sqrt(1.0F + matrix.M11 - matrix.M22 - matrix.M33); - const auto num5 = 0.5f / num4; - fromRotationMatrix.X = 0.5f * num4; - fromRotationMatrix.Y = (matrix.M12 + matrix.M21) * num5; - fromRotationMatrix.Z = (matrix.M13 + matrix.M31) * num5; - fromRotationMatrix.W = (matrix.M23 - matrix.M32) * num5; - } - else if (matrix.M22 > matrix.M33) - { - const auto num6 = std::sqrt(1.0F + matrix.M22 - matrix.M11 - matrix.M33); - const auto num7 = 0.5f / num6; - fromRotationMatrix.X = (matrix.M21 + matrix.M12) * num7; - fromRotationMatrix.Y = 0.5f * num6; - fromRotationMatrix.Z = (matrix.M32 + matrix.M23) * num7; - fromRotationMatrix.W = (matrix.M31 - matrix.M13) * num7; - } - else - { - const auto num8 = std::sqrt(1.0F + matrix.M33 - matrix.M11 - matrix.M22); - const auto num9 = 0.5f / num8; - fromRotationMatrix.X = (matrix.M31 + matrix.M13) * num9; - fromRotationMatrix.Y = (matrix.M32 + matrix.M23) * num9; - fromRotationMatrix.Z = 0.5f * num8; - fromRotationMatrix.W = (matrix.M12 - matrix.M21) * num9; - } - return fromRotationMatrix; - } - - Quaternion Quaternion::Slerp(Quaternion const& quaternion1, Quaternion const& quaternion2, float amount) { - const auto num1 = amount; - auto d = quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W; - bool flag = false; - - if (d < 0.0) { - flag = true; - d = -d; - } - - float num2 = 0; - float num3 = 0; - - if (d > 0.99999898672103882) { - num2 = 1.0f - num1; - num3 = flag ? -num1 : num1; - } - else { - const auto a = std::acos(d); - const auto num4 = 1.0F / std::sin(a); - num2 = std::sin((1.0F - num1) * a) * num4; - num3 = flag ? -std::sin(num1 * a) * num4 : std::sin(num1 * a) * num4; - } - Quaternion quaternion; - quaternion.X = num2 * quaternion1.X + num3 * quaternion2.X; - quaternion.Y = num2 * quaternion1.Y + num3 * quaternion2.Y; - quaternion.Z = num2 * quaternion1.Z + num3 * quaternion2.Z; - quaternion.W = num2 * quaternion1.W + num3 * quaternion2.W; - return quaternion; - } - - Quaternion Quaternion::Lerp(Quaternion const& quaternion1, Quaternion const& quaternion2, float amount) { - const auto num1 = amount; - const auto num2 = 1.0f - num1; - Quaternion quaternion; - - if (quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W >= 0.0) { - quaternion.X = num2 * quaternion1.X + num1 * quaternion2.X; - quaternion.Y = num2 * quaternion1.Y + num1 * quaternion2.Y; - quaternion.Z = num2 * quaternion1.Z + num1 * quaternion2.Z; - quaternion.W = num2 * quaternion1.W + num1 * quaternion2.W; - } - else { - quaternion.X = num2 * quaternion1.X - num1 * quaternion2.X; - quaternion.Y = num2 * quaternion1.Y - num1 * quaternion2.Y; - quaternion.Z = num2 * quaternion1.Z - num1 * quaternion2.Z; - quaternion.W = num2 * quaternion1.W - num1 * quaternion2.W; - } - const auto num3 = 1.0f / std::sqrt(quaternion.X * quaternion.X + quaternion.Y * quaternion.Y + quaternion.Z * quaternion.Z + quaternion.W * quaternion.W); - quaternion.X *= num3; - quaternion.Y *= num3; - quaternion.Z *= num3; - quaternion.W *= num3; - return quaternion; - } -} \ No newline at end of file diff --git a/inc/common/collision.hpp b/inc/common/collision.hpp index 9d75f84..586e2bc 100644 --- a/inc/common/collision.hpp +++ b/inc/common/collision.hpp @@ -3,8 +3,6 @@ #include "default.hpp" #include "numerics.hpp" -#include "matrix.hpp" -#include "quaternion.hpp" #include "gjk.hpp" #include #include "math.hpp" diff --git a/inc/common/math.hpp b/inc/common/math.hpp index 46a9955..af36ec2 100644 --- a/inc/common/math.hpp +++ b/inc/common/math.hpp @@ -36,8 +36,22 @@ namespace xna { return Lerp(value1, value2, (num * num * (3.0F - 2.0F * num))); } - static float CatmullRom(float value1, float value2, float value3, float value4, float amount); - static float Hermite(float value1, float tangent1, float value2, float tangent2, float amount); + static constexpr float CatmullRom(float value1, float value2, float value3, float value4, float amount) { + const auto num1 = amount * amount; + const auto num2 = amount * num1; + return (0.5F * (2.0F * value2 + (-value1 + value3) * amount + (2.0F * value1 - 5.0F * value2 + 4.0F * value3 - value4) * num1 + (-value1 + 3.0F * value2 - 3.0F * value3 + value4) * num2)); + } + + static constexpr float Hermite(float value1, float tangent1, float value2, float tangent2, float amount) { + const auto num1 = amount; + const auto num2 = num1 * num1; + const auto num3 = num1 * num2; + const auto num4 = (2.0F * num3 - 3.0F * num2 + 1.0F); + const auto num5 = (-2.0F * num3 + 3.0F * num2); + const auto num6 = num3 - 2.0f * num2 + num1; + const auto num7 = num3 - num2; + return value1 * num4 + value2 * num5 + tangent1 * num6 + tangent2 * num7; + } }; } diff --git a/inc/common/matrix.hpp b/inc/common/matrix.hpp deleted file mode 100644 index 519a7af..0000000 --- a/inc/common/matrix.hpp +++ /dev/null @@ -1,669 +0,0 @@ -#ifndef XNA_COMMON_MATRIX_HPP -#define XNA_COMMON_MATRIX_HPP - -#include "../default.hpp" -#include "math.hpp" -#include "numerics.hpp" - -namespace xna { - struct Matrix { - float M11{ 0 }; - float M12{ 0 }; - float M13{ 0 }; - float M14{ 0 }; - float M21{ 0 }; - float M22{ 0 }; - float M23{ 0 }; - float M24{ 0 }; - float M31{ 0 }; - float M32{ 0 }; - float M33{ 0 }; - float M34{ 0 }; - float M41{ 0 }; - float M42{ 0 }; - float M43{ 0 }; - float M44{ 0 }; - - constexpr Matrix() = default; - - constexpr Matrix( - float M11, float M12, float M13, float M14, - float M21, float M22, float M23, float M24, - float M31, float M32, float M33, float M34, - float M41, float M42, float M43, float M44) : - M11(M11), M12(M12), M13(M13), M14(M14), - M21(M21), M22(M22), M23(M23), M24(M24), - M31(M31), M32(M32), M33(M33), M34(M34), - M41(M41), M42(M42), M43(M43), M44(M44) { } - - constexpr bool operator==(const Matrix& other) const { - return M11 == other.M11 && M12 == other.M12 && M13 == other.M13 && M14 == other.M14 - && M21 == other.M21 && M22 == other.M22 && M23 == other.M23 && M24 == other.M24 - && M31 == other.M31 && M32 == other.M32 && M33 == other.M33 && M34 == other.M34 - && M41 == other.M41 && M42 == other.M42 && M43 == other.M43 && M44 == other.M44; - } - - constexpr static Matrix Identity() { - return Matrix( - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f); - } - - constexpr Vector3 Up() const noexcept { return Vector3(M21, M22, M23); } - constexpr Vector3 Down() const noexcept { return Vector3(-M21, -M22, -M23); } - constexpr Vector3 Right() const noexcept { return Vector3(M11, M12, M13); } - constexpr Vector3 Left() const noexcept { return Vector3(-M11, -M12, -M13); } - constexpr Vector3 Forward() const noexcept { return Vector3(-M31, -M32, -M33); } - constexpr Vector3 Backward() const noexcept { return Vector3(M31, M32, M33); } - constexpr Vector3 Translation() const noexcept { return Vector3(M41, M42, M43); } - - constexpr void Up(Vector3 const& value) noexcept { - M21 = value.X; - M22 = value.Y; - M23 = value.Z; - } - - constexpr void Down(Vector3 const& value) noexcept { - M21 = -value.X; - M22 = -value.Y; - M23 = -value.Z; - } - - constexpr void Right(Vector3 const& value) noexcept { - M11 = value.X; - M12 = value.Y; - M13 = value.Z; - } - - constexpr void Left(Vector3 const& value) noexcept { - M11 = -value.X; - M12 = -value.Y; - M13 = -value.Z; - } - - constexpr void Forward(Vector3 const& value) noexcept { - M31 = -value.X; - M32 = -value.Y; - M33 = -value.Z; - } - - constexpr void Backward(Vector3 const& value) noexcept { - M31 = value.X; - M32 = value.Y; - M33 = value.Z; - } - - constexpr void Translation(Vector3 const& value) noexcept { - M41 = value.X; - M42 = value.Y; - M43 = value.Z; - } - - static Matrix CreateBillboard(Vector3 const& objectPosition, Vector3 const& cameraPosition, Vector3 const& cameraUpVector, Vector3* cameraForwardVector); - - static Matrix CreateConstrainedBillboard( - Vector3 const& objectPosition, - Vector3 const& cameraPosition, - Vector3 const& rotateAxis, - Vector3* cameraForwardVector, - Vector3* objectForwardVector); - - static constexpr Matrix CreateTranslation(Vector3 const& position) { - Matrix translation; - translation.M11 = 1.0f; - translation.M12 = 0.0f; - translation.M13 = 0.0f; - translation.M14 = 0.0f; - translation.M21 = 0.0f; - translation.M22 = 1.0f; - translation.M23 = 0.0f; - translation.M24 = 0.0f; - translation.M31 = 0.0f; - translation.M32 = 0.0f; - translation.M33 = 1.0f; - translation.M34 = 0.0f; - translation.M41 = position.X; - translation.M42 = position.Y; - translation.M43 = position.Z; - translation.M44 = 1.0f; - return translation; - } - - static constexpr Matrix CreateTranslation(float xPosition, float yPosition, float zPosition) { - Matrix translation; - translation.M11 = 1.0f; - translation.M12 = 0.0f; - translation.M13 = 0.0f; - translation.M14 = 0.0f; - translation.M21 = 0.0f; - translation.M22 = 1.0f; - translation.M23 = 0.0f; - translation.M24 = 0.0f; - translation.M31 = 0.0f; - translation.M32 = 0.0f; - translation.M33 = 1.0f; - translation.M34 = 0.0f; - translation.M41 = xPosition; - translation.M42 = yPosition; - translation.M43 = zPosition; - translation.M44 = 1.0f; - return translation; - } - - static constexpr Matrix CreateScale(float xScale, float yScale, float zScale) { - Matrix scale; - scale.M11 = xScale; - scale.M12 = 0.0f; - scale.M13 = 0.0f; - scale.M14 = 0.0f; - scale.M21 = 0.0f; - scale.M22 = yScale; - scale.M23 = 0.0f; - scale.M24 = 0.0f; - scale.M31 = 0.0f; - scale.M32 = 0.0f; - scale.M33 = zScale; - scale.M34 = 0.0f; - scale.M41 = 0.0f; - scale.M42 = 0.0f; - scale.M43 = 0.0f; - scale.M44 = 1.0f; - return scale; - } - - static constexpr Matrix CreateScale(Vector3 const& scales) { - Matrix scale; - scale.M11 = scales.X; - scale.M12 = 0.0f; - scale.M13 = 0.0f; - scale.M14 = 0.0f; - scale.M21 = 0.0f; - scale.M22 = scales.Y; - scale.M23 = 0.0f; - scale.M24 = 0.0f; - scale.M31 = 0.0f; - scale.M32 = 0.0f; - scale.M33 = scales.Z; - scale.M34 = 0.0f; - scale.M41 = 0.0f; - scale.M42 = 0.0f; - scale.M43 = 0.0f; - scale.M44 = 1.0f; - return scale; - } - - static constexpr Matrix CreateScale(float scale) { - Matrix scale1; - scale1.M11 = scale; - scale1.M12 = 0.0f; - scale1.M13 = 0.0f; - scale1.M14 = 0.0f; - scale1.M21 = 0.0f; - scale1.M22 = scale; - scale1.M23 = 0.0f; - scale1.M24 = 0.0f; - scale1.M31 = 0.0f; - scale1.M32 = 0.0f; - scale1.M33 = scale; - scale1.M34 = 0.0f; - scale1.M41 = 0.0f; - scale1.M42 = 0.0f; - scale1.M43 = 0.0f; - scale1.M44 = 1.0f; - return scale1; - } - - static Matrix CreateRotationX(float radians); - static Matrix CreateRotationY(float radians); - static Matrix CreateRotationZ(float radians); - static Matrix CreateFromAxisAngle(Vector3 const& axis, float angle); - static Matrix CreatePerspectiveFieldOfView( - float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance); - - static constexpr Matrix CreatePerspective( - float width, float height, float nearPlaneDistance, float farPlaneDistance) { - if (nearPlaneDistance <= 0.0 || farPlaneDistance <= 0.0 || nearPlaneDistance >= farPlaneDistance) { - return Matrix(); - } - - Matrix perspective; - perspective.M11 = 2.0f * nearPlaneDistance / width; - perspective.M12 = perspective.M13 = perspective.M14 = 0.0f; - perspective.M22 = 2.0f * nearPlaneDistance / height; - perspective.M21 = perspective.M23 = perspective.M24 = 0.0f; - perspective.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance); - perspective.M31 = perspective.M32 = 0.0f; - perspective.M34 = -1.0f; - perspective.M41 = perspective.M42 = perspective.M44 = 0.0f; - perspective.M43 = (nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance)); - return perspective; - } - - static constexpr Matrix CreatePerspectiveOffCenter( - float left, float right, float bottom, float top, - float nearPlaneDistance, float farPlaneDistance) { - if (nearPlaneDistance <= 0.0 || farPlaneDistance <= 0.0 || nearPlaneDistance >= farPlaneDistance) { - return Matrix(); - } - - Matrix perspectiveOffCenter; - perspectiveOffCenter.M11 = (2.0F * nearPlaneDistance / (right - left)); - perspectiveOffCenter.M12 = perspectiveOffCenter.M13 = perspectiveOffCenter.M14 = 0.0f; - perspectiveOffCenter.M22 = (2.0F * nearPlaneDistance / (top - bottom)); - perspectiveOffCenter.M21 = perspectiveOffCenter.M23 = perspectiveOffCenter.M24 = 0.0f; - perspectiveOffCenter.M31 = (left + right) / (right - left); - perspectiveOffCenter.M32 = (top + bottom) / (top - bottom); - perspectiveOffCenter.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance); - perspectiveOffCenter.M34 = -1.0f; - perspectiveOffCenter.M43 = (nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance)); - perspectiveOffCenter.M41 = perspectiveOffCenter.M42 = perspectiveOffCenter.M44 = 0.0f; - return perspectiveOffCenter; - } - - static constexpr Matrix CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane) { - Matrix orthographic; - orthographic.M11 = 2.0f / width; - orthographic.M12 = orthographic.M13 = orthographic.M14 = 0.0f; - orthographic.M22 = 2.0f / height; - orthographic.M21 = orthographic.M23 = orthographic.M24 = 0.0f; - orthographic.M33 = (1.0F / (zNearPlane - zFarPlane)); - orthographic.M31 = orthographic.M32 = orthographic.M34 = 0.0f; - orthographic.M41 = orthographic.M42 = 0.0f; - orthographic.M43 = zNearPlane / (zNearPlane - zFarPlane); - orthographic.M44 = 1.0f; - return orthographic; - } - - static constexpr Matrix CreateOrthographicOffCenter( - float left, float right, float bottom, float top, float zNearPlane, float zFarPlane) { - Matrix orthographicOffCenter; - orthographicOffCenter.M11 = (2.0F / (right - left)); - orthographicOffCenter.M12 = orthographicOffCenter.M13 = orthographicOffCenter.M14 = 0.0f; - orthographicOffCenter.M22 = (2.0F / (top - bottom)); - orthographicOffCenter.M21 = orthographicOffCenter.M23 = orthographicOffCenter.M24 = 0.0f; - orthographicOffCenter.M33 = (1.0F / (zNearPlane - zFarPlane)); - orthographicOffCenter.M31 = orthographicOffCenter.M32 = orthographicOffCenter.M34 = 0.0f; - orthographicOffCenter.M41 = ((left + right) / (left - right)); - orthographicOffCenter.M42 = ((top + bottom) / (bottom - top)); - orthographicOffCenter.M43 = zNearPlane / (zNearPlane - zFarPlane); - orthographicOffCenter.M44 = 1.0f; - return orthographicOffCenter; - } - - static Matrix CreateLookAt( - Vector3 const& cameraPosition, Vector3 const& cameraTarget, Vector3 const& cameraUpVector); - static Matrix CreateWorld( - Vector3 const& position, Vector3 const& forward, Vector3 const& up); - - static Matrix CreateFromQuaternion(Quaternion const& quaternion); - static Matrix CreateFromYawPitchRoll(float yaw, float pitch, float roll); - static Matrix CreateShadow(Vector3 lightDirection, Plane plane); - static Matrix CreateReflection(Plane value); - static Matrix Transform(Matrix value, Quaternion rotation); - static Matrix Transpose(Matrix matrix); - - constexpr float Determinant() const { - const auto num1 = (M33 * M44 - M34 * M43); - const auto num2 = (M32 * M44 - M34 * M42); - const auto num3 = (M32 * M43 - M33 * M42); - const auto num4 = (M31 * M44 - M34 * M41); - const auto num5 = (M31 * M43 - M33 * M41); - const auto num6 = (M31 * M42 - M32 * M41); - return - (M11 * (M22 * num1 - M23 * num2 + M24 * num3) - M12 - * (M21 * num1 - M23 * num4 + M24 * num5) + M13 - * (M21 * num2 - M22 * num4 + M24 * num6) - M14 - * (M21 * num3 - M22 * num5 + M23 * num6)); - } - - static constexpr Matrix Invert(Matrix const& matrix) { - const auto m11 = matrix.M11; - const auto m12 = matrix.M12; - const auto m13 = matrix.M13; - const auto m14 = matrix.M14; - const auto m21 = matrix.M21; - const auto m22 = matrix.M22; - const auto m23 = matrix.M23; - const auto m24 = matrix.M24; - const auto m31 = matrix.M31; - const auto m32 = matrix.M32; - const auto m33 = matrix.M33; - const auto m34 = matrix.M34; - const auto m41 = matrix.M41; - const auto m42 = matrix.M42; - const auto m43 = matrix.M43; - const auto m44 = matrix.M44; - - const auto num1 = (m33 * m44 - m34 * m43); - const auto num2 = (m32 * m44 - m34 * m42); - const auto num3 = (m32 * m43 - m33 * m42); - const auto num4 = (m31 * m44 - m34 * m41); - const auto num5 = (m31 * m43 - m33 * m41); - const auto num6 = (m31 * m42 - m32 * m41); - const auto num7 = (m22 * num1 - m23 * num2 + m24 * num3); - const auto num8 = -(m21 * num1 - m23 * num4 + m24 * num5); - const auto num9 = (m21 * num2 - m22 * num4 + m24 * num6); - const auto num10 = -(m21 * num3 - m22 * num5 + m23 * num6); - const auto num11 = (1.0F / (m11 * num7 + m12 * num8 + m13 * num9 + m14 * num10)); - - Matrix matrix1; - matrix1.M11 = num7 * num11; - matrix1.M21 = num8 * num11; - matrix1.M31 = num9 * num11; - matrix1.M41 = num10 * num11; - matrix1.M12 = -(m12 * num1 - m13 * num2 + m14 * num3) * num11; - matrix1.M22 = (m11 * num1 - m13 * num4 + m14 * num5) * num11; - matrix1.M32 = -(m11 * num2 - m12 * num4 + m14 * num6) * num11; - matrix1.M42 = (m11 * num3 - m12 * num5 + m13 * num6) * num11; - - const auto num12 = (m23 * m44 - m24 * m43); - const auto num13 = (m22 * m44 - m24 * m42); - const auto num14 = (m22 * m43 - m23 * m42); - const auto num15 = (m21 * m44 - m24 * m41); - const auto num16 = (m21 * m43 - m23 * m41); - const auto num17 = (m21 * m42 - m22 * m41); - - matrix1.M13 = (m12 * num12 - m13 * num13 + m14 * num14) * num11; - matrix1.M23 = -(m11 * num12 - m13 * num15 + m14 * num16) * num11; - matrix1.M33 = (m11 * num13 - m12 * num15 + m14 * num17) * num11; - matrix1.M43 = -(m11 * num14 - m12 * num16 + m13 * num17) * num11; - - const auto num18 = (m23 * m34 - m24 * m33); - const auto num19 = (m22 * m34 - m24 * m32); - const auto num20 = (m22 * m33 - m23 * m32); - const auto num21 = (m21 * m34 - m24 * m31); - const auto num22 = (m21 * m33 - m23 * m31); - const auto num23 = (m21 * m32 - m22 * m31); - - matrix1.M14 = -(m12 * num18 - m13 * num19 + m14 * num20) * num11; - matrix1.M24 = (m11 * num18 - m13 * num21 + m14 * num22) * num11; - matrix1.M34 = -(m11 * num19 - m12 * num21 + m14 * num23) * num11; - matrix1.M44 = (m11 * num20 - m12 * num22 + m13 * num23) * num11; - - return matrix1; - } - - static constexpr Matrix Lerp(Matrix const& matrix1, Matrix const& matrix2, float amount) { - Matrix matrix; - matrix.M11 = matrix1.M11 + (matrix2.M11 - matrix1.M11) * amount; - matrix.M12 = matrix1.M12 + (matrix2.M12 - matrix1.M12) * amount; - matrix.M13 = matrix1.M13 + (matrix2.M13 - matrix1.M13) * amount; - matrix.M14 = matrix1.M14 + (matrix2.M14 - matrix1.M14) * amount; - matrix.M21 = matrix1.M21 + (matrix2.M21 - matrix1.M21) * amount; - matrix.M22 = matrix1.M22 + (matrix2.M22 - matrix1.M22) * amount; - matrix.M23 = matrix1.M23 + (matrix2.M23 - matrix1.M23) * amount; - matrix.M24 = matrix1.M24 + (matrix2.M24 - matrix1.M24) * amount; - matrix.M31 = matrix1.M31 + (matrix2.M31 - matrix1.M31) * amount; - matrix.M32 = matrix1.M32 + (matrix2.M32 - matrix1.M32) * amount; - matrix.M33 = matrix1.M33 + (matrix2.M33 - matrix1.M33) * amount; - matrix.M34 = matrix1.M34 + (matrix2.M34 - matrix1.M34) * amount; - matrix.M41 = matrix1.M41 + (matrix2.M41 - matrix1.M41) * amount; - matrix.M42 = matrix1.M42 + (matrix2.M42 - matrix1.M42) * amount; - matrix.M43 = matrix1.M43 + (matrix2.M43 - matrix1.M43) * amount; - matrix.M44 = matrix1.M44 + (matrix2.M44 - matrix1.M44) * amount; - return matrix; - } - - static constexpr Matrix Negate(Matrix const& matrix) { - Matrix matrix1; - matrix1.M11 = -matrix.M11; - matrix1.M12 = -matrix.M12; - matrix1.M13 = -matrix.M13; - matrix1.M14 = -matrix.M14; - matrix1.M21 = -matrix.M21; - matrix1.M22 = -matrix.M22; - matrix1.M23 = -matrix.M23; - matrix1.M24 = -matrix.M24; - matrix1.M31 = -matrix.M31; - matrix1.M32 = -matrix.M32; - matrix1.M33 = -matrix.M33; - matrix1.M34 = -matrix.M34; - matrix1.M41 = -matrix.M41; - matrix1.M42 = -matrix.M42; - matrix1.M43 = -matrix.M43; - matrix1.M44 = -matrix.M44; - return matrix1; - } - - static constexpr Matrix Add(Matrix const& matrix1, Matrix const& matrix2) { - Matrix matrix; - matrix.M11 = matrix1.M11 + matrix2.M11; - matrix.M12 = matrix1.M12 + matrix2.M12; - matrix.M13 = matrix1.M13 + matrix2.M13; - matrix.M14 = matrix1.M14 + matrix2.M14; - matrix.M21 = matrix1.M21 + matrix2.M21; - matrix.M22 = matrix1.M22 + matrix2.M22; - matrix.M23 = matrix1.M23 + matrix2.M23; - matrix.M24 = matrix1.M24 + matrix2.M24; - matrix.M31 = matrix1.M31 + matrix2.M31; - matrix.M32 = matrix1.M32 + matrix2.M32; - matrix.M33 = matrix1.M33 + matrix2.M33; - matrix.M34 = matrix1.M34 + matrix2.M34; - matrix.M41 = matrix1.M41 + matrix2.M41; - matrix.M42 = matrix1.M42 + matrix2.M42; - matrix.M43 = matrix1.M43 + matrix2.M43; - matrix.M44 = matrix1.M44 + matrix2.M44; - return matrix; - } - - static constexpr Matrix Subtract(Matrix const& matrix1, Matrix const& matrix2) { - Matrix matrix; - matrix.M11 = matrix1.M11 - matrix2.M11; - matrix.M12 = matrix1.M12 - matrix2.M12; - matrix.M13 = matrix1.M13 - matrix2.M13; - matrix.M14 = matrix1.M14 - matrix2.M14; - matrix.M21 = matrix1.M21 - matrix2.M21; - matrix.M22 = matrix1.M22 - matrix2.M22; - matrix.M23 = matrix1.M23 - matrix2.M23; - matrix.M24 = matrix1.M24 - matrix2.M24; - matrix.M31 = matrix1.M31 - matrix2.M31; - matrix.M32 = matrix1.M32 - matrix2.M32; - matrix.M33 = matrix1.M33 - matrix2.M33; - matrix.M34 = matrix1.M34 - matrix2.M34; - matrix.M41 = matrix1.M41 - matrix2.M41; - matrix.M42 = matrix1.M42 - matrix2.M42; - matrix.M43 = matrix1.M43 - matrix2.M43; - matrix.M44 = matrix1.M44 - matrix2.M44; - return matrix; - } - - static constexpr Matrix Multiply(Matrix const& matrix1, Matrix const& matrix2) { - Matrix matrix; - matrix.M11 = (matrix1.M11 * matrix2.M11 + matrix1.M12 * matrix2.M21 + matrix1.M13 * matrix2.M31 + matrix1.M14 * matrix2.M41); - matrix.M12 = (matrix1.M11 * matrix2.M12 + matrix1.M12 * matrix2.M22 + matrix1.M13 * matrix2.M32 + matrix1.M14 * matrix2.M42); - matrix.M13 = (matrix1.M11 * matrix2.M13 + matrix1.M12 * matrix2.M23 + matrix1.M13 * matrix2.M33 + matrix1.M14 * matrix2.M43); - matrix.M14 = (matrix1.M11 * matrix2.M14 + matrix1.M12 * matrix2.M24 + matrix1.M13 * matrix2.M34 + matrix1.M14 * matrix2.M44); - matrix.M21 = (matrix1.M21 * matrix2.M11 + matrix1.M22 * matrix2.M21 + matrix1.M23 * matrix2.M31 + matrix1.M24 * matrix2.M41); - matrix.M22 = (matrix1.M21 * matrix2.M12 + matrix1.M22 * matrix2.M22 + matrix1.M23 * matrix2.M32 + matrix1.M24 * matrix2.M42); - matrix.M23 = (matrix1.M21 * matrix2.M13 + matrix1.M22 * matrix2.M23 + matrix1.M23 * matrix2.M33 + matrix1.M24 * matrix2.M43); - matrix.M24 = (matrix1.M21 * matrix2.M14 + matrix1.M22 * matrix2.M24 + matrix1.M23 * matrix2.M34 + matrix1.M24 * matrix2.M44); - matrix.M31 = (matrix1.M31 * matrix2.M11 + matrix1.M32 * matrix2.M21 + matrix1.M33 * matrix2.M31 + matrix1.M34 * matrix2.M41); - matrix.M32 = (matrix1.M31 * matrix2.M12 + matrix1.M32 * matrix2.M22 + matrix1.M33 * matrix2.M32 + matrix1.M34 * matrix2.M42); - matrix.M33 = (matrix1.M31 * matrix2.M13 + matrix1.M32 * matrix2.M23 + matrix1.M33 * matrix2.M33 + matrix1.M34 * matrix2.M43); - matrix.M34 = (matrix1.M31 * matrix2.M14 + matrix1.M32 * matrix2.M24 + matrix1.M33 * matrix2.M34 + matrix1.M34 * matrix2.M44); - matrix.M41 = (matrix1.M41 * matrix2.M11 + matrix1.M42 * matrix2.M21 + matrix1.M43 * matrix2.M31 + matrix1.M44 * matrix2.M41); - matrix.M42 = (matrix1.M41 * matrix2.M12 + matrix1.M42 * matrix2.M22 + matrix1.M43 * matrix2.M32 + matrix1.M44 * matrix2.M42); - matrix.M43 = (matrix1.M41 * matrix2.M13 + matrix1.M42 * matrix2.M23 + matrix1.M43 * matrix2.M33 + matrix1.M44 * matrix2.M43); - matrix.M44 = (matrix1.M41 * matrix2.M14 + matrix1.M42 * matrix2.M24 + matrix1.M43 * matrix2.M34 + matrix1.M44 * matrix2.M44); - return matrix; - } - - static constexpr Matrix Multiply(Matrix const& matrix1, float scaleFactor) { - float num = scaleFactor; - Matrix matrix; - matrix.M11 = matrix1.M11 * num; - matrix.M12 = matrix1.M12 * num; - matrix.M13 = matrix1.M13 * num; - matrix.M14 = matrix1.M14 * num; - matrix.M21 = matrix1.M21 * num; - matrix.M22 = matrix1.M22 * num; - matrix.M23 = matrix1.M23 * num; - matrix.M24 = matrix1.M24 * num; - matrix.M31 = matrix1.M31 * num; - matrix.M32 = matrix1.M32 * num; - matrix.M33 = matrix1.M33 * num; - matrix.M34 = matrix1.M34 * num; - matrix.M41 = matrix1.M41 * num; - matrix.M42 = matrix1.M42 * num; - matrix.M43 = matrix1.M43 * num; - matrix.M44 = matrix1.M44 * num; - return matrix; - } - - static constexpr Matrix Divide(Matrix const& matrix1, Matrix const& matrix2) { - Matrix matrix; - matrix.M11 = matrix1.M11 / matrix2.M11; - matrix.M12 = matrix1.M12 / matrix2.M12; - matrix.M13 = matrix1.M13 / matrix2.M13; - matrix.M14 = matrix1.M14 / matrix2.M14; - matrix.M21 = matrix1.M21 / matrix2.M21; - matrix.M22 = matrix1.M22 / matrix2.M22; - matrix.M23 = matrix1.M23 / matrix2.M23; - matrix.M24 = matrix1.M24 / matrix2.M24; - matrix.M31 = matrix1.M31 / matrix2.M31; - matrix.M32 = matrix1.M32 / matrix2.M32; - matrix.M33 = matrix1.M33 / matrix2.M33; - matrix.M34 = matrix1.M34 / matrix2.M34; - matrix.M41 = matrix1.M41 / matrix2.M41; - matrix.M42 = matrix1.M42 / matrix2.M42; - matrix.M43 = matrix1.M43 / matrix2.M43; - matrix.M44 = matrix1.M44 / matrix2.M44; - return matrix; - } - - static constexpr Matrix Divide(Matrix const& matrix1, float divider) { - float num = 1.0f / divider; - Matrix matrix; - matrix.M11 = matrix1.M11 * num; - matrix.M12 = matrix1.M12 * num; - matrix.M13 = matrix1.M13 * num; - matrix.M14 = matrix1.M14 * num; - matrix.M21 = matrix1.M21 * num; - matrix.M22 = matrix1.M22 * num; - matrix.M23 = matrix1.M23 * num; - matrix.M24 = matrix1.M24 * num; - matrix.M31 = matrix1.M31 * num; - matrix.M32 = matrix1.M32 * num; - matrix.M33 = matrix1.M33 * num; - matrix.M34 = matrix1.M34 * num; - matrix.M41 = matrix1.M41 * num; - matrix.M42 = matrix1.M42 * num; - matrix.M43 = matrix1.M43 * num; - matrix.M44 = matrix1.M44 * num; - return matrix; - } - - constexpr Matrix operator-() const { - return Matrix::Negate(*this); - } - - friend constexpr Matrix operator+(Matrix const& matrix1, Matrix const& matrix2) { - return Matrix::Add(matrix1, matrix2); - } - - friend constexpr Matrix operator-(Matrix const& matrix1, Matrix const& matrix2) { - return Matrix::Subtract(matrix1, matrix2); - } - - friend constexpr Matrix operator*(Matrix const& matrix1, Matrix const& matrix2) { - return Matrix::Multiply(matrix1, matrix2); - } - - friend constexpr Matrix operator*(Matrix const& matrix, float factor) { - return Matrix::Multiply(matrix, factor); - } - - friend constexpr Matrix operator*(float factor, Matrix const& matrix) { - return Matrix::Multiply(matrix, factor); - } - - friend constexpr Matrix operator/(Matrix const& matrix1, Matrix const& matrix2) { - return Matrix::Divide(matrix1, matrix2); - } - - friend constexpr Matrix operator/(Matrix const& matrix, float divider) { - return Matrix::Divide(matrix, divider); - } - }; - - constexpr Vector2 Vector2::Transform(Vector2 const& position, Matrix const& matrix) { - const auto posx = (position.X * matrix.M11 + position.Y * matrix.M21) + matrix.M41; - const auto posy = (position.X * matrix.M12 + position.Y * matrix.M22) + matrix.M42; - - return{ posx, posy }; - } - - constexpr Vector2 Vector2::TransformNormal(Vector2 const& normal, Matrix const& matrix) { - const auto posx = normal.X * matrix.M11 + normal.Y * matrix.M21; - const auto posy = normal.X * matrix.M12 + normal.Y * matrix.M22; - return { posx, posy }; - } - - constexpr Vector3 Vector3::Transform(Vector3 const& position, Matrix const& matrix) { - const auto num1 = (position.X * matrix.M11 + position.Y * matrix.M21 + position.Z * matrix.M31) + matrix.M41; - const auto num2 = (position.X * matrix.M12 + position.Y * matrix.M22 + position.Z * matrix.M32) + matrix.M42; - const auto num3 = (position.X * matrix.M13 + position.Y * matrix.M23 + position.Z * matrix.M33) + matrix.M43; - Vector3 vector3; - vector3.X = num1; - vector3.Y = num2; - vector3.Z = num3; - return vector3; - } - - constexpr Vector3 Vector3::TransformNormal(Vector3 const& normal, Matrix const& matrix) - { - const auto num1 = normal.X * matrix.M11 + normal.Y * matrix.M21 + normal.Z * matrix.M31; - const auto num2 = normal.X * matrix.M12 + normal.Y * matrix.M22 + normal.Z * matrix.M32; - const auto num3 = normal.X * matrix.M13 + normal.Y * matrix.M23 + normal.Z * matrix.M33; - Vector3 vector3; - vector3.X = num1; - vector3.Y = num2; - vector3.Z = num3; - return vector3; - } - - constexpr Vector4 Vector4::Transform(Vector2 const& position, Matrix const& matrix) - { - const auto num1 = (position.X * matrix.M11 + position.Y * matrix.M21) + matrix.M41; - const auto num2 = (position.X * matrix.M12 + position.Y * matrix.M22) + matrix.M42; - const auto num3 = (position.X * matrix.M13 + position.Y * matrix.M23) + matrix.M43; - const auto num4 = (position.X * matrix.M14 + position.Y * matrix.M24) + matrix.M44; - Vector4 vector4; - vector4.X = num1; - vector4.Y = num2; - vector4.Z = num3; - vector4.W = num4; - return vector4; - } - - constexpr Vector4 Vector4::Transform(Vector3 const& position, Matrix const& matrix) - { - const auto num1 = (position.X * matrix.M11 + position.Y * matrix.M21 + position.Z * matrix.M31) + matrix.M41; - const auto num2 = (position.X * matrix.M12 + position.Y * matrix.M22 + position.Z * matrix.M32) + matrix.M42; - const auto num3 = (position.X * matrix.M13 + position.Y * matrix.M23 + position.Z * matrix.M33) + matrix.M43; - const auto num4 = (position.X * matrix.M14 + position.Y * matrix.M24 + position.Z * matrix.M34) + matrix.M44; - Vector4 vector4; - vector4.X = num1; - vector4.Y = num2; - vector4.Z = num3; - vector4.W = num4; - return vector4; - } - - constexpr Vector4 Vector4::Transform(Vector4 const& vector, Matrix const& matrix) { - const auto num1 = (vector.X * matrix.M11 + vector.Y * matrix.M21 + vector.Z * matrix.M31 + vector.W * matrix.M41); - const auto num2 = (vector.X * matrix.M12 + vector.Y * matrix.M22 + vector.Z * matrix.M32 + vector.W * matrix.M42); - const auto num3 = (vector.X * matrix.M13 + vector.Y * matrix.M23 + vector.Z * matrix.M33 + vector.W * matrix.M43); - const auto num4 = (vector.X * matrix.M14 + vector.Y * matrix.M24 + vector.Z * matrix.M34 + vector.W * matrix.M44); - Vector4 vector4; - vector4.X = num1; - vector4.Y = num2; - vector4.Z = num3; - vector4.W = num4; - return vector4; - } -} - -#endif \ No newline at end of file diff --git a/inc/common/numerics.hpp b/inc/common/numerics.hpp index cd69b4b..8af7812 100644 --- a/inc/common/numerics.hpp +++ b/inc/common/numerics.hpp @@ -905,6 +905,959 @@ namespace xna { return Vector4::Divide(value, divider); } }; + + struct Matrix { + float M11{ 0 }; + float M12{ 0 }; + float M13{ 0 }; + float M14{ 0 }; + float M21{ 0 }; + float M22{ 0 }; + float M23{ 0 }; + float M24{ 0 }; + float M31{ 0 }; + float M32{ 0 }; + float M33{ 0 }; + float M34{ 0 }; + float M41{ 0 }; + float M42{ 0 }; + float M43{ 0 }; + float M44{ 0 }; + + constexpr Matrix() = default; + + constexpr Matrix( + float M11, float M12, float M13, float M14, + float M21, float M22, float M23, float M24, + float M31, float M32, float M33, float M34, + float M41, float M42, float M43, float M44) : + M11(M11), M12(M12), M13(M13), M14(M14), + M21(M21), M22(M22), M23(M23), M24(M24), + M31(M31), M32(M32), M33(M33), M34(M34), + M41(M41), M42(M42), M43(M43), M44(M44) { } + + constexpr bool operator==(const Matrix& other) const { + return M11 == other.M11 && M12 == other.M12 && M13 == other.M13 && M14 == other.M14 + && M21 == other.M21 && M22 == other.M22 && M23 == other.M23 && M24 == other.M24 + && M31 == other.M31 && M32 == other.M32 && M33 == other.M33 && M34 == other.M34 + && M41 == other.M41 && M42 == other.M42 && M43 == other.M43 && M44 == other.M44; + } + + constexpr static Matrix Identity() { + return Matrix( + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f); + } + + constexpr Vector3 Up() const noexcept { return Vector3(M21, M22, M23); } + constexpr Vector3 Down() const noexcept { return Vector3(-M21, -M22, -M23); } + constexpr Vector3 Right() const noexcept { return Vector3(M11, M12, M13); } + constexpr Vector3 Left() const noexcept { return Vector3(-M11, -M12, -M13); } + constexpr Vector3 Forward() const noexcept { return Vector3(-M31, -M32, -M33); } + constexpr Vector3 Backward() const noexcept { return Vector3(M31, M32, M33); } + constexpr Vector3 Translation() const noexcept { return Vector3(M41, M42, M43); } + + constexpr void Up(Vector3 const& value) noexcept { + M21 = value.X; + M22 = value.Y; + M23 = value.Z; + } + + constexpr void Down(Vector3 const& value) noexcept { + M21 = -value.X; + M22 = -value.Y; + M23 = -value.Z; + } + + constexpr void Right(Vector3 const& value) noexcept { + M11 = value.X; + M12 = value.Y; + M13 = value.Z; + } + + constexpr void Left(Vector3 const& value) noexcept { + M11 = -value.X; + M12 = -value.Y; + M13 = -value.Z; + } + + constexpr void Forward(Vector3 const& value) noexcept { + M31 = -value.X; + M32 = -value.Y; + M33 = -value.Z; + } + + constexpr void Backward(Vector3 const& value) noexcept { + M31 = value.X; + M32 = value.Y; + M33 = value.Z; + } + + constexpr void Translation(Vector3 const& value) noexcept { + M41 = value.X; + M42 = value.Y; + M43 = value.Z; + } + + static Matrix CreateBillboard(Vector3 const& objectPosition, Vector3 const& cameraPosition, Vector3 const& cameraUpVector, Vector3* cameraForwardVector); + + static Matrix CreateConstrainedBillboard( + Vector3 const& objectPosition, + Vector3 const& cameraPosition, + Vector3 const& rotateAxis, + Vector3* cameraForwardVector, + Vector3* objectForwardVector); + + static constexpr Matrix CreateTranslation(Vector3 const& position) { + Matrix translation; + translation.M11 = 1.0f; + translation.M12 = 0.0f; + translation.M13 = 0.0f; + translation.M14 = 0.0f; + translation.M21 = 0.0f; + translation.M22 = 1.0f; + translation.M23 = 0.0f; + translation.M24 = 0.0f; + translation.M31 = 0.0f; + translation.M32 = 0.0f; + translation.M33 = 1.0f; + translation.M34 = 0.0f; + translation.M41 = position.X; + translation.M42 = position.Y; + translation.M43 = position.Z; + translation.M44 = 1.0f; + return translation; + } + + static constexpr Matrix CreateTranslation(float xPosition, float yPosition, float zPosition) { + Matrix translation; + translation.M11 = 1.0f; + translation.M12 = 0.0f; + translation.M13 = 0.0f; + translation.M14 = 0.0f; + translation.M21 = 0.0f; + translation.M22 = 1.0f; + translation.M23 = 0.0f; + translation.M24 = 0.0f; + translation.M31 = 0.0f; + translation.M32 = 0.0f; + translation.M33 = 1.0f; + translation.M34 = 0.0f; + translation.M41 = xPosition; + translation.M42 = yPosition; + translation.M43 = zPosition; + translation.M44 = 1.0f; + return translation; + } + + static constexpr Matrix CreateScale(float xScale, float yScale, float zScale) { + Matrix scale; + scale.M11 = xScale; + scale.M12 = 0.0f; + scale.M13 = 0.0f; + scale.M14 = 0.0f; + scale.M21 = 0.0f; + scale.M22 = yScale; + scale.M23 = 0.0f; + scale.M24 = 0.0f; + scale.M31 = 0.0f; + scale.M32 = 0.0f; + scale.M33 = zScale; + scale.M34 = 0.0f; + scale.M41 = 0.0f; + scale.M42 = 0.0f; + scale.M43 = 0.0f; + scale.M44 = 1.0f; + return scale; + } + + static constexpr Matrix CreateScale(Vector3 const& scales) { + Matrix scale; + scale.M11 = scales.X; + scale.M12 = 0.0f; + scale.M13 = 0.0f; + scale.M14 = 0.0f; + scale.M21 = 0.0f; + scale.M22 = scales.Y; + scale.M23 = 0.0f; + scale.M24 = 0.0f; + scale.M31 = 0.0f; + scale.M32 = 0.0f; + scale.M33 = scales.Z; + scale.M34 = 0.0f; + scale.M41 = 0.0f; + scale.M42 = 0.0f; + scale.M43 = 0.0f; + scale.M44 = 1.0f; + return scale; + } + + static constexpr Matrix CreateScale(float scale) { + Matrix scale1; + scale1.M11 = scale; + scale1.M12 = 0.0f; + scale1.M13 = 0.0f; + scale1.M14 = 0.0f; + scale1.M21 = 0.0f; + scale1.M22 = scale; + scale1.M23 = 0.0f; + scale1.M24 = 0.0f; + scale1.M31 = 0.0f; + scale1.M32 = 0.0f; + scale1.M33 = scale; + scale1.M34 = 0.0f; + scale1.M41 = 0.0f; + scale1.M42 = 0.0f; + scale1.M43 = 0.0f; + scale1.M44 = 1.0f; + return scale1; + } + + static Matrix CreateRotationX(float radians); + static Matrix CreateRotationY(float radians); + static Matrix CreateRotationZ(float radians); + static Matrix CreateFromAxisAngle(Vector3 const& axis, float angle); + static Matrix CreatePerspectiveFieldOfView( + float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance); + + static constexpr Matrix CreatePerspective( + float width, float height, float nearPlaneDistance, float farPlaneDistance) { + if (nearPlaneDistance <= 0.0 || farPlaneDistance <= 0.0 || nearPlaneDistance >= farPlaneDistance) { + return Matrix(); + } + + Matrix perspective; + perspective.M11 = 2.0f * nearPlaneDistance / width; + perspective.M12 = perspective.M13 = perspective.M14 = 0.0f; + perspective.M22 = 2.0f * nearPlaneDistance / height; + perspective.M21 = perspective.M23 = perspective.M24 = 0.0f; + perspective.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance); + perspective.M31 = perspective.M32 = 0.0f; + perspective.M34 = -1.0f; + perspective.M41 = perspective.M42 = perspective.M44 = 0.0f; + perspective.M43 = (nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance)); + return perspective; + } + + static constexpr Matrix CreatePerspectiveOffCenter( + float left, float right, float bottom, float top, + float nearPlaneDistance, float farPlaneDistance) { + if (nearPlaneDistance <= 0.0 || farPlaneDistance <= 0.0 || nearPlaneDistance >= farPlaneDistance) { + return Matrix(); + } + + Matrix perspectiveOffCenter; + perspectiveOffCenter.M11 = (2.0F * nearPlaneDistance / (right - left)); + perspectiveOffCenter.M12 = perspectiveOffCenter.M13 = perspectiveOffCenter.M14 = 0.0f; + perspectiveOffCenter.M22 = (2.0F * nearPlaneDistance / (top - bottom)); + perspectiveOffCenter.M21 = perspectiveOffCenter.M23 = perspectiveOffCenter.M24 = 0.0f; + perspectiveOffCenter.M31 = (left + right) / (right - left); + perspectiveOffCenter.M32 = (top + bottom) / (top - bottom); + perspectiveOffCenter.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance); + perspectiveOffCenter.M34 = -1.0f; + perspectiveOffCenter.M43 = (nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance)); + perspectiveOffCenter.M41 = perspectiveOffCenter.M42 = perspectiveOffCenter.M44 = 0.0f; + return perspectiveOffCenter; + } + + static constexpr Matrix CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane) { + Matrix orthographic; + orthographic.M11 = 2.0f / width; + orthographic.M12 = orthographic.M13 = orthographic.M14 = 0.0f; + orthographic.M22 = 2.0f / height; + orthographic.M21 = orthographic.M23 = orthographic.M24 = 0.0f; + orthographic.M33 = (1.0F / (zNearPlane - zFarPlane)); + orthographic.M31 = orthographic.M32 = orthographic.M34 = 0.0f; + orthographic.M41 = orthographic.M42 = 0.0f; + orthographic.M43 = zNearPlane / (zNearPlane - zFarPlane); + orthographic.M44 = 1.0f; + return orthographic; + } + + static constexpr Matrix CreateOrthographicOffCenter( + float left, float right, float bottom, float top, float zNearPlane, float zFarPlane) { + Matrix orthographicOffCenter; + orthographicOffCenter.M11 = (2.0F / (right - left)); + orthographicOffCenter.M12 = orthographicOffCenter.M13 = orthographicOffCenter.M14 = 0.0f; + orthographicOffCenter.M22 = (2.0F / (top - bottom)); + orthographicOffCenter.M21 = orthographicOffCenter.M23 = orthographicOffCenter.M24 = 0.0f; + orthographicOffCenter.M33 = (1.0F / (zNearPlane - zFarPlane)); + orthographicOffCenter.M31 = orthographicOffCenter.M32 = orthographicOffCenter.M34 = 0.0f; + orthographicOffCenter.M41 = ((left + right) / (left - right)); + orthographicOffCenter.M42 = ((top + bottom) / (bottom - top)); + orthographicOffCenter.M43 = zNearPlane / (zNearPlane - zFarPlane); + orthographicOffCenter.M44 = 1.0f; + return orthographicOffCenter; + } + + static Matrix CreateLookAt( + Vector3 const& cameraPosition, Vector3 const& cameraTarget, Vector3 const& cameraUpVector); + static Matrix CreateWorld( + Vector3 const& position, Vector3 const& forward, Vector3 const& up); + + static Matrix CreateFromQuaternion(Quaternion const& quaternion); + static Matrix CreateFromYawPitchRoll(float yaw, float pitch, float roll); + static Matrix CreateShadow(Vector3 lightDirection, Plane plane); + static Matrix CreateReflection(Plane value); + static Matrix Transform(Matrix value, Quaternion rotation); + static Matrix Transpose(Matrix matrix); + + constexpr float Determinant() const { + const auto num1 = (M33 * M44 - M34 * M43); + const auto num2 = (M32 * M44 - M34 * M42); + const auto num3 = (M32 * M43 - M33 * M42); + const auto num4 = (M31 * M44 - M34 * M41); + const auto num5 = (M31 * M43 - M33 * M41); + const auto num6 = (M31 * M42 - M32 * M41); + return + (M11 * (M22 * num1 - M23 * num2 + M24 * num3) - M12 + * (M21 * num1 - M23 * num4 + M24 * num5) + M13 + * (M21 * num2 - M22 * num4 + M24 * num6) - M14 + * (M21 * num3 - M22 * num5 + M23 * num6)); + } + + static constexpr Matrix Invert(Matrix const& matrix) { + const auto m11 = matrix.M11; + const auto m12 = matrix.M12; + const auto m13 = matrix.M13; + const auto m14 = matrix.M14; + const auto m21 = matrix.M21; + const auto m22 = matrix.M22; + const auto m23 = matrix.M23; + const auto m24 = matrix.M24; + const auto m31 = matrix.M31; + const auto m32 = matrix.M32; + const auto m33 = matrix.M33; + const auto m34 = matrix.M34; + const auto m41 = matrix.M41; + const auto m42 = matrix.M42; + const auto m43 = matrix.M43; + const auto m44 = matrix.M44; + + const auto num1 = (m33 * m44 - m34 * m43); + const auto num2 = (m32 * m44 - m34 * m42); + const auto num3 = (m32 * m43 - m33 * m42); + const auto num4 = (m31 * m44 - m34 * m41); + const auto num5 = (m31 * m43 - m33 * m41); + const auto num6 = (m31 * m42 - m32 * m41); + const auto num7 = (m22 * num1 - m23 * num2 + m24 * num3); + const auto num8 = -(m21 * num1 - m23 * num4 + m24 * num5); + const auto num9 = (m21 * num2 - m22 * num4 + m24 * num6); + const auto num10 = -(m21 * num3 - m22 * num5 + m23 * num6); + const auto num11 = (1.0F / (m11 * num7 + m12 * num8 + m13 * num9 + m14 * num10)); + + Matrix matrix1; + matrix1.M11 = num7 * num11; + matrix1.M21 = num8 * num11; + matrix1.M31 = num9 * num11; + matrix1.M41 = num10 * num11; + matrix1.M12 = -(m12 * num1 - m13 * num2 + m14 * num3) * num11; + matrix1.M22 = (m11 * num1 - m13 * num4 + m14 * num5) * num11; + matrix1.M32 = -(m11 * num2 - m12 * num4 + m14 * num6) * num11; + matrix1.M42 = (m11 * num3 - m12 * num5 + m13 * num6) * num11; + + const auto num12 = (m23 * m44 - m24 * m43); + const auto num13 = (m22 * m44 - m24 * m42); + const auto num14 = (m22 * m43 - m23 * m42); + const auto num15 = (m21 * m44 - m24 * m41); + const auto num16 = (m21 * m43 - m23 * m41); + const auto num17 = (m21 * m42 - m22 * m41); + + matrix1.M13 = (m12 * num12 - m13 * num13 + m14 * num14) * num11; + matrix1.M23 = -(m11 * num12 - m13 * num15 + m14 * num16) * num11; + matrix1.M33 = (m11 * num13 - m12 * num15 + m14 * num17) * num11; + matrix1.M43 = -(m11 * num14 - m12 * num16 + m13 * num17) * num11; + + const auto num18 = (m23 * m34 - m24 * m33); + const auto num19 = (m22 * m34 - m24 * m32); + const auto num20 = (m22 * m33 - m23 * m32); + const auto num21 = (m21 * m34 - m24 * m31); + const auto num22 = (m21 * m33 - m23 * m31); + const auto num23 = (m21 * m32 - m22 * m31); + + matrix1.M14 = -(m12 * num18 - m13 * num19 + m14 * num20) * num11; + matrix1.M24 = (m11 * num18 - m13 * num21 + m14 * num22) * num11; + matrix1.M34 = -(m11 * num19 - m12 * num21 + m14 * num23) * num11; + matrix1.M44 = (m11 * num20 - m12 * num22 + m13 * num23) * num11; + + return matrix1; + } + + static constexpr Matrix Lerp(Matrix const& matrix1, Matrix const& matrix2, float amount) { + Matrix matrix; + matrix.M11 = matrix1.M11 + (matrix2.M11 - matrix1.M11) * amount; + matrix.M12 = matrix1.M12 + (matrix2.M12 - matrix1.M12) * amount; + matrix.M13 = matrix1.M13 + (matrix2.M13 - matrix1.M13) * amount; + matrix.M14 = matrix1.M14 + (matrix2.M14 - matrix1.M14) * amount; + matrix.M21 = matrix1.M21 + (matrix2.M21 - matrix1.M21) * amount; + matrix.M22 = matrix1.M22 + (matrix2.M22 - matrix1.M22) * amount; + matrix.M23 = matrix1.M23 + (matrix2.M23 - matrix1.M23) * amount; + matrix.M24 = matrix1.M24 + (matrix2.M24 - matrix1.M24) * amount; + matrix.M31 = matrix1.M31 + (matrix2.M31 - matrix1.M31) * amount; + matrix.M32 = matrix1.M32 + (matrix2.M32 - matrix1.M32) * amount; + matrix.M33 = matrix1.M33 + (matrix2.M33 - matrix1.M33) * amount; + matrix.M34 = matrix1.M34 + (matrix2.M34 - matrix1.M34) * amount; + matrix.M41 = matrix1.M41 + (matrix2.M41 - matrix1.M41) * amount; + matrix.M42 = matrix1.M42 + (matrix2.M42 - matrix1.M42) * amount; + matrix.M43 = matrix1.M43 + (matrix2.M43 - matrix1.M43) * amount; + matrix.M44 = matrix1.M44 + (matrix2.M44 - matrix1.M44) * amount; + return matrix; + } + + static constexpr Matrix Negate(Matrix const& matrix) { + Matrix matrix1; + matrix1.M11 = -matrix.M11; + matrix1.M12 = -matrix.M12; + matrix1.M13 = -matrix.M13; + matrix1.M14 = -matrix.M14; + matrix1.M21 = -matrix.M21; + matrix1.M22 = -matrix.M22; + matrix1.M23 = -matrix.M23; + matrix1.M24 = -matrix.M24; + matrix1.M31 = -matrix.M31; + matrix1.M32 = -matrix.M32; + matrix1.M33 = -matrix.M33; + matrix1.M34 = -matrix.M34; + matrix1.M41 = -matrix.M41; + matrix1.M42 = -matrix.M42; + matrix1.M43 = -matrix.M43; + matrix1.M44 = -matrix.M44; + return matrix1; + } + + static constexpr Matrix Add(Matrix const& matrix1, Matrix const& matrix2) { + Matrix matrix; + matrix.M11 = matrix1.M11 + matrix2.M11; + matrix.M12 = matrix1.M12 + matrix2.M12; + matrix.M13 = matrix1.M13 + matrix2.M13; + matrix.M14 = matrix1.M14 + matrix2.M14; + matrix.M21 = matrix1.M21 + matrix2.M21; + matrix.M22 = matrix1.M22 + matrix2.M22; + matrix.M23 = matrix1.M23 + matrix2.M23; + matrix.M24 = matrix1.M24 + matrix2.M24; + matrix.M31 = matrix1.M31 + matrix2.M31; + matrix.M32 = matrix1.M32 + matrix2.M32; + matrix.M33 = matrix1.M33 + matrix2.M33; + matrix.M34 = matrix1.M34 + matrix2.M34; + matrix.M41 = matrix1.M41 + matrix2.M41; + matrix.M42 = matrix1.M42 + matrix2.M42; + matrix.M43 = matrix1.M43 + matrix2.M43; + matrix.M44 = matrix1.M44 + matrix2.M44; + return matrix; + } + + static constexpr Matrix Subtract(Matrix const& matrix1, Matrix const& matrix2) { + Matrix matrix; + matrix.M11 = matrix1.M11 - matrix2.M11; + matrix.M12 = matrix1.M12 - matrix2.M12; + matrix.M13 = matrix1.M13 - matrix2.M13; + matrix.M14 = matrix1.M14 - matrix2.M14; + matrix.M21 = matrix1.M21 - matrix2.M21; + matrix.M22 = matrix1.M22 - matrix2.M22; + matrix.M23 = matrix1.M23 - matrix2.M23; + matrix.M24 = matrix1.M24 - matrix2.M24; + matrix.M31 = matrix1.M31 - matrix2.M31; + matrix.M32 = matrix1.M32 - matrix2.M32; + matrix.M33 = matrix1.M33 - matrix2.M33; + matrix.M34 = matrix1.M34 - matrix2.M34; + matrix.M41 = matrix1.M41 - matrix2.M41; + matrix.M42 = matrix1.M42 - matrix2.M42; + matrix.M43 = matrix1.M43 - matrix2.M43; + matrix.M44 = matrix1.M44 - matrix2.M44; + return matrix; + } + + static constexpr Matrix Multiply(Matrix const& matrix1, Matrix const& matrix2) { + Matrix matrix; + matrix.M11 = (matrix1.M11 * matrix2.M11 + matrix1.M12 * matrix2.M21 + matrix1.M13 * matrix2.M31 + matrix1.M14 * matrix2.M41); + matrix.M12 = (matrix1.M11 * matrix2.M12 + matrix1.M12 * matrix2.M22 + matrix1.M13 * matrix2.M32 + matrix1.M14 * matrix2.M42); + matrix.M13 = (matrix1.M11 * matrix2.M13 + matrix1.M12 * matrix2.M23 + matrix1.M13 * matrix2.M33 + matrix1.M14 * matrix2.M43); + matrix.M14 = (matrix1.M11 * matrix2.M14 + matrix1.M12 * matrix2.M24 + matrix1.M13 * matrix2.M34 + matrix1.M14 * matrix2.M44); + matrix.M21 = (matrix1.M21 * matrix2.M11 + matrix1.M22 * matrix2.M21 + matrix1.M23 * matrix2.M31 + matrix1.M24 * matrix2.M41); + matrix.M22 = (matrix1.M21 * matrix2.M12 + matrix1.M22 * matrix2.M22 + matrix1.M23 * matrix2.M32 + matrix1.M24 * matrix2.M42); + matrix.M23 = (matrix1.M21 * matrix2.M13 + matrix1.M22 * matrix2.M23 + matrix1.M23 * matrix2.M33 + matrix1.M24 * matrix2.M43); + matrix.M24 = (matrix1.M21 * matrix2.M14 + matrix1.M22 * matrix2.M24 + matrix1.M23 * matrix2.M34 + matrix1.M24 * matrix2.M44); + matrix.M31 = (matrix1.M31 * matrix2.M11 + matrix1.M32 * matrix2.M21 + matrix1.M33 * matrix2.M31 + matrix1.M34 * matrix2.M41); + matrix.M32 = (matrix1.M31 * matrix2.M12 + matrix1.M32 * matrix2.M22 + matrix1.M33 * matrix2.M32 + matrix1.M34 * matrix2.M42); + matrix.M33 = (matrix1.M31 * matrix2.M13 + matrix1.M32 * matrix2.M23 + matrix1.M33 * matrix2.M33 + matrix1.M34 * matrix2.M43); + matrix.M34 = (matrix1.M31 * matrix2.M14 + matrix1.M32 * matrix2.M24 + matrix1.M33 * matrix2.M34 + matrix1.M34 * matrix2.M44); + matrix.M41 = (matrix1.M41 * matrix2.M11 + matrix1.M42 * matrix2.M21 + matrix1.M43 * matrix2.M31 + matrix1.M44 * matrix2.M41); + matrix.M42 = (matrix1.M41 * matrix2.M12 + matrix1.M42 * matrix2.M22 + matrix1.M43 * matrix2.M32 + matrix1.M44 * matrix2.M42); + matrix.M43 = (matrix1.M41 * matrix2.M13 + matrix1.M42 * matrix2.M23 + matrix1.M43 * matrix2.M33 + matrix1.M44 * matrix2.M43); + matrix.M44 = (matrix1.M41 * matrix2.M14 + matrix1.M42 * matrix2.M24 + matrix1.M43 * matrix2.M34 + matrix1.M44 * matrix2.M44); + return matrix; + } + + static constexpr Matrix Multiply(Matrix const& matrix1, float scaleFactor) { + float num = scaleFactor; + Matrix matrix; + matrix.M11 = matrix1.M11 * num; + matrix.M12 = matrix1.M12 * num; + matrix.M13 = matrix1.M13 * num; + matrix.M14 = matrix1.M14 * num; + matrix.M21 = matrix1.M21 * num; + matrix.M22 = matrix1.M22 * num; + matrix.M23 = matrix1.M23 * num; + matrix.M24 = matrix1.M24 * num; + matrix.M31 = matrix1.M31 * num; + matrix.M32 = matrix1.M32 * num; + matrix.M33 = matrix1.M33 * num; + matrix.M34 = matrix1.M34 * num; + matrix.M41 = matrix1.M41 * num; + matrix.M42 = matrix1.M42 * num; + matrix.M43 = matrix1.M43 * num; + matrix.M44 = matrix1.M44 * num; + return matrix; + } + + static constexpr Matrix Divide(Matrix const& matrix1, Matrix const& matrix2) { + Matrix matrix; + matrix.M11 = matrix1.M11 / matrix2.M11; + matrix.M12 = matrix1.M12 / matrix2.M12; + matrix.M13 = matrix1.M13 / matrix2.M13; + matrix.M14 = matrix1.M14 / matrix2.M14; + matrix.M21 = matrix1.M21 / matrix2.M21; + matrix.M22 = matrix1.M22 / matrix2.M22; + matrix.M23 = matrix1.M23 / matrix2.M23; + matrix.M24 = matrix1.M24 / matrix2.M24; + matrix.M31 = matrix1.M31 / matrix2.M31; + matrix.M32 = matrix1.M32 / matrix2.M32; + matrix.M33 = matrix1.M33 / matrix2.M33; + matrix.M34 = matrix1.M34 / matrix2.M34; + matrix.M41 = matrix1.M41 / matrix2.M41; + matrix.M42 = matrix1.M42 / matrix2.M42; + matrix.M43 = matrix1.M43 / matrix2.M43; + matrix.M44 = matrix1.M44 / matrix2.M44; + return matrix; + } + + static constexpr Matrix Divide(Matrix const& matrix1, float divider) { + float num = 1.0f / divider; + Matrix matrix; + matrix.M11 = matrix1.M11 * num; + matrix.M12 = matrix1.M12 * num; + matrix.M13 = matrix1.M13 * num; + matrix.M14 = matrix1.M14 * num; + matrix.M21 = matrix1.M21 * num; + matrix.M22 = matrix1.M22 * num; + matrix.M23 = matrix1.M23 * num; + matrix.M24 = matrix1.M24 * num; + matrix.M31 = matrix1.M31 * num; + matrix.M32 = matrix1.M32 * num; + matrix.M33 = matrix1.M33 * num; + matrix.M34 = matrix1.M34 * num; + matrix.M41 = matrix1.M41 * num; + matrix.M42 = matrix1.M42 * num; + matrix.M43 = matrix1.M43 * num; + matrix.M44 = matrix1.M44 * num; + return matrix; + } + + constexpr Matrix operator-() const { + return Matrix::Negate(*this); + } + + friend constexpr Matrix operator+(Matrix const& matrix1, Matrix const& matrix2) { + return Matrix::Add(matrix1, matrix2); + } + + friend constexpr Matrix operator-(Matrix const& matrix1, Matrix const& matrix2) { + return Matrix::Subtract(matrix1, matrix2); + } + + friend constexpr Matrix operator*(Matrix const& matrix1, Matrix const& matrix2) { + return Matrix::Multiply(matrix1, matrix2); + } + + friend constexpr Matrix operator*(Matrix const& matrix, float factor) { + return Matrix::Multiply(matrix, factor); + } + + friend constexpr Matrix operator*(float factor, Matrix const& matrix) { + return Matrix::Multiply(matrix, factor); + } + + friend constexpr Matrix operator/(Matrix const& matrix1, Matrix const& matrix2) { + return Matrix::Divide(matrix1, matrix2); + } + + friend constexpr Matrix operator/(Matrix const& matrix, float divider) { + return Matrix::Divide(matrix, divider); + } + }; + + struct Quaternion { + float X{ 0 }; + float Y{ 0 }; + float Z{ 0 }; + float W{ 0 }; + + constexpr Quaternion() = default; + + constexpr Quaternion(float X, float Y, float Z, float W) + : X(X), Y(Y), Z(Z), W(W) { } + + constexpr Quaternion(Vector3 vectorPart, float scalarPart) + : X(vectorPart.X), Y(vectorPart.Y), Z(vectorPart.Z), W(scalarPart) { } + + constexpr bool operator==(const Quaternion& other) const { + return X == other.X && Y == other.Y && Z == other.Z && W == other.W; + } + + static constexpr Quaternion Identity() { + return { 0.0f, 0.0f, 0.0f, 1.0f }; + } + + float constexpr LengthSquared() const { + return X * X + Y * Y + Z * Z + W * W; + } + + inline float Length() const { return std::sqrt(LengthSquared()); } + + void Normalize() { + const auto num = 1.0F / Length(); + X *= num; + Y *= num; + Z *= num; + W *= num; + } + + static Quaternion Normalize(Quaternion const& quaternion) { + auto q = quaternion; + q.Normalize(); + return q; + } + + constexpr void Conjugate() { + X = -X; + Y = -Y; + Z = -Z; + } + + static constexpr Quaternion Conjugate(Quaternion const& value) { + Quaternion quaternion; + quaternion.X = -value.X; + quaternion.Y = -value.Y; + quaternion.Z = -value.Z; + quaternion.W = value.W; + return quaternion; + } + + static constexpr Quaternion Inverse(Quaternion const& quaternion) { + const auto num = 1.0f / quaternion.LengthSquared(); + Quaternion quaternion1; + quaternion1.X = -quaternion.X * num; + quaternion1.Y = -quaternion.Y * num; + quaternion1.Z = -quaternion.Z * num; + quaternion1.W = quaternion.W * num; + return quaternion1; + } + + static Quaternion CreateFromAxisAngle(Vector3 const& axis, float angle); + static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll); + static Quaternion CreateFromRotationMatrix(Matrix const& matrix); + + static constexpr float Dot(Quaternion const& quaternion1, Quaternion const& quaternion2) { + return quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W; + } + + static Quaternion Slerp(Quaternion const& quaternion1, Quaternion const& quaternion2, float amount); + static Quaternion Lerp(Quaternion const& quaternion1, Quaternion const& quaternion2, float amount); + + static constexpr Quaternion Concatenate(Quaternion const& value1, Quaternion const& value2) { + const auto x1 = value2.X; + const auto y1 = value2.Y; + const auto z1 = value2.Z; + const auto w1 = value2.W; + const auto x2 = value1.X; + const auto y2 = value1.Y; + const auto z2 = value1.Z; + const auto w2 = value1.W; + const auto num1 = y1 * z2 - z1 * y2; + const auto num2 = z1 * x2 - x1 * z2; + const auto num3 = x1 * y2 - y1 * x2; + const auto num4 = x1 * x2 + y1 * y2 + z1 * z2; + Quaternion quaternion; + quaternion.X = (x1 * w2 + x2 * w1) + num1; + quaternion.Y = (y1 * w2 + y2 * w1) + num2; + quaternion.Z = (z1 * w2 + z2 * w1) + num3; + quaternion.W = w1 * w2 - num4; + return quaternion; + } + + static constexpr Quaternion Negate(Quaternion const& quaternion) { + Quaternion quaternion1; + quaternion1.X = -quaternion.X; + quaternion1.Y = -quaternion.Y; + quaternion1.Z = -quaternion.Z; + quaternion1.W = -quaternion.W; + return quaternion1; + } + + static constexpr Quaternion Add(Quaternion const& quaternion1, Quaternion const& quaternion2) { + Quaternion quaternion; + quaternion.X = quaternion1.X + quaternion2.X; + quaternion.Y = quaternion1.Y + quaternion2.Y; + quaternion.Z = quaternion1.Z + quaternion2.Z; + quaternion.W = quaternion1.W + quaternion2.W; + return quaternion; + } + + static constexpr Quaternion Subtract(Quaternion const& quaternion1, Quaternion const& quaternion2) { + Quaternion quaternion; + quaternion.X = quaternion1.X - quaternion2.X; + quaternion.Y = quaternion1.Y - quaternion2.Y; + quaternion.Z = quaternion1.Z - quaternion2.Z; + quaternion.W = quaternion1.W - quaternion2.W; + return quaternion; + } + + static constexpr Quaternion Multiply(Quaternion const& quaternion1, Quaternion const& quaternion2) { + const auto x1 = quaternion1.X; + const auto y1 = quaternion1.Y; + const auto z1 = quaternion1.Z; + const auto w1 = quaternion1.W; + const auto x2 = quaternion2.X; + const auto y2 = quaternion2.Y; + const auto z2 = quaternion2.Z; + const auto w2 = quaternion2.W; + const auto num1 = y1 * z2 - z1 * y2; + const auto num2 = z1 * x2 - x1 * z2; + const auto num3 = x1 * y2 - y1 * x2; + const auto num4 = x1 * x2 + y1 * y2 + z1 * z2; + Quaternion quaternion; + quaternion.X = (x1 * w2 + x2 * w1) + num1; + quaternion.Y = (y1 * w2 + y2 * w1) + num2; + quaternion.Z = (z1 * w2 + z2 * w1) + num3; + quaternion.W = w1 * w2 - num4; + return quaternion; + } + + static constexpr Quaternion Multiply(Quaternion const& quaternion1, float scaleFactor) { + Quaternion quaternion; + quaternion.X = quaternion1.X * scaleFactor; + quaternion.Y = quaternion1.Y * scaleFactor; + quaternion.Z = quaternion1.Z * scaleFactor; + quaternion.W = quaternion1.W * scaleFactor; + return quaternion; + } + + static constexpr Quaternion Divide(Quaternion const& quaternion1, Quaternion const& quaternion2) { + const auto x = quaternion1.X; + const auto y = quaternion1.Y; + const auto z = quaternion1.Z; + const auto w = quaternion1.W; + const auto num1 = 1.0f / (quaternion2.X * quaternion2.X + quaternion2.Y * quaternion2.Y + quaternion2.Z * quaternion2.Z + quaternion2.W * quaternion2.W); + const auto num2 = -quaternion2.X * num1; + const auto num3 = -quaternion2.Y * num1; + const auto num4 = -quaternion2.Z * num1; + const auto num5 = quaternion2.W * num1; + const auto num6 = y * num4 - z * num3; + const auto num7 = z * num2 - x * num4; + const auto num8 = x * num3 - y * num2; + const auto num9 = x * num2 + y * num3 + z * num4; + Quaternion quaternion; + quaternion.X = (x * num5 + num2 * w) + num6; + quaternion.Y = (y * num5 + num3 * w) + num7; + quaternion.Z = (z * num5 + num4 * w) + num8; + quaternion.W = w * num5 - num9; + return quaternion; + } + + constexpr Quaternion operator-(Quaternion const& quaternion) const { + return Quaternion::Negate(quaternion); + } + + constexpr friend Quaternion operator+(Quaternion const& q1, Quaternion const& q2) { + return Quaternion::Add(q1, q2); + } + + constexpr friend Quaternion operator-(Quaternion const& q1, Quaternion const& q2) { + return Quaternion::Add(q1, q2); + } + + constexpr friend Quaternion operator*(Quaternion const& q1, Quaternion const& q2) { + return Quaternion::Multiply(q1, q2); + } + + constexpr friend Quaternion operator/(Quaternion const& q1, Quaternion const& q2) { + return Quaternion::Divide(q1, q2); + } + + constexpr friend Quaternion operator*(Quaternion const& q1, float scaleValue) { + return Quaternion::Multiply(q1, scaleValue); + } + + constexpr friend Quaternion operator*(float scaleValue, Quaternion const& q1) { + return Quaternion::Multiply(q1, scaleValue); + } + }; + + constexpr Vector2 Vector2::Transform(Vector2 const& position, Matrix const& matrix) { + const auto posx = (position.X * matrix.M11 + position.Y * matrix.M21) + matrix.M41; + const auto posy = (position.X * matrix.M12 + position.Y * matrix.M22) + matrix.M42; + + return{ posx, posy }; + } + + constexpr Vector2 Vector2::TransformNormal(Vector2 const& normal, Matrix const& matrix) { + const auto posx = normal.X * matrix.M11 + normal.Y * matrix.M21; + const auto posy = normal.X * matrix.M12 + normal.Y * matrix.M22; + return { posx, posy }; + } + + constexpr Vector3 Vector3::Transform(Vector3 const& position, Matrix const& matrix) { + const auto num1 = (position.X * matrix.M11 + position.Y * matrix.M21 + position.Z * matrix.M31) + matrix.M41; + const auto num2 = (position.X * matrix.M12 + position.Y * matrix.M22 + position.Z * matrix.M32) + matrix.M42; + const auto num3 = (position.X * matrix.M13 + position.Y * matrix.M23 + position.Z * matrix.M33) + matrix.M43; + Vector3 vector3; + vector3.X = num1; + vector3.Y = num2; + vector3.Z = num3; + return vector3; + } + + constexpr Vector3 Vector3::TransformNormal(Vector3 const& normal, Matrix const& matrix) + { + const auto num1 = normal.X * matrix.M11 + normal.Y * matrix.M21 + normal.Z * matrix.M31; + const auto num2 = normal.X * matrix.M12 + normal.Y * matrix.M22 + normal.Z * matrix.M32; + const auto num3 = normal.X * matrix.M13 + normal.Y * matrix.M23 + normal.Z * matrix.M33; + Vector3 vector3; + vector3.X = num1; + vector3.Y = num2; + vector3.Z = num3; + return vector3; + } + + constexpr Vector4 Vector4::Transform(Vector2 const& position, Matrix const& matrix) + { + const auto num1 = (position.X * matrix.M11 + position.Y * matrix.M21) + matrix.M41; + const auto num2 = (position.X * matrix.M12 + position.Y * matrix.M22) + matrix.M42; + const auto num3 = (position.X * matrix.M13 + position.Y * matrix.M23) + matrix.M43; + const auto num4 = (position.X * matrix.M14 + position.Y * matrix.M24) + matrix.M44; + Vector4 vector4; + vector4.X = num1; + vector4.Y = num2; + vector4.Z = num3; + vector4.W = num4; + return vector4; + } + + constexpr Vector4 Vector4::Transform(Vector3 const& position, Matrix const& matrix) + { + const auto num1 = (position.X * matrix.M11 + position.Y * matrix.M21 + position.Z * matrix.M31) + matrix.M41; + const auto num2 = (position.X * matrix.M12 + position.Y * matrix.M22 + position.Z * matrix.M32) + matrix.M42; + const auto num3 = (position.X * matrix.M13 + position.Y * matrix.M23 + position.Z * matrix.M33) + matrix.M43; + const auto num4 = (position.X * matrix.M14 + position.Y * matrix.M24 + position.Z * matrix.M34) + matrix.M44; + Vector4 vector4; + vector4.X = num1; + vector4.Y = num2; + vector4.Z = num3; + vector4.W = num4; + return vector4; + } + + constexpr Vector4 Vector4::Transform(Vector4 const& vector, Matrix const& matrix) { + const auto num1 = (vector.X * matrix.M11 + vector.Y * matrix.M21 + vector.Z * matrix.M31 + vector.W * matrix.M41); + const auto num2 = (vector.X * matrix.M12 + vector.Y * matrix.M22 + vector.Z * matrix.M32 + vector.W * matrix.M42); + const auto num3 = (vector.X * matrix.M13 + vector.Y * matrix.M23 + vector.Z * matrix.M33 + vector.W * matrix.M43); + const auto num4 = (vector.X * matrix.M14 + vector.Y * matrix.M24 + vector.Z * matrix.M34 + vector.W * matrix.M44); + Vector4 vector4; + vector4.X = num1; + vector4.Y = num2; + vector4.Z = num3; + vector4.W = num4; + return vector4; + } + + constexpr Vector2 Vector2::Transform(Vector2 const& value, Quaternion const& rotation) { + const auto rx = rotation.X + rotation.X; + const auto ry = rotation.Y + rotation.Y; + const auto rz = rotation.Z + rotation.Z; + const auto rwz = rotation.W * rz; + const auto rxx = rotation.X * rx; + const auto rxy = rotation.X * ry; + const auto ryy = rotation.Y * ry; + const auto rzz = rotation.Z * rz; + const auto x = value.X * (1.0F - ryy - rzz) + value.Y * (rxy - rwz); + const auto y = value.X * (rxy + rwz) + value.Y * (1.0F - rxx - rzz); + return{ x,y }; + } + + constexpr Vector3 Vector3::Transform(Vector3 const& value, Quaternion const& rotation) + { + const auto num1 = rotation.X + rotation.X; + const auto num2 = rotation.Y + rotation.Y; + const auto num3 = rotation.Z + rotation.Z; + const auto num4 = rotation.W * num1; + const auto num5 = rotation.W * num2; + const auto num6 = rotation.W * num3; + const auto num7 = rotation.X * num1; + const auto num8 = rotation.X * num2; + const auto num9 = rotation.X * num3; + const auto num10 = rotation.Y * num2; + const auto num11 = rotation.Y * num3; + const auto num12 = rotation.Z * num3; + const auto num13 = (value.X * (1.0F - num10 - num12) + value.Y * (num8 - num6) + value.Z * (num9 + num5)); + const auto num14 = (value.X * (num8 + num6) + value.Y * (1.0F - num7 - num12) + value.Z * (num11 - num4)); + const auto num15 = (value.X * (num9 - num5) + value.Y * (num11 + num4) + value.Z * (1.0F - num7 - num10)); + Vector3 vector3; + vector3.X = num13; + vector3.Y = num14; + vector3.Z = num15; + return vector3; + } + + constexpr Vector4 Vector4::Transform(Vector2 const& value, Quaternion const& rotation) + { + const auto num1 = rotation.X + rotation.X; + const auto num2 = rotation.Y + rotation.Y; + const auto num3 = rotation.Z + rotation.Z; + const auto num4 = rotation.W * num1; + const auto num5 = rotation.W * num2; + const auto num6 = rotation.W * num3; + const auto num7 = rotation.X * num1; + const auto num8 = rotation.X * num2; + const auto num9 = rotation.X * num3; + const auto num10 = rotation.Y * num2; + const auto num11 = rotation.Y * num3; + const auto num12 = rotation.Z * num3; + const auto num13 = (value.X * (1.0F - num10 - num12) + value.Y * (num8 - num6)); + const auto num14 = (value.X * (num8 + num6) + value.Y * (1.0F - num7 - num12)); + const auto num15 = (value.X * (num9 - num5) + value.Y * (num11 + num4)); + Vector4 vector4; + vector4.X = num13; + vector4.Y = num14; + vector4.Z = num15; + vector4.W = 1.0f; + return vector4; + } + + constexpr Vector4 Vector4::Transform(Vector3 const& value, Quaternion const& rotation) { + const auto num1 = rotation.X + rotation.X; + const auto num2 = rotation.Y + rotation.Y; + const auto num3 = rotation.Z + rotation.Z; + const auto num4 = rotation.W * num1; + const auto num5 = rotation.W * num2; + const auto num6 = rotation.W * num3; + const auto num7 = rotation.X * num1; + const auto num8 = rotation.X * num2; + const auto num9 = rotation.X * num3; + const auto num10 = rotation.Y * num2; + const auto num11 = rotation.Y * num3; + const auto num12 = rotation.Z * num3; + const auto num13 = (value.X * (1.0F - num10 - num12) + value.Y * (num8 - num6) + value.Z * (num9 + num5)); + const auto num14 = (value.X * (num8 + num6) + value.Y * (1.0F - num7 - num12) + value.Z * (num11 - num4)); + const auto num15 = (value.X * (num9 - num5) + value.Y * (num11 + num4) + value.Z * (1.0F - num7 - num10)); + Vector4 vector4; + vector4.X = num13; + vector4.Y = num14; + vector4.Z = num15; + vector4.W = 1.0f; + return vector4; + } } #endif \ No newline at end of file diff --git a/inc/common/quaternion.hpp b/inc/common/quaternion.hpp deleted file mode 100644 index 6bba8d7..0000000 --- a/inc/common/quaternion.hpp +++ /dev/null @@ -1,302 +0,0 @@ -#ifndef XNA_COMMON_QUATERNION_HPP -#define XNA_COMMON_QUATERNION_HPP - -#include "numerics.hpp" - -namespace xna { - struct Quaternion { - float X{ 0 }; - float Y{ 0 }; - float Z{ 0 }; - float W{ 0 }; - - constexpr Quaternion() = default; - - constexpr Quaternion(float X, float Y, float Z, float W) - : X(X), Y(Y), Z(Z), W(W) { } - - constexpr Quaternion(Vector3 vectorPart, float scalarPart) - : X(vectorPart.X), Y(vectorPart.Y), Z(vectorPart.Z), W(scalarPart) { } - - constexpr bool operator==(const Quaternion& other) const { - return X == other.X && Y == other.Y && Z == other.Z && W == other.W; - } - - static constexpr Quaternion Identity() { - return { 0.0f, 0.0f, 0.0f, 1.0f }; - } - - float constexpr LengthSquared() const { - return X * X + Y * Y + Z * Z + W * W; - } - - inline float Length() const { return std::sqrt(LengthSquared()); } - - void Normalize() { - const auto num = 1.0F / Length(); - X *= num; - Y *= num; - Z *= num; - W *= num; - } - - static Quaternion Normalize(Quaternion const& quaternion) { - auto q = quaternion; - q.Normalize(); - return q; - } - - constexpr void Conjugate() { - X = -X; - Y = -Y; - Z = -Z; - } - - static constexpr Quaternion Conjugate(Quaternion const& value) { - Quaternion quaternion; - quaternion.X = -value.X; - quaternion.Y = -value.Y; - quaternion.Z = -value.Z; - quaternion.W = value.W; - return quaternion; - } - - static constexpr Quaternion Inverse(Quaternion const& quaternion) { - const auto num = 1.0f / quaternion.LengthSquared(); - Quaternion quaternion1; - quaternion1.X = -quaternion.X * num; - quaternion1.Y = -quaternion.Y * num; - quaternion1.Z = -quaternion.Z * num; - quaternion1.W = quaternion.W * num; - return quaternion1; - } - - static Quaternion CreateFromAxisAngle(Vector3 const& axis, float angle); - static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll); - static Quaternion CreateFromRotationMatrix(Matrix const& matrix); - - static constexpr float Dot(Quaternion const& quaternion1, Quaternion const& quaternion2) { - return quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W; - } - - static Quaternion Slerp(Quaternion const& quaternion1, Quaternion const& quaternion2, float amount); - static Quaternion Lerp(Quaternion const& quaternion1, Quaternion const& quaternion2, float amount); - - static constexpr Quaternion Concatenate(Quaternion const& value1, Quaternion const& value2) { - const auto x1 = value2.X; - const auto y1 = value2.Y; - const auto z1 = value2.Z; - const auto w1 = value2.W; - const auto x2 = value1.X; - const auto y2 = value1.Y; - const auto z2 = value1.Z; - const auto w2 = value1.W; - const auto num1 = y1 * z2 - z1 * y2; - const auto num2 = z1 * x2 - x1 * z2; - const auto num3 = x1 * y2 - y1 * x2; - const auto num4 = x1 * x2 + y1 * y2 + z1 * z2; - Quaternion quaternion; - quaternion.X = (x1 * w2 + x2 * w1) + num1; - quaternion.Y = (y1 * w2 + y2 * w1) + num2; - quaternion.Z = (z1 * w2 + z2 * w1) + num3; - quaternion.W = w1 * w2 - num4; - return quaternion; - } - - static constexpr Quaternion Negate(Quaternion const& quaternion) { - Quaternion quaternion1; - quaternion1.X = -quaternion.X; - quaternion1.Y = -quaternion.Y; - quaternion1.Z = -quaternion.Z; - quaternion1.W = -quaternion.W; - return quaternion1; - } - - static constexpr Quaternion Add(Quaternion const& quaternion1, Quaternion const& quaternion2) { - Quaternion quaternion; - quaternion.X = quaternion1.X + quaternion2.X; - quaternion.Y = quaternion1.Y + quaternion2.Y; - quaternion.Z = quaternion1.Z + quaternion2.Z; - quaternion.W = quaternion1.W + quaternion2.W; - return quaternion; - } - - static constexpr Quaternion Subtract(Quaternion const& quaternion1, Quaternion const& quaternion2) { - Quaternion quaternion; - quaternion.X = quaternion1.X - quaternion2.X; - quaternion.Y = quaternion1.Y - quaternion2.Y; - quaternion.Z = quaternion1.Z - quaternion2.Z; - quaternion.W = quaternion1.W - quaternion2.W; - return quaternion; - } - - static constexpr Quaternion Multiply(Quaternion const& quaternion1, Quaternion const& quaternion2) { - const auto x1 = quaternion1.X; - const auto y1 = quaternion1.Y; - const auto z1 = quaternion1.Z; - const auto w1 = quaternion1.W; - const auto x2 = quaternion2.X; - const auto y2 = quaternion2.Y; - const auto z2 = quaternion2.Z; - const auto w2 = quaternion2.W; - const auto num1 = y1 * z2 - z1 * y2; - const auto num2 = z1 * x2 - x1 * z2; - const auto num3 = x1 * y2 - y1 * x2; - const auto num4 = x1 * x2 + y1 * y2 + z1 * z2; - Quaternion quaternion; - quaternion.X = (x1 * w2 + x2 * w1) + num1; - quaternion.Y = (y1 * w2 + y2 * w1) + num2; - quaternion.Z = (z1 * w2 + z2 * w1) + num3; - quaternion.W = w1 * w2 - num4; - return quaternion; - } - - static constexpr Quaternion Multiply(Quaternion const& quaternion1, float scaleFactor) { - Quaternion quaternion; - quaternion.X = quaternion1.X * scaleFactor; - quaternion.Y = quaternion1.Y * scaleFactor; - quaternion.Z = quaternion1.Z * scaleFactor; - quaternion.W = quaternion1.W * scaleFactor; - return quaternion; - } - - static constexpr Quaternion Divide(Quaternion const& quaternion1, Quaternion const& quaternion2) { - const auto x = quaternion1.X; - const auto y = quaternion1.Y; - const auto z = quaternion1.Z; - const auto w = quaternion1.W; - const auto num1 = 1.0f / (quaternion2.X * quaternion2.X + quaternion2.Y * quaternion2.Y + quaternion2.Z * quaternion2.Z + quaternion2.W * quaternion2.W); - const auto num2 = -quaternion2.X * num1; - const auto num3 = -quaternion2.Y * num1; - const auto num4 = -quaternion2.Z * num1; - const auto num5 = quaternion2.W * num1; - const auto num6 = y * num4 - z * num3; - const auto num7 = z * num2 - x * num4; - const auto num8 = x * num3 - y * num2; - const auto num9 = x * num2 + y * num3 + z * num4; - Quaternion quaternion; - quaternion.X = (x * num5 + num2 * w) + num6; - quaternion.Y = (y * num5 + num3 * w) + num7; - quaternion.Z = (z * num5 + num4 * w) + num8; - quaternion.W = w * num5 - num9; - return quaternion; - } - - constexpr Quaternion operator-(Quaternion const& quaternion) const { - return Quaternion::Negate(quaternion); - } - - constexpr friend Quaternion operator+(Quaternion const& q1, Quaternion const& q2) { - return Quaternion::Add(q1, q2); - } - - constexpr friend Quaternion operator-(Quaternion const& q1, Quaternion const& q2) { - return Quaternion::Add(q1, q2); - } - - constexpr friend Quaternion operator*(Quaternion const& q1, Quaternion const& q2) { - return Quaternion::Multiply(q1, q2); - } - - constexpr friend Quaternion operator/(Quaternion const& q1, Quaternion const& q2) { - return Quaternion::Divide(q1, q2); - } - - constexpr friend Quaternion operator*(Quaternion const& q1, float scaleValue) { - return Quaternion::Multiply(q1, scaleValue); - } - - constexpr friend Quaternion operator*(float scaleValue, Quaternion const& q1) { - return Quaternion::Multiply(q1, scaleValue); - } - }; - - constexpr Vector2 Vector2::Transform(Vector2 const& value, Quaternion const& rotation) { - const auto rx = rotation.X + rotation.X; - const auto ry = rotation.Y + rotation.Y; - const auto rz = rotation.Z + rotation.Z; - const auto rwz = rotation.W * rz; - const auto rxx = rotation.X * rx; - const auto rxy = rotation.X * ry; - const auto ryy = rotation.Y * ry; - const auto rzz = rotation.Z * rz; - const auto x = value.X * (1.0F - ryy - rzz) + value.Y * (rxy - rwz); - const auto y = value.X * (rxy + rwz) + value.Y * (1.0F - rxx - rzz); - return{ x,y }; - } - - constexpr Vector3 Vector3::Transform(Vector3 const& value, Quaternion const& rotation) - { - const auto num1 = rotation.X + rotation.X; - const auto num2 = rotation.Y + rotation.Y; - const auto num3 = rotation.Z + rotation.Z; - const auto num4 = rotation.W * num1; - const auto num5 = rotation.W * num2; - const auto num6 = rotation.W * num3; - const auto num7 = rotation.X * num1; - const auto num8 = rotation.X * num2; - const auto num9 = rotation.X * num3; - const auto num10 = rotation.Y * num2; - const auto num11 = rotation.Y * num3; - const auto num12 = rotation.Z * num3; - const auto num13 = (value.X * (1.0F - num10 - num12) + value.Y * (num8 - num6) + value.Z * (num9 + num5)); - const auto num14 = (value.X * (num8 + num6) + value.Y * (1.0F - num7 - num12) + value.Z * (num11 - num4)); - const auto num15 = (value.X * (num9 - num5) + value.Y * (num11 + num4) + value.Z * (1.0F - num7 - num10)); - Vector3 vector3; - vector3.X = num13; - vector3.Y = num14; - vector3.Z = num15; - return vector3; - } - - constexpr Vector4 Vector4::Transform(Vector2 const& value, Quaternion const& rotation) - { - const auto num1 = rotation.X + rotation.X; - const auto num2 = rotation.Y + rotation.Y; - const auto num3 = rotation.Z + rotation.Z; - const auto num4 = rotation.W * num1; - const auto num5 = rotation.W * num2; - const auto num6 = rotation.W * num3; - const auto num7 = rotation.X * num1; - const auto num8 = rotation.X * num2; - const auto num9 = rotation.X * num3; - const auto num10 = rotation.Y * num2; - const auto num11 = rotation.Y * num3; - const auto num12 = rotation.Z * num3; - const auto num13 = (value.X * (1.0F - num10 - num12) + value.Y * (num8 - num6)); - const auto num14 = (value.X * (num8 + num6) + value.Y * (1.0F - num7 - num12)); - const auto num15 = (value.X * (num9 - num5) + value.Y * (num11 + num4)); - Vector4 vector4; - vector4.X = num13; - vector4.Y = num14; - vector4.Z = num15; - vector4.W = 1.0f; - return vector4; - } - - constexpr Vector4 Vector4::Transform(Vector3 const& value, Quaternion const& rotation) { - const auto num1 = rotation.X + rotation.X; - const auto num2 = rotation.Y + rotation.Y; - const auto num3 = rotation.Z + rotation.Z; - const auto num4 = rotation.W * num1; - const auto num5 = rotation.W * num2; - const auto num6 = rotation.W * num3; - const auto num7 = rotation.X * num1; - const auto num8 = rotation.X * num2; - const auto num9 = rotation.X * num3; - const auto num10 = rotation.Y * num2; - const auto num11 = rotation.Y * num3; - const auto num12 = rotation.Z * num3; - const auto num13 = (value.X * (1.0F - num10 - num12) + value.Y * (num8 - num6) + value.Z * (num9 + num5)); - const auto num14 = (value.X * (num8 + num6) + value.Y * (1.0F - num7 - num12) + value.Z * (num11 - num4)); - const auto num15 = (value.X * (num9 - num5) + value.Y * (num11 + num4) + value.Z * (1.0F - num7 - num10)); - Vector4 vector4; - vector4.X = num13; - vector4.Y = num14; - vector4.Z = num15; - vector4.W = 1.0f; - return vector4; - } -} - -#endif \ No newline at end of file diff --git a/inc/content/defaultreaders.hpp b/inc/content/defaultreaders.hpp index f886a25..a815081 100644 --- a/inc/content/defaultreaders.hpp +++ b/inc/content/defaultreaders.hpp @@ -4,7 +4,6 @@ #include "reader.hpp" #include "../default.hpp" #include "../common/color.hpp" -#include "../common/matrix.hpp" #include "../common/numerics.hpp" #include "../csharp/timespan.hpp" diff --git a/inc/content/reader.hpp b/inc/content/reader.hpp index 060ab5a..c09a5f2 100644 --- a/inc/content/reader.hpp +++ b/inc/content/reader.hpp @@ -2,8 +2,6 @@ #define XNA_CONTENT_READER_HPP #include "../common/color.hpp" -#include "../common/matrix.hpp" -#include "../common/quaternion.hpp" #include "../common/numerics.hpp" #include "../csharp/binary.hpp" #include "../csharp/type.hpp" diff --git a/inc/graphics/spritebatch.hpp b/inc/graphics/spritebatch.hpp index 6299aea..076cc3c 100644 --- a/inc/graphics/spritebatch.hpp +++ b/inc/graphics/spritebatch.hpp @@ -2,7 +2,7 @@ #define XNA_GRAPHICS_SPRITEBATCH_HPP #include "../default.hpp" -#include "../common/matrix.hpp" +#include "../common/numerics.hpp" namespace xna { class ISpriteBatch { diff --git a/inc/platform-dx/constbuffer-dx.hpp b/inc/platform-dx/constbuffer-dx.hpp index 6f46ab2..b7afc32 100644 --- a/inc/platform-dx/constbuffer-dx.hpp +++ b/inc/platform-dx/constbuffer-dx.hpp @@ -2,7 +2,7 @@ #define XNA_PLATFORM_CONSTBUFFER_DX_HPP #include "../graphics/constbuffer.hpp" -#include "../common/matrix.hpp" +#include "../common/numerics.hpp" #include "dxheaders.hpp" #include diff --git a/inc/xna.hpp b/inc/xna.hpp index 7c99015..29ba111 100644 --- a/inc/xna.hpp +++ b/inc/xna.hpp @@ -8,9 +8,7 @@ #include "common/curve.hpp" #include "common/gjk.hpp" #include "common/math.hpp" -#include "common/matrix.hpp" #include "common/packedvalue.hpp" -#include "common/quaternion.hpp" #include "common/numerics.hpp" #include "common/collision.hpp" #include "content/defaultreaders.hpp"