mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
108 lines
No EOL
2.5 KiB
C++
108 lines
No EOL
2.5 KiB
C++
#include "Vector.h"
|
|
#include "Matrix4.h"
|
|
#include "Quaternion.h"
|
|
|
|
USING_NS_BF;
|
|
|
|
Vector3::Vector3()
|
|
{
|
|
mX = 0;
|
|
mY = 0;
|
|
mZ = 0;
|
|
}
|
|
|
|
Vector3::Vector3(float x, float y, float z)
|
|
{
|
|
mX = x;
|
|
mY = y;
|
|
mZ = z;
|
|
}
|
|
|
|
float Vector3::GetMagnitude() const
|
|
{
|
|
return sqrtf(mX*mX + mY*mY + mZ*mZ);
|
|
}
|
|
|
|
float Vector3::GetMagnitudeSquare() const
|
|
{
|
|
return mX * mX + mY * mY + mZ * mZ;
|
|
}
|
|
|
|
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)
|
|
{
|
|
return Vector3(
|
|
(matrix.m00 * vec.mX + matrix.m01 * vec.mY + matrix.m02 * vec.mZ + matrix.m03),
|
|
(matrix.m10 * vec.mX + matrix.m11 * vec.mY + matrix.m12 * vec.mZ + matrix.m13),
|
|
(matrix.m20 * vec.mX + matrix.m21 * vec.mY + matrix.m22 * vec.mZ + matrix.m23));
|
|
}
|
|
|
|
Vector3 Vector3::TransformW(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;
|
|
}
|
|
|
|
///
|
|
|
|
Vector4::Vector4(float x, float y, float z, float w)
|
|
{
|
|
mX = x;
|
|
mY = y;
|
|
mZ = z;
|
|
mW = w;
|
|
} |