From b524551c43301f5022a1f8e3a0a6b5e7f40cc346 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 27 Dec 2025 21:16:35 +0100 Subject: [PATCH] Consolidate certain coordinate conversions --- include/d/d_vec.h | 29 +++++++++++++++++++++++++++ src/REL/d/a/obj/d_a_obj_grave.cpp | 11 +++------- src/REL/d/a/obj/d_a_obj_ivy_rope.cpp | 22 ++++---------------- src/REL/d/a/obj/d_a_obj_shed.cpp | 11 +++------- src/REL/d/a/obj/d_a_obj_warp_hole.cpp | 9 ++------- src/d/a/obj/d_a_obj_fairy.cpp | 14 +++---------- src/d/lyt/d_lyt_map.cpp | 5 +---- src/d/lyt/d_lyt_map_markers.cpp | 8 ++------ 8 files changed, 47 insertions(+), 62 deletions(-) create mode 100644 include/d/d_vec.h diff --git a/include/d/d_vec.h b/include/d/d_vec.h new file mode 100644 index 00000000..18fdd628 --- /dev/null +++ b/include/d/d_vec.h @@ -0,0 +1,29 @@ +#ifndef D_VEC_H +#define D_VEC_H + +#include "m/m_angle.h" +#include "m/m_vec.h" + +/** + * @brief Gets a point on a XZ circle. + * + * @param center the circle center. Will also hold the result. + * @param angle the Y angle. + * @param radius the circle radius. + */ +inline static void getXZCirclePoint(mVec3_c ¢er, const mAng &angle, f32 radius) { + center.x += radius * angle.sin(); + center.z += radius * angle.cos(); +} + +/** + * @brief Converts a 2D vector to a 3D vector holding the original's vector coordinates in its XY components. + * + * @param v The 2D vector + * @return mVec3_c The 3D vector + */ +inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { + return mVec3_c(v.x, v.y, 0.0f); +} + +#endif diff --git a/src/REL/d/a/obj/d_a_obj_grave.cpp b/src/REL/d/a/obj/d_a_obj_grave.cpp index 89f2bd47..e2cfac2e 100644 --- a/src/REL/d/a/obj/d_a_obj_grave.cpp +++ b/src/REL/d/a/obj/d_a_obj_grave.cpp @@ -9,6 +9,7 @@ #include "d/col/cc/d_cc_s.h" #include "d/d_sc_game.h" #include "d/d_stage.h" +#include "d/d_vec.h" #include "d/flag/sceneflag_manager.h" #include "d/snd/d_snd_wzsound.h" #include "f/f_base.h" @@ -76,12 +77,6 @@ bool dAcOGrave_c::createHeap() { return !mBgW.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, &mScale); } -// copy from d_a_obj_fairy - TODO move it to a shared file -inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) { - target.x += factor * rot.sin(); - target.z += factor * rot.cos(); -} - int dAcOGrave_c::create() { mShouldGlow = getFromParams(0, 3) == 0; mSceneflag = getFromParams(2, 0xFF); @@ -103,7 +98,7 @@ int dAcOGrave_c::create() { } field_0x7F6 = false; mOrigPos2 = mPosition; - vecCylCalc(mOrigPos2, mRotation.y.mVal + 0x8000, dAcPy_c::sPushRelatedConstant); + getXZCirclePoint(mOrigPos2, mRotation.y.mVal + 0x8000, dAcPy_c::sPushRelatedConstant); mPosition.set(mOrigPos2.x, mOrigPos2.y, mOrigPos2.z); mOldPosition.set(mOrigPos2.x, mOrigPos2.y, mOrigPos2.z); } @@ -167,7 +162,7 @@ void dAcOGrave_c::executeState_Wait() { s32 diff = getXZAngleToPlayer().absDiff(mRotation.y); if (field_0x7F6) { mOrigPos2 = mPosition; - vecCylCalc(mOrigPos2, mAngle.y, dAcPy_c::sPushRelatedConstant); + getXZCirclePoint(mOrigPos2, mAngle.y, dAcPy_c::sPushRelatedConstant); if ((mPush && (s16)diff < 0x2000) || (mPull && (s16)diff > 0x6000)) { field_0x7F6 = false; mStateMgr.changeState(StateID_Move); diff --git a/src/REL/d/a/obj/d_a_obj_ivy_rope.cpp b/src/REL/d/a/obj/d_a_obj_ivy_rope.cpp index bd426433..ecc294ed 100644 --- a/src/REL/d/a/obj/d_a_obj_ivy_rope.cpp +++ b/src/REL/d/a/obj/d_a_obj_ivy_rope.cpp @@ -8,6 +8,7 @@ #include "d/col/c/c_cc_d.h" #include "d/col/c/c_m3d_g_lin.h" #include "d/col/cc/d_cc_s.h" +#include "d/d_vec.h" #include "d/flag/sceneflag_manager.h" #include "d/snd/d_snd_wzsound.h" #include "egg/math/eggMath.h" @@ -22,12 +23,6 @@ #include "s/s_Math.h" #include "toBeSorted/attention.h" -// TODO inline? -inline void addAng(mVec3_c &pnt, const f32 step, const mAng &angle) { - pnt.x += step * angle.sin(); - pnt.z += step * angle.cos(); -} - SPECIAL_ACTOR_PROFILE(OBJ_IVY_ROPE, dAcOivyRope_c, fProfile::OBJ_IVY_ROPE, 0x262, 0, 2); STATE_DEFINE(dAcOivyRope_c, RopeWait); @@ -570,8 +565,7 @@ void dAcOivyRope_c::fn_256_BE80() { mPnts1[i].set(0.f, 0.f, 0.f); - // inline is required - addAng(mPnts1[i], step, angle); + getXZCirclePoint(mPnts1[i], angle, step); } } } @@ -590,14 +584,7 @@ void dAcOivyRope_c::fn_256_BFF0(int ang, f32 float0, f32 float1) { mAng angle = f; mPnts1[i].set(0.f, 0.f, 0.f); - - // inline is required - addAng(mPnts1[i], step, angle); - // mVec3_c &pnt = mPnts1[i]; - // f32 step1 = step; - // pnt.x += step1 * angle.sin(); - // pnt.z += step1 * angle.cos(); - + getXZCirclePoint(mPnts1[i], angle, step); mPnts1[i].y = float1; } } @@ -860,8 +847,7 @@ void dAcOivyRope_c::fn_256_D3D0(mVec3_c &pOut1, mVec3_c &pOut2, s16 param2, bool } mVec3_c somevec(0.f, 0.f, 0.f); - somevec.x += something * swingAngle.sin(); - somevec.z += something * swingAngle.cos(); + getXZCirclePoint(somevec, swingAngle, something); mVec3_c somevec2(0.f, -25.f, float0); PSMTXMultVec(m, somevec, somevec2); diff --git a/src/REL/d/a/obj/d_a_obj_shed.cpp b/src/REL/d/a/obj/d_a_obj_shed.cpp index d23022d2..cb6df749 100644 --- a/src/REL/d/a/obj/d_a_obj_shed.cpp +++ b/src/REL/d/a/obj/d_a_obj_shed.cpp @@ -4,6 +4,7 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_s.h" #include "d/d_stage.h" +#include "d/d_vec.h" #include "d/flag/sceneflag_manager.h" #include "f/f_base.h" #include "m/m_angle.h" @@ -19,12 +20,6 @@ SPECIAL_ACTOR_PROFILE(OBJ_SHED, dAcOShed_c, fProfile::OBJ_SHED, 0x256, 0, 6); STATE_DEFINE(dAcOShed_c, Wait); STATE_DEFINE(dAcOShed_c, Move); -// copy from d_a_obj_fairy - TODO move it to a shared file -inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) { - target.x += factor * rot.sin(); - target.z += factor * rot.cos(); -} - bool dAcOShed_c::createHeap() { void *data = CurrentStageArcManager::GetInstance()->getData("g3d/stage.brres"); mResFile = nw4r::g3d::ResFile(data); @@ -50,7 +45,7 @@ int dAcOShed_c::create() { if (flag) { mIsOpen = true; mVec = mPosition; - vecCylCalc(mVec, mRotation.y - 0x4000, 230.0f); + getXZCirclePoint(mVec, mRotation.y - 0x4000, 230.0f); mPosition = mVec; } } @@ -103,7 +98,7 @@ void dAcOShed_c::initializeState_Move() { } mAngle.y = mRotation.y + 0x4000; mVec = mPosition; - vecCylCalc(mVec, mAngle.y, 230.0f); + getXZCirclePoint(mVec, mAngle.y, 230.0f); mMoveTimer = 0x3c; } diff --git a/src/REL/d/a/obj/d_a_obj_warp_hole.cpp b/src/REL/d/a/obj/d_a_obj_warp_hole.cpp index 93ecfcc6..73228b42 100644 --- a/src/REL/d/a/obj/d_a_obj_warp_hole.cpp +++ b/src/REL/d/a/obj/d_a_obj_warp_hole.cpp @@ -5,6 +5,7 @@ #include "d/a/npc/d_a_npc_talk_kensei.h" #include "d/col/cc/d_cc_s.h" #include "d/d_sc_game.h" +#include "d/d_vec.h" #include "d/snd/d_snd_wzsound.h" #include "toBeSorted/event_manager.h" @@ -63,12 +64,6 @@ int dAcOwarpHole_c::actorExecute() { return SUCCEEDED; } -// copy from d_a_obj_fairy - TODO move it to a shared file -inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) { - target.x += factor * rot.sin(); - target.z += factor * rot.cos(); -} - int dAcOwarpHole_c::actorExecuteInEvent() { mEff.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_914_, mWorldMtx, nullptr, nullptr); holdSound(SE_WarpH_Wait); @@ -85,7 +80,7 @@ int dAcOwarpHole_c::actorExecuteInEvent() { if (advance) { dAcPy_c *link = dAcPy_c::GetLinkM(); mLinkPos = link->mPosition; - vecCylCalc(mLinkPos,cLib::targetAngleY(mPosition, link->mPosition), 330.0f); + getXZCirclePoint(mLinkPos,cLib::targetAngleY(mPosition, link->mPosition), 330.0f); } if (EventManager::isInEvent()) { if (EventManager::isCurrentEvent("BeforeLastBossBattleChicken")) { diff --git a/src/d/a/obj/d_a_obj_fairy.cpp b/src/d/a/obj/d_a_obj_fairy.cpp index 22824411..adf76ac8 100644 --- a/src/d/a/obj/d_a_obj_fairy.cpp +++ b/src/d/a/obj/d_a_obj_fairy.cpp @@ -15,6 +15,7 @@ #include "d/col/cc/d_cc_s.h" #include "d/d_player_act.h" #include "d/d_stage_mgr.h" +#include "d/d_vec.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "d/snd/d_snd_wzsound.h" #include "f/f_base.h" @@ -56,8 +57,6 @@ STATE_DEFINE(dAcOFairy_c, Cure); STATE_DEFINE(dAcOFairy_c, CureEnd); STATE_DEFINE(dAcOFairy_c, CatchDemo); -static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor); - bool dAcOFairy_c::createHeap() { void *file = getOarcResFile("PutFairy"); TRY_CREATE(mModel.create(file, "PutFairy", "PutFairy_fly", &mAllocator, 0x120)); @@ -440,7 +439,7 @@ void dAcOFairy_c::executeState_CureStart() { mCurePosition = link->mPosition; mCurePosition.y += f; - vecCylCalc(mCurePosition, mCureAngle, f); + getXZCirclePoint(mCurePosition, mCureAngle, f); mAngle.y = getXZAngleToPlayer(); @@ -579,7 +578,7 @@ void dAcOFairy_c::calcCurePosition(const f32 &xzOffsetTarget, const f32 &yOffset mCurePosition = link->mPosition; mCurePosition.y += mCurePosYOffset; - vecCylCalc(mCurePosition, mCureAngle, mCurePosXZOffset); + getXZCirclePoint(mCurePosition, mCureAngle, mCurePosXZOffset); sLib::chase(&mCurePosXZOffset, xzOffsetTarget, mCurePosXZOffsetTarget / 10.0f); sLib::chase(&mCurePosYOffset, yOffsetTarget, 2.0f); @@ -628,10 +627,3 @@ bool dAcOFairy_c::isMovingAwayFromOrigY() const { return (targetSpeedY >= 0.0f && mPosition.y - mOrigPosition.y > 0.0f) || (targetSpeedY <= 0.0f && mPosition.y - mOrigPosition.y < 0.0f); } - -// This is a repeated calculation, it correctly flips the stack order of the casts, -// and it avoids temporaries, so it's a pretty good inline candidate -inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) { - target.x += factor * rot.sin(); - target.z += factor * rot.cos(); -} diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 712de322..5d09b8a0 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -3,6 +3,7 @@ #define NEED_DIRECT_FRAMECTRL_ACCESS #include "c/c_math.h" +#include "d/d_vec.h" #include "d/d_player_act.h" #include "d/snd/d_snd_player_mgr.h" #include "toBeSorted/minigame_mgr.h" @@ -124,10 +125,6 @@ dLytMap_HIO_c::dLytMap_HIO_c() { dLytMap_HIO_c::~dLytMap_HIO_c() {} -inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { - return mVec3_c(v.x, v.y, 0.0f); -} - void dMapFootPrintsQueue_c::init() { int j = ARRAY_LENGTH(mEntries) - 1; for (int i = 0; i < (int)ARRAY_LENGTH(mEntries); i++) { diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp index 4cb3abc2..5d24a755 100644 --- a/src/d/lyt/d_lyt_map_markers.cpp +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -16,6 +16,7 @@ #include "d/d_sc_game.h" #include "d/d_stage.h" #include "d/d_stage_mgr.h" +#include "d/d_vec.h" #include "d/flag/dungeonflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/lyt/d2d.h" @@ -32,10 +33,6 @@ #include "sized_string.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" -inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { - return mVec3_c(v.x, v.y, 0.0f); -} - static bool checkHasMap() { return DungeonflagManager::sInstance->getCounterOrFlag(2, 8); } @@ -1038,8 +1035,7 @@ void dLytMapIcon01_c::draw() { for (int i = 0; i < field_0x0E13; i++) { if (mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->IsVisible()) { v2 = mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].boundingPos; - mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate( - vec2ToVec3XY(v2 + field_0x0D40) + mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate(vec2ToVec3XY(v2 + field_0x0D40) ); mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->CalculateMtx(mLyt.getDrawInfo()); mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->Draw(mLyt.getDrawInfo());