mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-08-09 18:59:08 +00:00
CTransform4f matches and fixes
This commit is contained in:
parent
e1867b885e
commit
4c96328fa4
@ -11,8 +11,9 @@ class CMatrix3f {
|
|||||||
static const CMatrix3f sIdentity;
|
static const CMatrix3f sIdentity;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CMatrix3f(float _m00, float _m01, float _m02, float _m10, float _m11, float _m12, float _m20,
|
CMatrix3f(const float _m00, const float _m01, const float _m02, const float _m10,
|
||||||
float _m21, float _m22)
|
const float _m11, const float _m12, const float _m20, const float _m21,
|
||||||
|
const float _m22)
|
||||||
: m00(_m00)
|
: m00(_m00)
|
||||||
, m01(_m01)
|
, m01(_m01)
|
||||||
, m02(_m02)
|
, m02(_m02)
|
||||||
|
@ -10,56 +10,77 @@ typedef const float (*ConstMtxPtr)[4];
|
|||||||
class CInputStream;
|
class CInputStream;
|
||||||
class CMatrix3f;
|
class CMatrix3f;
|
||||||
class CRelAngle;
|
class CRelAngle;
|
||||||
|
class CUnitVector3f;
|
||||||
|
|
||||||
class CTransform4f {
|
class CTransform4f {
|
||||||
public:
|
public:
|
||||||
CTransform4f(const CVector3f& m0, const CVector3f& m1, const CVector3f& m2, const CVector3f& pos)
|
CTransform4f(const CVector3f& m0, const CVector3f& m1, const CVector3f& m2, const CVector3f& pos);
|
||||||
: m0(m0), posX(pos.GetX()), m1(m1), posY(pos.GetY()), m2(m2), posZ(pos.GetZ()) {}
|
CTransform4f(const float _m00, const float _m01, const float _m02, const float _m03,
|
||||||
CTransform4f(float, float, float, float, float, float, float, float, float, float, float, float);
|
const float _m10, const float _m11, const float _m12, const float _m13,
|
||||||
|
const float _m20, const float _m21, const float _m22, const float _m23)
|
||||||
|
: m00(_m00)
|
||||||
|
, m01(_m01)
|
||||||
|
, m02(_m02)
|
||||||
|
, m03(_m03)
|
||||||
|
, m10(_m10)
|
||||||
|
, m11(_m11)
|
||||||
|
, m12(_m12)
|
||||||
|
, m13(_m13)
|
||||||
|
, m20(_m20)
|
||||||
|
, m21(_m21)
|
||||||
|
, m22(_m22)
|
||||||
|
, m23(_m23) {}
|
||||||
|
|
||||||
CTransform4f(CInputStream& in);
|
CTransform4f(CInputStream& in);
|
||||||
CTransform4f(const CMatrix3f& rotation, const CVector3f& translation);
|
CTransform4f(const CMatrix3f& rotation, const CVector3f& translation);
|
||||||
CTransform4f(const CTransform4f& other);
|
CTransform4f(const CTransform4f& other);
|
||||||
CTransform4f& operator=(const CTransform4f& other);
|
CTransform4f& operator=(const CTransform4f& other);
|
||||||
|
|
||||||
CVector3f GetTranslation() const { return CVector3f(posX, posY, posZ); }
|
CVector3f GetTranslation() const { return CVector3f(m03, m13, m23); }
|
||||||
CVector3f GetRight() const { return CVector3f(m0.GetX(), m1.GetX(), m2.GetX()); }
|
CVector3f GetRight() const { return CVector3f(m00, m10, m20); }
|
||||||
CVector3f GetForward() const { return CVector3f(m0.GetY(), m1.GetY(), m2.GetY()); }
|
const CVector3f GetForward() const { return CVector3f(m01, m11, m21); }
|
||||||
CVector3f GetUp() const { return CVector3f(m0.GetZ(), m1.GetZ(), m2.GetZ()); }
|
CVector3f GetUp() const { return CVector3f(m02, m12, m22); }
|
||||||
ConstMtxPtr GetCStyleMatrix() const { return reinterpret_cast< ConstMtxPtr >(this); }
|
ConstMtxPtr GetCStyleMatrix() const { return reinterpret_cast< ConstMtxPtr >(this); }
|
||||||
|
|
||||||
CMatrix3f BuildMatrix3f() const;
|
CMatrix3f BuildMatrix3f() const;
|
||||||
float Get00() const { return m0.GetX(); }
|
const float Get00() const { return m00; }
|
||||||
float Get01() const { return m0.GetY(); }
|
const float Get01() const { return m01; }
|
||||||
float Get02() const { return m0.GetZ(); }
|
const float Get02() const { return m02; }
|
||||||
float Get03() const { return posX; }
|
const float Get03() const { return m03; }
|
||||||
float Get10() const { return m1.GetX(); }
|
const float Get10() const { return m10; }
|
||||||
float Get11() const { return m1.GetY(); }
|
const float Get11() const { return m11; }
|
||||||
float Get12() const { return m1.GetZ(); }
|
const float Get12() const { return m12; }
|
||||||
float Get13() const { return posY; }
|
const float Get13() const { return m13; }
|
||||||
float Get20() const { return m2.GetX(); }
|
const float Get20() const { return m20; }
|
||||||
float Get21() const { return m2.GetY(); }
|
const float Get21() const { return m21; }
|
||||||
float Get22() const { return m2.GetZ(); }
|
const float Get22() const { return m22; }
|
||||||
float Get23() const { return posZ; }
|
const float Get23() const { return m23; }
|
||||||
CVector3f GetColumn(EDimX dim) const { return CVector3f(m0[dim], m1[dim], m2[dim]); }
|
const CVector3f GetColumn(EDimX dim) const { return CVector3f(m00, m10, m20); }
|
||||||
CVector3f GetColumn(EDimY dim) const { return CVector3f(m0[dim], m1[dim], m2[dim]); }
|
const CVector3f GetColumn(EDimY dim) const { return CVector3f(m01, m11, m21); }
|
||||||
CVector3f GetColumn(EDimZ dim) const { return CVector3f(m0[dim], m1[dim], m2[dim]); }
|
const CVector3f GetColumn(EDimZ dim) const { return CVector3f(m02, m12, m22); }
|
||||||
// GetColumn__12CTransform4fCFi
|
void ScaleBy(const float scale);
|
||||||
// GetCStyleMatrix__12CTransform4fCFv
|
// GetCStyleMatrix__12CTransform4fCFv
|
||||||
CTransform4f GetInverse() const;
|
CTransform4f GetInverse() const;
|
||||||
CTransform4f GetQuickInverse() const;
|
CTransform4f GetQuickInverse() const;
|
||||||
CTransform4f GetRotation() const;
|
CTransform4f GetRotation() const;
|
||||||
inline const CVector3f& GetRow(EDimX dim) const { return m0; }
|
inline const CVector3f& GetRow(EDimX dim) const {
|
||||||
inline const CVector3f& GetRow(EDimY dim) const { return m1; }
|
return *reinterpret_cast< const CVector3f* >(&m00);
|
||||||
inline const CVector3f& GetRow(EDimZ dim) const { return m2; }
|
}
|
||||||
|
inline const CVector3f& GetRow(EDimY dim) const {
|
||||||
|
return *reinterpret_cast< const CVector3f* >(&m10);
|
||||||
|
}
|
||||||
|
inline const CVector3f& GetRow(EDimZ dim) const {
|
||||||
|
return *reinterpret_cast< const CVector3f* >(&m20);
|
||||||
|
}
|
||||||
inline const CVector3f& GetRow(int i) const {
|
inline const CVector3f& GetRow(int i) const {
|
||||||
return *(reinterpret_cast< const CVector3f* >(reinterpret_cast< const float* >(&m0) + i * 4));
|
return *(reinterpret_cast< const CVector3f* >(reinterpret_cast< const float* >(&m00) + i * 4));
|
||||||
}
|
}
|
||||||
// GetUp__12CTransform4fCFv
|
// GetUp__12CTransform4fCFv
|
||||||
static CTransform4f LookAt(const CVector3f& pos, const CVector3f& lookPos,
|
static CTransform4f LookAt(const CVector3f& pos, const CVector3f& lookPos,
|
||||||
const CVector3f& up = CVector3f::Up());
|
const CVector3f& up = CVector3f::Up());
|
||||||
// MakeRotationsBasedOnY__12CTransform4fFRC13CUnitVector3f
|
static CTransform4f MakeRotationsBasedOnY(const CUnitVector3f& yRot);
|
||||||
CTransform4f MultiplyIgnoreTranslation(const CTransform4f& other) const;
|
CTransform4f MultiplyIgnoreTranslation(const CTransform4f& other) const;
|
||||||
// Orthonormalize__12CTransform4fFv
|
void Orthonormalize();
|
||||||
CVector3f Rotate(const CVector3f& in) const;
|
CVector3f Rotate(const CVector3f& in) const;
|
||||||
void RotateLocalX(const CRelAngle& angle);
|
void RotateLocalX(const CRelAngle& angle);
|
||||||
void RotateLocalY(const CRelAngle& angle);
|
void RotateLocalY(const CRelAngle& angle);
|
||||||
@ -70,25 +91,24 @@ public:
|
|||||||
static CTransform4f Scale(float);
|
static CTransform4f Scale(float);
|
||||||
static CTransform4f Scale(float, float, float);
|
static CTransform4f Scale(float, float, float);
|
||||||
static CTransform4f Scale(const CVector3f&);
|
static CTransform4f Scale(const CVector3f&);
|
||||||
// ScaleBy__12CTransform4fFf
|
|
||||||
// SetRotation__12CTransform4fFRC12CTransform4f
|
// SetRotation__12CTransform4fFRC12CTransform4f
|
||||||
// SetRotation__12CTransform4fFRC9CMatrix3f
|
// SetRotation__12CTransform4fFRC9CMatrix3f
|
||||||
CVector3f TransposeMultiply(const CVector3f& in) const {
|
CVector3f TransposeMultiply(const CVector3f& in) const {
|
||||||
return TransposeRotate(CVector3f(in.GetX() - posX, in.GetY() - posY, in.GetZ() - posZ));
|
return TransposeRotate(CVector3f(in.GetX() - m03, in.GetY() - m13, in.GetZ() - m23));
|
||||||
}
|
}
|
||||||
CVector3f TransposeRotate(const CVector3f& in) const;
|
CVector3f TransposeRotate(const CVector3f& in) const;
|
||||||
|
|
||||||
void SetTranslation(const CVector3f& vec) {
|
void SetTranslation(const CVector3f& vec) {
|
||||||
posX = vec.GetX();
|
m03 = vec.GetX();
|
||||||
posY = vec.GetY();
|
m13 = vec.GetY();
|
||||||
posZ = vec.GetZ();
|
m23 = vec.GetZ();
|
||||||
}
|
}
|
||||||
void AddTranslation(const CVector3f& vec) {
|
void AddTranslation(const CVector3f& vec) {
|
||||||
posX += vec.GetX();
|
m03 += vec.GetX();
|
||||||
posY += vec.GetY();
|
m13 += vec.GetY();
|
||||||
posZ += vec.GetZ();
|
m23 += vec.GetZ();
|
||||||
}
|
}
|
||||||
void AddTranslationZ(float z) { posZ += z; }
|
void AddTranslationZ(float z) { m23 += z; }
|
||||||
|
|
||||||
CTransform4f& operator*=(const CTransform4f& other) {
|
CTransform4f& operator*=(const CTransform4f& other) {
|
||||||
*this = *this * other;
|
*this = *this * other;
|
||||||
@ -105,17 +125,23 @@ public:
|
|||||||
static const CTransform4f& Identity() { return sIdentity; }
|
static const CTransform4f& Identity() { return sIdentity; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CVector3f m0;
|
float m00;
|
||||||
float posX;
|
float m01;
|
||||||
CVector3f m1;
|
float m02;
|
||||||
float posY;
|
float m03;
|
||||||
CVector3f m2;
|
float m10;
|
||||||
float posZ;
|
float m11;
|
||||||
|
float m12;
|
||||||
|
float m13;
|
||||||
|
float m20;
|
||||||
|
float m21;
|
||||||
|
float m22;
|
||||||
|
float m23;
|
||||||
|
|
||||||
static CTransform4f sIdentity;
|
static const CTransform4f sIdentity;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool operator==(const CTransform4f& lhs, const CTransform4f& rhs);
|
bool operator==(const CTransform4f& lhs, const CTransform4f& rhs);
|
||||||
|
|
||||||
CHECK_SIZEOF(CTransform4f, 0x30)
|
CHECK_SIZEOF(CTransform4f, 0x30)
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ public:
|
|||||||
|
|
||||||
CVector2f ToVec2f() const { return CVector2f(mX, mY); }
|
CVector2f ToVec2f() const { return CVector2f(mX, mY); }
|
||||||
|
|
||||||
static float Dot(const CVector3f& a, const CVector3f& b) {
|
static const float Dot(const CVector3f& a, const CVector3f& b) {
|
||||||
return (a.GetX() * b.GetX()) + (a.GetY() * b.GetY()) + (a.GetZ() * b.GetZ());
|
return (a.GetX() * b.GetX()) + (a.GetY() * b.GetY()) + (a.GetZ() * b.GetZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@ static volatile BOOL __AR_init_flag = FALSE;
|
|||||||
|
|
||||||
static void __ARHandler(__OSInterrupt interrupt, OSContext* context);
|
static void __ARHandler(__OSInterrupt interrupt, OSContext* context);
|
||||||
static void __ARChecksize(void);
|
static void __ARChecksize(void);
|
||||||
static void __ARClearArea(u32 start_addr, u32 length);
|
|
||||||
|
|
||||||
ARCallback ARRegisterDMACallback(ARCallback callback) {
|
ARCallback ARRegisterDMACallback(ARCallback callback) {
|
||||||
ARCallback oldCb;
|
ARCallback oldCb;
|
||||||
|
@ -446,9 +446,11 @@ rstl::optional_object< TLockedToken< CGenDescription > > CProjectileWeapon::Coll
|
|||||||
if (useTarget && posToTarget.CanBeNormalized()) {
|
if (useTarget && posToTarget.CanBeNormalized()) {
|
||||||
SetWorldSpaceOrientation(CTransform4f::LookAt(CVector3f::Zero(), posToTarget.AsNormalized()));
|
SetWorldSpaceOrientation(CTransform4f::LookAt(CVector3f::Zero(), posToTarget.AsNormalized()));
|
||||||
} else {
|
} else {
|
||||||
CVector3f col = GetTransform().GetColumn(kDY);
|
const CTransform4f& xf = GetTransform();
|
||||||
CVector3f lookPos = (CVector3f::Dot(normal, col) * 2.f) * normal;
|
const CVector3f forward = xf.GetForward();
|
||||||
CVector3f lookPos2 = col - lookPos;
|
float mag = CVector3f::Dot(normal, forward) * 2.f;
|
||||||
|
CVector3f lookPos = mag * normal;
|
||||||
|
CVector3f lookPos2 = xf.GetForward() - lookPos;
|
||||||
CTransform4f lookXf = CTransform4f::LookAt(CVector3f::Zero(), lookPos2, normal);
|
CTransform4f lookXf = CTransform4f::LookAt(CVector3f::Zero(), lookPos2, normal);
|
||||||
SetWorldSpaceOrientation(lookXf);
|
SetWorldSpaceOrientation(lookXf);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user