Skip to content

Commit df5bd1a

Browse files
authored
Merge pull request #291 from robojumper/vec-functions
Consolidate certain coordinate conversions
2 parents 3754ad2 + b524551 commit df5bd1a

File tree

8 files changed

+47
-62
lines changed

8 files changed

+47
-62
lines changed

include/d/d_vec.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef D_VEC_H
2+
#define D_VEC_H
3+
4+
#include "m/m_angle.h"
5+
#include "m/m_vec.h"
6+
7+
/**
8+
* @brief Gets a point on a XZ circle.
9+
*
10+
* @param center the circle center. Will also hold the result.
11+
* @param angle the Y angle.
12+
* @param radius the circle radius.
13+
*/
14+
inline static void getXZCirclePoint(mVec3_c &center, const mAng &angle, f32 radius) {
15+
center.x += radius * angle.sin();
16+
center.z += radius * angle.cos();
17+
}
18+
19+
/**
20+
* @brief Converts a 2D vector to a 3D vector holding the original's vector coordinates in its XY components.
21+
*
22+
* @param v The 2D vector
23+
* @return mVec3_c The 3D vector
24+
*/
25+
inline mVec3_c vec2ToVec3XY(const mVec2_c &v) {
26+
return mVec3_c(v.x, v.y, 0.0f);
27+
}
28+
29+
#endif

src/REL/d/a/obj/d_a_obj_grave.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "d/col/cc/d_cc_s.h"
1010
#include "d/d_sc_game.h"
1111
#include "d/d_stage.h"
12+
#include "d/d_vec.h"
1213
#include "d/flag/sceneflag_manager.h"
1314
#include "d/snd/d_snd_wzsound.h"
1415
#include "f/f_base.h"
@@ -76,12 +77,6 @@ bool dAcOGrave_c::createHeap() {
7677
return !mBgW.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, &mScale);
7778
}
7879

79-
// copy from d_a_obj_fairy - TODO move it to a shared file
80-
inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) {
81-
target.x += factor * rot.sin();
82-
target.z += factor * rot.cos();
83-
}
84-
8580
int dAcOGrave_c::create() {
8681
mShouldGlow = getFromParams(0, 3) == 0;
8782
mSceneflag = getFromParams(2, 0xFF);
@@ -103,7 +98,7 @@ int dAcOGrave_c::create() {
10398
}
10499
field_0x7F6 = false;
105100
mOrigPos2 = mPosition;
106-
vecCylCalc(mOrigPos2, mRotation.y.mVal + 0x8000, dAcPy_c::sPushRelatedConstant);
101+
getXZCirclePoint(mOrigPos2, mRotation.y.mVal + 0x8000, dAcPy_c::sPushRelatedConstant);
107102
mPosition.set(mOrigPos2.x, mOrigPos2.y, mOrigPos2.z);
108103
mOldPosition.set(mOrigPos2.x, mOrigPos2.y, mOrigPos2.z);
109104
}
@@ -167,7 +162,7 @@ void dAcOGrave_c::executeState_Wait() {
167162
s32 diff = getXZAngleToPlayer().absDiff(mRotation.y);
168163
if (field_0x7F6) {
169164
mOrigPos2 = mPosition;
170-
vecCylCalc(mOrigPos2, mAngle.y, dAcPy_c::sPushRelatedConstant);
165+
getXZCirclePoint(mOrigPos2, mAngle.y, dAcPy_c::sPushRelatedConstant);
171166
if ((mPush && (s16)diff < 0x2000) || (mPull && (s16)diff > 0x6000)) {
172167
field_0x7F6 = false;
173168
mStateMgr.changeState(StateID_Move);

src/REL/d/a/obj/d_a_obj_ivy_rope.cpp

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "d/col/c/c_cc_d.h"
99
#include "d/col/c/c_m3d_g_lin.h"
1010
#include "d/col/cc/d_cc_s.h"
11+
#include "d/d_vec.h"
1112
#include "d/flag/sceneflag_manager.h"
1213
#include "d/snd/d_snd_wzsound.h"
1314
#include "egg/math/eggMath.h"
@@ -22,12 +23,6 @@
2223
#include "s/s_Math.h"
2324
#include "toBeSorted/attention.h"
2425

25-
// TODO inline?
26-
inline void addAng(mVec3_c &pnt, const f32 step, const mAng &angle) {
27-
pnt.x += step * angle.sin();
28-
pnt.z += step * angle.cos();
29-
}
30-
3126
SPECIAL_ACTOR_PROFILE(OBJ_IVY_ROPE, dAcOivyRope_c, fProfile::OBJ_IVY_ROPE, 0x262, 0, 2);
3227

3328
STATE_DEFINE(dAcOivyRope_c, RopeWait);
@@ -570,8 +565,7 @@ void dAcOivyRope_c::fn_256_BE80() {
570565

571566
mPnts1[i].set(0.f, 0.f, 0.f);
572567

573-
// inline is required
574-
addAng(mPnts1[i], step, angle);
568+
getXZCirclePoint(mPnts1[i], angle, step);
575569
}
576570
}
577571
}
@@ -590,14 +584,7 @@ void dAcOivyRope_c::fn_256_BFF0(int ang, f32 float0, f32 float1) {
590584
mAng angle = f;
591585

592586
mPnts1[i].set(0.f, 0.f, 0.f);
593-
594-
// inline is required
595-
addAng(mPnts1[i], step, angle);
596-
// mVec3_c &pnt = mPnts1[i];
597-
// f32 step1 = step;
598-
// pnt.x += step1 * angle.sin();
599-
// pnt.z += step1 * angle.cos();
600-
587+
getXZCirclePoint(mPnts1[i], angle, step);
601588
mPnts1[i].y = float1;
602589
}
603590
}
@@ -860,8 +847,7 @@ void dAcOivyRope_c::fn_256_D3D0(mVec3_c &pOut1, mVec3_c &pOut2, s16 param2, bool
860847
}
861848

