1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00
Beef/BeefySysLib/util/Vector.cpp

88 lines
2 KiB
C++
Raw Normal View History

2019-08-23 11:56:54 -07:00
#include "Vector.h"
#include "Matrix4.h"
#include "Quaternion.h"
USING_NS_BF;
Vector3::Vector3(float x, float y, float z)
{
mX = x;
mY = y;
mZ = z;
}
float Vector3::GetMagnitude() const
{
2021-05-12 07:24:29 -04:00
return sqrtf(mX*mX + mY*mY + mZ*mZ);
2019-08-23 11:56:54 -07:00
}
Vector3 Vector3::Normalize(const Vector3& vec)
{
float mag = vec.GetMagnitude();
return Vector3(
vec.mX / mag,
vec.mY / mag,
vec.mZ / mag);
}
float Vector3::Dot(const Vector3& vec, const Vector3& vec2)
{
return vec.mX*vec2.mX + vec.mY*vec2.mY + vec.mZ*vec2.mZ;
}
Vector3 Vector3::CrossProduct(const Vector3& vec1, const Vector3& vec2)
{
return Vector3(
vec1.mY * vec2.mZ - vec1.mZ * vec2.mY,
vec1.mZ * vec2.mX - vec1.mX * vec2.mZ,
vec1.mX * vec2.mY - vec1.mY * vec2.mX);
}
Vector3 Vector3::Transform(const Vector3& vec, const Matrix4& matrix)
{
float fInvW = 1.0f / (matrix.m30 * vec.mX + matrix.m31 * vec.mY + matrix.m32 * vec.mZ + matrix.m33);
return Vector3(
(matrix.m00 * vec.mX + matrix.m01 * vec.mY + matrix.m02 * vec.mZ + matrix.m03) * fInvW,
(matrix.m10 * vec.mX + matrix.m11 * vec.mY + matrix.m12 * vec.mZ + matrix.m13) * fInvW,
(matrix.m20 * vec.mX + matrix.m21 * vec.mY + matrix.m22 * vec.mZ + matrix.m23) * fInvW);
}
Vector3 Vector3::Transform(const Vector3& vec, const Quaternion& quat)
{
Vector3 result;
Vector3 uv, uuv;
Vector3 qvec(quat.mX, quat.mY, quat.mZ);
uv = Vector3::CrossProduct(qvec, vec);
uuv = Vector3::CrossProduct(qvec, uv);
uv *= (2.0f * quat.mW);
uuv *= 2.0f;
return vec + uv + uuv;
}
Vector3 Vector3::Transform2(const Vector3& vec, const Quaternion& quat)
{
Vector3 result;
float x = 2 * (quat.mY * vec.mZ - quat.mZ * vec.mY);
float y = 2 * (quat.mZ * vec.mX - quat.mX * vec.mZ);
float z = 2 * (quat.mX * vec.mY - quat.mY * vec.mX);
result.mX = vec.mX + x * quat.mW + (quat.mY * z - quat.mZ * y);
result.mY = vec.mY + y * quat.mW + (quat.mZ * x - quat.mX * z);
result.mZ = vec.mZ + z * quat.mW + (quat.mX * y - quat.mY * x);
return result;
2021-05-12 07:24:29 -04:00
}
///
Vector4::Vector4(float x, float y, float z, float w)
{
mX = x;
mY = y;
mZ = z;
mW = w;
2019-08-23 11:56:54 -07:00
}