From 00403f993a61f37732c7b0ffbed9def2207f7f6a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Thu, 13 Mar 2025 21:58:46 -0400 Subject: [PATCH] some progress on updateMtx --- include/m/m3d/m_shadow.h | 20 ++++++++++++++++++++ src/m/m3d/m_shadow.cpp | 31 +++++++++++++++++++++++++------ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/include/m/m3d/m_shadow.h b/include/m/m3d/m_shadow.h index 75536246..7193e1c7 100644 --- a/include/m/m3d/m_shadow.h +++ b/include/m/m3d/m_shadow.h @@ -66,6 +66,26 @@ public: field_0x154 = arg; } + const mQuat_c &GetQuat() const { + return mQuat; + } + const mVec3_c &GetPostion() const { + return mPositionMaybe; + } + const f32 GetOffset() const { + return mOffsetMaybe; + } + const f32 Get0x13C() const { + return field_0x13C; + } + void Set0x13C(const f32 f) { + field_0x13C = f; + } + + const mFrustum_c &GetFrustum() const { + return mFrustum; + } + private: /* 0x00C */ EGG::Heap *mpHeap; /* 0x010 */ mShadowCircle_c *mpCircle; diff --git a/src/m/m3d/m_shadow.cpp b/src/m/m3d/m_shadow.cpp index a9b8f970..a4ce36f2 100644 --- a/src/m/m3d/m_shadow.cpp +++ b/src/m/m3d/m_shadow.cpp @@ -1,6 +1,8 @@ #include "m/m3d/m_shadow.h" +#include "c/c_math.h" #include "m/m_mtx.h" +#include "m/m_quat.h" #include "m/m_vec.h" #include "nw4r/g3d/g3d_calcview.h" #include "nw4r/g3d/g3d_draw.h" @@ -512,13 +514,30 @@ bool mShadowChild_c::setGeom(const GXTexObj *texObj, const mMtx_c &mtx, const mQ } void mShadowChild_c::updateMtx() { - // TODO all of this is broken - mVec3_c a = *(mVec3_c *)(&mQuat) + mPositionMaybe * mOffsetMaybe; - mVec3_c b = *(mVec3_c *)(&mQuat) - mPositionMaybe * field_0x13C; + const mQuat_c &q = GetQuat(); + const mVec3_c &pos = GetPostion(); + + Set0x13C(q.w); + + mVec3_c a(q.v); + + a += pos * GetOffset(); + + mVec3_c b(q.v); + b -= pos * Get0x13C(); + + const mVec3_c *up; + if (cM::isZero((a - b).squareMagXZ())) { + up = &mVec3_c::Ez; + } else { + up = &mVec3_c::Ey; + } + mMtx_c mtx; - C_MTXLookAt(mtx.m, b, !(fabsf((a - b).squareMagXZ()) <= FLT_EPSILON) ? mVec3_c::Ez : mVec3_c::Ey, a); - f32 f = field_0x13C; - mFrustum.set(f, -f, -f, f, f, f + mOffsetMaybe, mtx, true); + C_MTXLookAt(mtx.m, a, *up, b); + + const f32 f = Get0x13C(); + mFrustum.set(f, -f, -f, f, f, f + GetOffset(), mtx, true); } void mShadowChild_c::drawMdl() {