862849
mVec3_c somevec(0.f, 0.f, 0.f);
863-
somevec.x += something * swingAngle.sin();
864-
somevec.z += something * swingAngle.cos();
850+
getXZCirclePoint(somevec, swingAngle, something);
865851

866852
mVec3_c somevec2(0.f, -25.f, float0);
867853
PSMTXMultVec(m, somevec, somevec2);

src/REL/d/a/obj/d_a_obj_shed.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "d/a/obj/d_a_obj_base.h"
55
#include "d/col/bg/d_bg_s.h"
66
#include "d/d_stage.h"
7+
#include "d/d_vec.h"
78
#include "d/flag/sceneflag_manager.h"
89
#include "f/f_base.h"
910
#include "m/m_angle.h"
@@ -19,12 +20,6 @@ SPECIAL_ACTOR_PROFILE(OBJ_SHED, dAcOShed_c, fProfile::OBJ_SHED, 0x256, 0, 6);
1920
STATE_DEFINE(dAcOShed_c, Wait);
2021
STATE_DEFINE(dAcOShed_c, Move);
2122

22-
// copy from d_a_obj_fairy - TODO move it to a shared file
23-
inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) {
24-
target.x += factor * rot.sin();
25-
target.z += factor * rot.cos();
26-
}
27-
2823
bool dAcOShed_c::createHeap() {
2924
void *data = CurrentStageArcManager::GetInstance()->getData("g3d/stage.brres");
3025
mResFile = nw4r::g3d::ResFile(data);
@@ -50,7 +45,7 @@ int dAcOShed_c::create() {
5045
if (flag) {
5146
mIsOpen = true;
5247
mVec = mPosition;
53-
vecCylCalc(mVec, mRotation.y - 0x4000, 230.0f);
48+
getXZCirclePoint(mVec, mRotation.y - 0x4000, 230.0f);
5449
mPosition = mVec;
5550
}
5651
}
@@ -103,7 +98,7 @@ void dAcOShed_c::initializeState_Move() {
10398
}
10499
mAngle.y = mRotation.y + 0x4000;
105100
mVec = mPosition;
106-
vecCylCalc(mVec, mAngle.y, 230.0f);
101+
getXZCirclePoint(mVec, mAngle.y, 230.0f);
107102
mMoveTimer = 0x3c;
108103
}
109104

src/REL/d/a/obj/d_a_obj_warp_hole.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "d/a/npc/d_a_npc_talk_kensei.h"
66
#include "d/col/cc/d_cc_s.h"
77
#include "d/d_sc_game.h"
8+
#include "d/d_vec.h"
89
#include "d/snd/d_snd_wzsound.h"
910
#include "toBeSorted/event_manager.h"
1011

@@ -63,12 +64,6 @@ int dAcOwarpHole_c::actorExecute() {
6364
return SUCCEEDED;
6465
}
6566

