mirror of
https://github.com/zeldaret/ss
synced 2026-05-28 00:15:59 -04:00
Merge pull request #291 from robojumper/vec-functions
Consolidate certain coordinate conversions
This commit is contained in:
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user