1
0
mirror of https://github.com/borgesdan/xn65 synced 2024-12-29 21:54:47 +01:00

Remove Matrix e Quaternion.hpp

This commit is contained in:
Danilo 2024-05-18 16:30:48 -03:00
parent 5d6c2c78b7
commit 9e3b820a8f
15 changed files with 1101 additions and 1429 deletions

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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<float>(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<float>(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<float>(cos(radians));
const auto num2 = static_cast<float>(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<float>(cos(radians));
const auto num2 = static_cast<float>(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<float>(cos(radians));
const auto num2 = static_cast<float>(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<float>(sin(angle));
const auto num2 = static_cast<float>(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<float>(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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -3,8 +3,6 @@
#include "default.hpp"
#include "numerics.hpp"
#include "matrix.hpp"
#include "quaternion.hpp"
#include "gjk.hpp"
#include <optional>
#include "math.hpp"

View File

@ -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;
}
};
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -2,7 +2,7 @@
#define XNA_GRAPHICS_SPRITEBATCH_HPP
#include "../default.hpp"
#include "../common/matrix.hpp"
#include "../common/numerics.hpp"
namespace xna {
class ISpriteBatch {

View File

@ -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 <BufferHelpers.h>

View File

@ -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"