mirror of
https://github.com/AxioDL/LibCommon.git
synced 2026-03-30 11:47:23 -07:00
102 lines
2.9 KiB
C++
102 lines
2.9 KiB
C++
#include "CVector3f.h"
|
|
#include "CTransform4f.h"
|
|
#include <iomanip>
|
|
|
|
#include "Common/FileIO/IInputStream.h"
|
|
#include "Common/FileIO/IOutputStream.h"
|
|
#include "Common/Serialization/IArchive.h"
|
|
|
|
#include <fmt/format.h>
|
|
|
|
CVector3f::CVector3f(IInputStream& Input)
|
|
{
|
|
Read(Input);
|
|
}
|
|
|
|
void CVector3f::Read(IInputStream& Input)
|
|
{
|
|
X = Input.ReadF32();
|
|
Y = Input.ReadF32();
|
|
Z = Input.ReadF32();
|
|
}
|
|
|
|
void CVector3f::Write(IOutputStream& Output) const
|
|
{
|
|
Output.WriteF32(X);
|
|
Output.WriteF32(Y);
|
|
Output.WriteF32(Z);
|
|
}
|
|
|
|
void CVector3f::Serialize(IArchive& Arc)
|
|
{
|
|
Arc << SerialParameter("X", X)
|
|
<< SerialParameter("Y", Y)
|
|
<< SerialParameter("Z", Z);
|
|
}
|
|
|
|
TString CVector3f::ToString() const
|
|
{
|
|
return fmt::format("{}, {}, {}",
|
|
TString::FromFloat(X).CString(),
|
|
TString::FromFloat(Y).CString(),
|
|
TString::FromFloat(Z).CString());
|
|
}
|
|
|
|
// ************ OPERATORS ************
|
|
|
|
// VECTOR/MATRIX
|
|
CVector3f CVector3f::operator*(const CTransform4f& rkMtx) const
|
|
{
|
|
CVector3f Out;
|
|
Out.X = (X * rkMtx[0][0]) + (Y * rkMtx[1][0]) + (Z * rkMtx[2][0]);
|
|
Out.Y = (X * rkMtx[0][1]) + (Y * rkMtx[1][1]) + (Z * rkMtx[2][1]);
|
|
Out.Z = (X * rkMtx[0][2]) + (Y * rkMtx[1][2]) + (Z * rkMtx[2][2]);
|
|
return Out;
|
|
}
|
|
|
|
void CVector3f::operator*=(const CTransform4f& rkMtx)
|
|
{
|
|
*this = *this * rkMtx;
|
|
}
|
|
|
|
CVector3f CVector3f::operator*(const CMatrix4f& rkMtx) const
|
|
{
|
|
// To multiply by a Matrix4f, we consider the vector w component to be 1
|
|
CVector3f Out;
|
|
float W = (X * rkMtx[0][3]) + (Y * rkMtx[1][3]) + (Z * rkMtx[2][3]) + rkMtx[3][3];
|
|
Out.X = ((X * rkMtx[0][0]) + (Y * rkMtx[1][0]) + (Z * rkMtx[2][0]) + rkMtx[3][0]) / W;
|
|
Out.Y = ((X * rkMtx[0][1]) + (Y * rkMtx[1][1]) + (Z * rkMtx[2][1]) + rkMtx[3][1]) / W;
|
|
Out.Z = ((X * rkMtx[0][2]) + (Y * rkMtx[1][2]) + (Z * rkMtx[2][2]) + rkMtx[3][2]) / W;
|
|
return Out;
|
|
}
|
|
|
|
// ************ CONSTANTS ************
|
|
const CVector3f CVector3f::skUnitX = CVector3f(1.f, 0.f, 0.f);
|
|
const CVector3f CVector3f::skUnitY = CVector3f(0.f, 1.f, 0.f);
|
|
const CVector3f CVector3f::skUnitZ = CVector3f(0.f, 0.f, 1.f);
|
|
const CVector3f CVector3f::skRight = CVector3f::skUnitX;
|
|
const CVector3f CVector3f::skLeft = -CVector3f::skUnitX;
|
|
const CVector3f CVector3f::skForward = CVector3f::skUnitY;
|
|
const CVector3f CVector3f::skBack = -CVector3f::skUnitY;
|
|
const CVector3f CVector3f::skUp = CVector3f::skUnitZ;
|
|
const CVector3f CVector3f::skDown = -CVector3f::skUnitZ;
|
|
|
|
// ************ OTHER ************
|
|
std::ostream& operator<<(std::ostream& rOut, const CVector3f& rkVector)
|
|
{
|
|
rOut << std::setprecision(6)
|
|
<< std::fixed
|
|
<< "["
|
|
<< ((rkVector.X >= 0) ? " " : "")
|
|
<< rkVector.X
|
|
<< ", "
|
|
<< ((rkVector.Y >= 0) ? " " : "")
|
|
<< rkVector.Y
|
|
<< ", "
|
|
<< ((rkVector.Z >= 0) ? " " : "")
|
|
<< rkVector.Z
|
|
<< "]";
|
|
|
|
return rOut;
|
|
}
|