66-
// copy from d_a_obj_fairy - TODO move it to a shared file
67-
inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) {
68-
target.x += factor * rot.sin();
69-
target.z += factor * rot.cos();
70-
}
71-
7267
int dAcOwarpHole_c::actorExecuteInEvent() {
7368
mEff.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_914_, mWorldMtx, nullptr, nullptr);
7469
holdSound(SE_WarpH_Wait);
@@ -85,7 +80,7 @@ int dAcOwarpHole_c::actorExecuteInEvent() {
8580
if (advance) {
8681
dAcPy_c *link = dAcPy_c::GetLinkM();
8782
mLinkPos = link->mPosition;
88-
vecCylCalc(mLinkPos,cLib::targetAngleY(mPosition, link->mPosition), 330.0f);
83+
getXZCirclePoint(mLinkPos,cLib::targetAngleY(mPosition, link->mPosition), 330.0f);
8984
}
9085
if (EventManager::isInEvent()) {
9186
if (EventManager::isCurrentEvent("BeforeLastBossBattleChicken")) {

src/d/a/obj/d_a_obj_fairy.cpp

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "d/col/cc/d_cc_s.h"
1616
#include "d/d_player_act.h"
1717
#include "d/d_stage_mgr.h"
18+
#include "d/d_vec.h"
1819
#include "d/snd/d_snd_small_effect_mgr.h"
1920
#include "d/snd/d_snd_wzsound.h"
2021
#include "f/f_base.h"
@@ -56,8 +57,6 @@ STATE_DEFINE(dAcOFairy_c, Cure);
5657
STATE_DEFINE(dAcOFairy_c, CureEnd);
5758
STATE_DEFINE(dAcOFairy_c, CatchDemo);
5859

59-
static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor);
60-
6160
bool dAcOFairy_c::createHeap() {
6261
void *file = getOarcResFile("PutFairy");
6362
TRY_CREATE(mModel.create(file, "PutFairy", "PutFairy_fly", &mAllocator, 0x120));
@@ -440,7 +439,7 @@ void dAcOFairy_c::executeState_CureStart() {
440439

441440
mCurePosition = link->mPosition;
442441
mCurePosition.y += f;
443-
vecCylCalc(mCurePosition, mCureAngle, f);
442+
getXZCirclePoint(mCurePosition, mCureAngle, f);
444443

445444
mAngle.y = getXZAngleToPlayer();
446445

@@ -579,7 +578,7 @@ void dAcOFairy_c::calcCurePosition(const f32 &xzOffsetTarget, const f32 &yOffset
579578

580579
mCurePosition = link->mPosition;
581580
mCurePosition.y += mCurePosYOffset;
582-
vecCylCalc(mCurePosition, mCureAngle, mCurePosXZOffset);
581+
getXZCirclePoint(mCurePosition, mCureAngle, mCurePosXZOffset);
583582

584583
sLib::chase(&mCurePosXZOffset, xzOffsetTarget, mCurePosXZOffsetTarget / 10.0f);
585584
sLib::chase(&mCurePosYOffset, yOffsetTarget, 2.0f);
@@ -628,10 +627,3 @@ bool dAcOFairy_c::isMovingAwayFromOrigY() const {
628627
return (targetSpeedY >= 0.0f && mPosition.y - mOrigPosition.y > 0.0f) ||
629628
(targetSpeedY <= 0.0f && mPosition.y - mOrigPosition.y < 0.0f);
630629
}
631-
632-
// This is a repeated calculation, it correctly flips the stack order of the casts,
633-
// and it avoids temporaries, so it's a pretty good inline candidate
634-
inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) {
635-
target.x += factor * rot.sin();
636-
target.z += factor * rot.cos();
637-
}

src/d/lyt/d_lyt_map.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#define NEED_DIRECT_FRAMECTRL_ACCESS
44

55
#include "c/c_math.h"
6+
#include "d/d_vec.h"
67
#include "d/d_player_act.h"
78
#include "d/snd/d_snd_player_mgr.h"
89
#include "toBeSorted/minigame_mgr.h"
@@ -124,10 +125,6 @@ dLytMap_HIO_c::dLytMap_HIO_c() {
124125

125126
dLytMap_HIO_c::~dLytMap_HIO_c() {}
126127

127-
inline mVec3_c vec2ToVec3XY(const mVec2_c &v) {
128-
return mVec3_c(v.x, v.y, 0.0f);
129-
}
130-
131128
void dMapFootPrintsQueue_c::init() {
132129
int j = ARRAY_LENGTH(mEntries) - 1;
133130
for (int i = 0; i < (int)ARRAY_LENGTH(mEntries); i++) {

src/d/lyt/d_lyt_map_markers.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "d/d_sc_game.h"
1717
#include "d/d_stage.h"
1818
#include "d/d_stage_mgr.h"
19+
#include "d/d_vec.h"
1920
#include "d/flag/dungeonflag_manager.h"
2021
#include "d/flag/storyflag_manager.h"
2122
#include "d/lyt/d2d.h"
@@ -32,10 +33,6 @@
3233
#include "sized_string.h"
3334
#include "toBeSorted/arc_managers/layout_arc_manager.h"
3435

35-
inline mVec3_c vec2ToVec3XY(const mVec2_c &v) {
36-
return mVec3_c(v.x, v.y, 0.0f);
37-
}
38-
3936
static bool checkHasMap() {
4037
return DungeonflagManager::sInstance->getCounterOrFlag(2, 8);
4138
}
@@ -1038,8 +1035,7 @@ void dLytMapIcon01_c::draw() {
10381035
for (int i = 0; i < field_0x0E13; i++) {
10391036
if (mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->IsVisible()) {
10401037
v2 = mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].boundingPos;
1041-
mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate(
1042-
vec2ToVec3XY(v2 + field_0x0D40)
1038+
mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate(vec2ToVec3XY(v2 + field_0x0D40)
10431039
);
10441040
mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->CalculateMtx(mLyt.getDrawInfo());
10451041
mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->Draw(mLyt.getDrawInfo());

0 commit comments

Comments
 (0)