Merge branch 'main' into d_lyt_shop

This commit is contained in:
robojumper
2026-02-01 20:46:00 +01:00
committed by GitHub
623 changed files with 5693 additions and 1345 deletions
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -6,7 +6,7 @@ STATE_DEFINE(dAcKanban_c, Wait);
STATE_DEFINE(dAcKanban_c, Message);
STATE_DEFINE(dAcKanban_c, PullOut);
dAcKanban_c::dAcKanban_c() : mStateMgr(*this, sStateID::null) {}
dAcKanban_c::dAcKanban_c() : mStateMgr(*this) {}
dAcKanban_c::~dAcKanban_c() {}
void dAcKanban_c::initializeState_Wait() {}
+4 -4
View File
@@ -265,7 +265,7 @@ int dAcEsm_c::actorCreate() {
mAnmTexPat.setFrame(anim_frame, 0);
setInteractionFlags(0x40);
setInteractionFlags(INTERACT_0x40);
fn_187_44C0();
@@ -369,7 +369,7 @@ int dAcEsm_c::actorExecute() {
if (timeCheck != 0) {
if (field_0xBBF == 3) {
if (checkInteractionFlags(4)) {
if (checkInteractionFlags(INTERACT_0x4)) {
fn_800306d0();
}
return SUCCEEDED;
@@ -400,7 +400,7 @@ int dAcEsm_c::actorExecute() {
}
if (field_0xBBF == 3 && mTimeArea.isNearZero()) {
if (checkInteractionFlags(4)) {
if (checkInteractionFlags(INTERACT_0x4)) {
fn_800306d0();
}
return SUCCEEDED;
@@ -1430,7 +1430,7 @@ void dAcEsm_c::fn_187_6C20(bool param0) {
mSph.SetAtFlagsUpper(0);
sTimer = 0;
setInteractionFlags(4);
setInteractionFlags(INTERACT_0x4);
fn_187_44C0();
field_0xBAC = 60;
+1 -1
View File
@@ -6,7 +6,7 @@ STATE_DEFINE(dAcObamboo_c, Wait);
STATE_DEFINE(dAcObamboo_c, Fall);
STATE_DEFINE(dAcObamboo_c, CutMark);
dAcObamboo_c::dAcObamboo_c() : mStateMgr(*this, sStateID::null) {}
dAcObamboo_c::dAcObamboo_c() : mStateMgr(*this) {}
dAcObamboo_c::~dAcObamboo_c() {}
void dAcObamboo_c::initializeState_Wait() {}
+1 -1
View File
@@ -8,7 +8,7 @@ STATE_DEFINE(dAcOcannonCover_c, Shake);
STATE_DEFINE(dAcOcannonCover_c, Close);
STATE_DEFINE(dAcOcannonCover_c, Play);
dAcOcannonCover_c::dAcOcannonCover_c() : mStateMgr(*this, sStateID::null) {}
dAcOcannonCover_c::dAcOcannonCover_c() : mStateMgr(*this) {}
dAcOcannonCover_c::~dAcOcannonCover_c() {}
void dAcOcannonCover_c::initializeState_Wait() {}
+1 -1
View File
@@ -10,7 +10,7 @@ STATE_DEFINE(dAcOClef_c, PathMove);
STATE_DEFINE(dAcOClef_c, Gravitate);
STATE_DEFINE(dAcOClef_c, Die);
dAcOClef_c::dAcOClef_c() : mStateMgr(*this, sStateID::null) {}
dAcOClef_c::dAcOClef_c() : mStateMgr(*this) {}
dAcOClef_c::~dAcOClef_c() {}
void dAcOClef_c::initializeState_WaitPhantom() {}
+1 -1
View File
@@ -12,7 +12,7 @@ STATE_DEFINE(dAcOFence_c, WaitClose);
STATE_DEFINE(dAcOFence_c, Close);
STATE_DEFINE(dAcOFence_c, RequestConfineEvent);
dAcOFence_c::dAcOFence_c() : mStateMgr(*this, sStateID::null) {}
dAcOFence_c::dAcOFence_c() : mStateMgr(*this) {}
dAcOFence_c::~dAcOFence_c() {}
void dAcOFence_c::initializeState_WaitOpen() {}
+1 -1
View File
@@ -5,7 +5,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_FORTUNE_RING, dAcOfortuneRing_c, fProfile::OBJ_FORTUNE
STATE_DEFINE(dAcOfortuneRing_c, Wait);
STATE_DEFINE(dAcOfortuneRing_c, Play);
dAcOfortuneRing_c::dAcOfortuneRing_c() : mStateMgr(*this, sStateID::null) {}
dAcOfortuneRing_c::dAcOfortuneRing_c() : mStateMgr(*this) {}
dAcOfortuneRing_c::~dAcOfortuneRing_c() {}
void dAcOfortuneRing_c::initializeState_Wait() {}
+1 -1
View File
@@ -10,7 +10,7 @@ STATE_DEFINE(dAcOgroundCover_c, AppearClose);
STATE_DEFINE(dAcOgroundCover_c, Fight);
STATE_DEFINE(dAcOgroundCover_c, Sealed);
dAcOgroundCover_c::dAcOgroundCover_c() : mStateMgr(*this, sStateID::null) {}
dAcOgroundCover_c::dAcOgroundCover_c() : mStateMgr(*this) {}
dAcOgroundCover_c::~dAcOgroundCover_c() {}
void dAcOgroundCover_c::initializeState_Wait() {}
@@ -13,7 +13,7 @@ STATE_DEFINE(dAcOItemHeartContainer_c, Fall);
STATE_DEFINE(dAcOItemHeartContainer_c, WaitGet);
STATE_DEFINE(dAcOItemHeartContainer_c, WaitGetQuake);
dAcOItemHeartContainer_c::dAcOItemHeartContainer_c() : mStateMgr(*this, sStateID::null) {}
dAcOItemHeartContainer_c::dAcOItemHeartContainer_c() : mStateMgr(*this) {}
dAcOItemHeartContainer_c::~dAcOItemHeartContainer_c() {}
void dAcOItemHeartContainer_c::initializeState_Hide() {}
@@ -5,7 +5,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_ROULETTE_ISLAND_C, dAcOrouletteIslandC_c, fProfile::OB
STATE_DEFINE(dAcOrouletteIslandC_c, Wait);
STATE_DEFINE(dAcOrouletteIslandC_c, Play);
dAcOrouletteIslandC_c::dAcOrouletteIslandC_c() : mStateMgr(*this, sStateID::null) {}
dAcOrouletteIslandC_c::dAcOrouletteIslandC_c() : mStateMgr(*this) {}
dAcOrouletteIslandC_c::~dAcOrouletteIslandC_c() {}
void dAcOrouletteIslandC_c::initializeState_Wait() {}
@@ -7,7 +7,7 @@ STATE_DEFINE(dAcOrouletteIslandR_c, Move);
STATE_DEFINE(dAcOrouletteIslandR_c, Reduce);
STATE_DEFINE(dAcOrouletteIslandR_c, End);
dAcOrouletteIslandR_c::dAcOrouletteIslandR_c() : mStateMgr(*this, sStateID::null) {}
dAcOrouletteIslandR_c::dAcOrouletteIslandR_c() : mStateMgr(*this) {}
dAcOrouletteIslandR_c::~dAcOrouletteIslandR_c() {}
void dAcOrouletteIslandR_c::initializeState_Wait() {}
+1 -1
View File
@@ -9,7 +9,7 @@ STATE_DEFINE(dAcOSave_c, Query);
STATE_DEFINE(dAcOSave_c, LightShaft);
STATE_DEFINE(dAcOSave_c, Escape);
dAcOSave_c::dAcOSave_c() : mStateMgr(*this, sStateID::null) {}
dAcOSave_c::dAcOSave_c() : mStateMgr(*this) {}
dAcOSave_c::~dAcOSave_c() {}
void dAcOSave_c::initializeState_Moss() {}
+1 -1
View File
@@ -13,7 +13,7 @@ STATE_DEFINE(dAcOSwrdPrj, SWWaitCross);
STATE_DEFINE(dAcOSwrdPrj, SWChkTri);
STATE_DEFINE(dAcOSwrdPrj, SWEnd);
dAcOSwrdPrj::dAcOSwrdPrj() : mStateMgr(*this, sStateID::null) {}
dAcOSwrdPrj::dAcOSwrdPrj() : mStateMgr(*this) {}
dAcOSwrdPrj::~dAcOSwrdPrj() {}
void dAcOSwrdPrj::initializeState_WaitHarp() {}
+1 -1
View File
@@ -4,7 +4,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_TRUCK_RAIL_COL, dAcOTruckRailCol_c, fProfile::OBJ_TRUC
STATE_DEFINE(dAcOTruckRailCol_c, Wait);
dAcOTruckRailCol_c::dAcOTruckRailCol_c() : mStateMgr(*this, sStateID::null) {}
dAcOTruckRailCol_c::dAcOTruckRailCol_c() : mStateMgr(*this) {}
dAcOTruckRailCol_c::~dAcOTruckRailCol_c() {}
void dAcOTruckRailCol_c::initializeState_Wait() {}
+1 -1
View File
@@ -86,7 +86,7 @@ int dAcOwarpHole_c::actorExecuteInEvent() {
if (EventManager::isCurrentEvent("BeforeLastBossBattleChicken")) {
dAcPy_c* player = dAcPy_c::GetLinkM();
player->vt_0x2AC();
player->triggerMoveEventMaybe(2, 0, 0, mLinkPos, 0, 0, 0);
player->triggerMoveEventMaybe(2, 0, 0, &mLinkPos, 0, 0, 0);
}
}
if (dAcPy_c::GetLinkM()->mPosition.absXZTo(mLinkPos) < 10.0f) {
+1 -1
View File
@@ -15,7 +15,7 @@ STATE_DEFINE(dLytSeekerStone_c, MovieFadeOut);
STATE_DEFINE(dLytSeekerStone_c, MovieFadeIn);
STATE_DEFINE(dLytSeekerStone_c, Out);
dLytSeekerStone_c::dLytSeekerStone_c() : mStateMgr(*this, sStateID::null) {}
dLytSeekerStone_c::dLytSeekerStone_c() : mStateMgr(*this) {}
dLytSeekerStone_c::~dLytSeekerStone_c() {}
void dLytSeekerStone_c::initializeState_None() {}
+1 -1
View File
@@ -415,7 +415,7 @@ void dScBoot_c::strap_c::init() {
field_0x4F0 = 0;
}
dScBoot_c::dScBoot_c() : mStateMgr(*this, sStateID::null), mPhases(this, sCallbacks), mpDvdCallback(nullptr) {
dScBoot_c::dScBoot_c() : mStateMgr(*this), mPhases(this, sCallbacks), mpDvdCallback(nullptr) {
mObjectDataLoaded = false;
sInstance = this;
mStrapScreenVisible = false;
+1 -1
View File
@@ -9,7 +9,7 @@ STATE_DEFINE(dTitleMgr_c, Title);
STATE_DEFINE(dTitleMgr_c, FileSelect);
STATE_DEFINE(dTitleMgr_c, Input);
dTitleMgr_c::dTitleMgr_c() : mStateMgr(*this, sStateID::null) {}
dTitleMgr_c::dTitleMgr_c() : mStateMgr(*this) {}
dTitleMgr_c::~dTitleMgr_c() {}
void dTitleMgr_c::initializeState_Init() {}
+1 -1
View File
@@ -320,7 +320,7 @@ STATE_DEFINE(dAcItem_c, WaitTurnOff);
STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect);
dAcItem_c::dAcItem_c()
: mStateMgr(*this, sStateID::null),
: mStateMgr(*this),
mEff_0x8F4(this),
mEff_0x928(this),
mEff_0x95C(this),
+1 -1
View File
@@ -144,7 +144,7 @@ SizedString<128> sNpcStr2;
SizedString<128> sNpcStr3;
SizedString<128> sNpcStr4;
dAcNpc_c::dAcNpc_c() : mFlow(this), mStateMgr(*this, sStateID::null), mActorListEntry(this) {}
dAcNpc_c::dAcNpc_c() : mFlow(this), mStateMgr(*this), mActorListEntry(this) {}
dAcNpc_c::~dAcNpc_c() {
// TODO
+1 -1
View File
@@ -813,7 +813,7 @@ bool dAcTbox_c::isBelowGroundAtPos(f32 height, const mVec3_c &pos) {
}
dAcTbox_c::dAcTbox_c()
: mStateMgr(*this, sStateID::null),
: mStateMgr(*this),
mScnCallback(this),
mEvent(*this, nullptr),
mTboxListNode(this),
+1 -1
View File
@@ -16,7 +16,7 @@ void cM3dGCps::SetR(f32 r) {
r = 0.0f;
}
mRadius = r;
field_0x1C = (double)r; // huh
field_0x1C = mRadius;
}
void cM3dGCps::Set_0x1C(f32 f) {
+1 -1
View File
@@ -33,7 +33,7 @@ STATE_DEFINE(dStageMgr_c, SceneChangeSave);
STATE_DEFINE(dStageMgr_c, RestartSceneWait);
STATE_DEFINE(dStageMgr_c, RestartScene);
dStageMgr_c::dStageMgr_c() : mStateMgr(*this, sStateID::null), mPhase(this, sCallbacks) {
dStageMgr_c::dStageMgr_c() : mStateMgr(*this), mPhase(this, sCallbacks) {
sInstance = this;
}
+1 -1
View File
@@ -40,7 +40,7 @@ static const d2d::LytBrlanMapping brlanMap[] = {
#define NUM_ANIMS 9
dLytCommonArrow_c::dLytCommonArrow_c() : mStateMgr(*this, sStateID::null) {}
dLytCommonArrow_c::dLytCommonArrow_c() : mStateMgr(*this) {}
bool dLytCommonArrow_c::build() {
void *data = LayoutArcManager::GetInstance()->getLoadedData("CommonArrow");
+1 -1
View File
@@ -96,7 +96,7 @@ static const char *sPaneNames[] = {
#define PAUSE_DISP_01_NUM_COMBINED_PANES (PAUSE_DISP_01_NUM_MY_PANES + PAUSE_DISP_01_NUM_SUBPANES)
#define PAUSE_DISP_01_OFFSET_MY_PANES PAUSE_DISP_01_NUM_SUBPANES
dLytPauseDisp01_c::dLytPauseDisp01_c() : mStateMgr(*this, sStateID::null) {}
dLytPauseDisp01_c::dLytPauseDisp01_c() : mStateMgr(*this) {}
bool dLytPauseDisp01_c::build() {
dLytPauseMgr_c *pauseMgr = dLytPauseMgr_c::GetInstance();
+1 -1
View File
@@ -13,7 +13,7 @@ STATE_DEFINE(dLytSaveMsgWindow_c, In);
STATE_DEFINE(dLytSaveMsgWindow_c, Wait);
STATE_DEFINE(dLytSaveMsgWindow_c, Out);
dLytSaveMsgWindow_c::dLytSaveMsgWindow_c() : mStateMgr(*this, sStateID::null) {
dLytSaveMsgWindow_c::dLytSaveMsgWindow_c() : mStateMgr(*this) {
resetProperties();
}
+1 -1
View File
@@ -59,7 +59,7 @@ void dLytSkyGaugeMain_c::executeState_ModeOut() {
}
void dLytSkyGaugeMain_c::finalizeState_ModeOut() {}
dLytSkyGaugeMain_c::dLytSkyGaugeMain_c() : mStateMgr(*this, sStateID::null) {}
dLytSkyGaugeMain_c::dLytSkyGaugeMain_c() : mStateMgr(*this) {}
bool dLytSkyGaugeMain_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
+1 -1
View File
@@ -49,7 +49,7 @@ void dLytWipeMain_c::executeState_ModeOut() {
}
void dLytWipeMain_c::finalizeState_ModeOut() {}
dLytWipeMain_c::dLytWipeMain_c() : mStateMgr(*this, sStateID::null) {}
dLytWipeMain_c::dLytWipeMain_c() : mStateMgr(*this) {}
static const d2d::LytBrlanMapping brlanMap[] = {
{"wipe_00_inOut.brlan", "G_inOut_00"},
+1 -1
View File
@@ -489,7 +489,7 @@ static const char *sWindowNames[] = {
static const char *sGroupName = "G_ref_00";
dLytMeterItemSelect_c::dLytMeterItemSelect_c() : mStateMgr(*this, sStateID::null) {
dLytMeterItemSelect_c::dLytMeterItemSelect_c() : mStateMgr(*this) {
field_0x574C = I_INVALID;
field_0x5750 = I_INVALID;
field_0x5754 = 0;
+1 -2
View File
@@ -472,8 +472,7 @@ bool dSoundSource_c::startBgHitSound(
return startBgHitSound(soundLabelToSoundId(label), polyAttr0, polyAttr1, position);
}
// exact copy of startSoundAtPosition - used only for when the hookshot
// hits the water level
// exact copy of startSoundAtPosition
bool dSoundSource_c::startSoundAtPosition2(u32 soundId, const nw4r::math::VEC3 *position) {
if (!d_s_vt_0x1AC(soundId)) {
return false;
+131
View File
@@ -0,0 +1,131 @@
#include "toBeSorted/d_enemy_sword_mdl.h"
#include "common.h"
#include "d/col/cc/d_cc_s.h"
#include "d/d_sc_game.h"
#include "m/m3d/m_shadow.h"
#include "m/m_vec.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "nw4r/g3d/res/g3d_resmdl.h"
dCcD_SrcCps sCcSrc = {
{
{AT_TYPE_DAMAGE, 0x8D, {1, 0, 0}, 1, 0, 0, 0, 0, 0},
{0, 0, {0, 0, 0x407}, 0, 0},
{0},
},
{30.0f},
};
// Yeah these two functions do the same thing. Could've made one call the other...
bool dEnemySwordMdl_c::create(
mAllocator_c *alloc, void *pData, const char *mdlName, u32 bufferOption, const mVec3_c &v1, const mVec3_c &v2,
cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
) {
nw4r::g3d::ResMdl mdl = nw4r::g3d::ResFile(pData).GetResMdl(mdlName);
if (!mMdl.create(mdl, alloc, bufferOption, nView, pSize)) {
return false;
}
if (!mProc.create(100, alloc, pImg, 0.015f)) {
mMdl.remove();
return false;
}
field_0x074.set(v1.x, v1.y, v1.z);
field_0x080.set(v2.x, v2.y, v2.z);
for (int i = 0; i < 3; i++) {
mCcList.addCc(mCcs[i], sCcSrc);
}
mCcList.SetStts(stts);
mCcList.ClrAt();
return true;
}
bool dEnemySwordMdl_c::create(
mAllocator_c *alloc, nw4r::g3d::ResFile resFile, const char *mdlName, u32 bufferOption, const mVec3_c &v1,
const mVec3_c &v2, cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
) {
nw4r::g3d::ResMdl mdl = resFile.GetResMdl(mdlName);
if (!mMdl.create(mdl, alloc, bufferOption, nView, pSize)) {
return false;
}
if (!mProc.create(100, alloc, pImg, 0.015f)) {
mMdl.remove();
return false;
}
field_0x074.set(v1.x, v1.y, v1.z);
field_0x080.set(v2.x, v2.y, v2.z);
for (int i = 0; i < 3; i++) {
mCcList.addCc(mCcs[i], sCcSrc);
}
mCcList.SetStts(stts);
mCcList.ClrAt();
return true;
}
void dEnemySwordMdl_c::enableAttack() {
mCcs[0].OnAtSet();
mIsActive = true;
mFirstFramePassed = false;
}
// TODO - ...
void dEnemySwordMdl_c::calc(const mMtx_c &mtx, const mVec3_c &v1, bool mass) {
mMdl.setLocalMtx(mtx);
mMdl.calc(false);
MTXMultVec(mtx, field_0x074, field_0x08C);
MTXMultVec(mtx, field_0x080, field_0x098);
if (mIsActive) {
mVec3_c v = field_0x098 - field_0x08C;
v.normalize();
mVec3_c hi = field_0x098 + v * field_0x0A8;
mCcs[1].Set(mCcs[0].mEnd, hi);
mCcs[2].Set(mCcs[0].mStart, hi);
mCcs[0].Set(field_0x08C - v * field_0x0A4, hi);
mCcs[0].SetAtVec(v1);
mCcs[1].SetAtVec(v1);
mCcs[2].SetAtVec(v1);
if (mFirstFramePassed && !mCcs[1].ChkAtSet()) {
mCcs[1].OnAtSet();
mCcs[2].OnAtSet();
} else {
mFirstFramePassed = true;
}
mCcList.registerColliders();
if (mass) {
dCcS::GetInstance()->GetMassMng().SetObj(&mCcs[0], 2);
}
} else {
mFirstFramePassed = false;
if (mCcs[0].ChkAtSet()) {
mCcList.ClrAt();
}
}
mProc.calc(field_0x098, field_0x08C);
}
bool dEnemySwordMdl_c::entry(dAcObjBase_c *obj, dShadowCircle_c *shadow, mQuat_c *quat) {
if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
obj->fn_8002ECD0(&mMdl, 7);
} else {
obj->drawModelType1(&mMdl);
}
mProc.entry();
if (shadow != nullptr && quat != nullptr) {
m3d::mShadow_c::GetInstance()->addMdlToCircle(shadow, mMdl, *quat);
}
return true;
}
+218
View File
@@ -0,0 +1,218 @@
#include "toBeSorted/d_sword_swing_effect.h"
#include "d/d_stage_mgr.h"
#include "egg/gfx/eggDrawGX.h"
#include "m/m3d/m3d.h"
#include "m/m3d/m_proc.h"
#include "m/m3d/m_scnleaf.h"
#include "nw4r/g3d/g3d_scnobj.h"
#include "nw4r/math/math_types.h"
void dSwordSwingEffectProcBase_c::remove() {
if (mpEntries != nullptr) {
delete[] mpEntries;
mpEntries = nullptr;
}
m3d::scnLeaf_c::remove();
}
void dSwordSwingEffectProcBase_c::drawXlu() {
m3d::resetMaterial();
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
GXSetNumTexGens(0);
GXSetNumTevStages(1);
GXSetNumIndStages(0);
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_RASA);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetZCompLoc(1);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_OR);
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE);
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
GXSetFog(GX_FOG_NONE, mColor(0), 0.0, 0.0, 0.0, 0.0);
GXSetFogRangeAdj(0, 0, 0);
GXSetCullMode(GX_CULL_NONE);
nw4r::math::MTX34 mtx;
nw4r::g3d::Camera cam = m3d::getCurrentCamera();
cam.GetCameraMtx(&mtx);
GXLoadPosMtxImm(mtx, 0);
GXSetCurrentMtx(0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, mCount * 2);
swing_entry *entry = &mpEntries[mHead];
for (u16 i = 0; i < mCount; i++) {
if (entry == &mpEntries[0]) {
entry = &mpEntries[mNum];
}
entry--;
GXPosition3f32(entry->mv1.x, entry->mv1.y, entry->mv1.z);
GXColor4u8(entry->mc1.r, entry->mc1.g, entry->mc1.b, entry->mc1.a * entry->mLifetime);
GXPosition3f32(entry->mv2.x, entry->mv2.y, entry->mv2.z);
GXColor4u8(entry->mc2.r, entry->mc2.g, entry->mc2.b, entry->mc2.a * entry->mLifetime);
}
GXEnd();
}
bool dSwordSwingEffectProcBase_c::hasSwings() const {
return mCount != 0;
}
int dSwordSwingEffectProcBase_c::entry() {
if (hasSwings()) {
return m3d::pushBack(mpScnLeaf);
}
return 0;
}
bool dSwordSwingEffectProcBase_c::create(s32 num, mAllocator_c *alloc) {
if (!m3d::proc_c::create(alloc, nullptr)) {
return false;
}
mpEntries = new (alloc->getHeap()) swing_entry[num]();
if (mpEntries == nullptr) {
remove();
return false;
}
mNum = num;
setOption(nw4r::g3d::ScnObj::OPTION_DISABLE_DRAW_OPA, true);
return true;
}
void dSwordSwingEffectProcBase_c::addSwing(
const mVec3_c &pos1, mColor c1, const mVec3_c &pos2, mColor c2
) {
mpEntries[mHead].set(pos1, c1, pos2, c2);
mHead++;
if (mHead >= mNum) {
mHead = 0;
}
if (mCount < mNum) {
mCount++;
}
}
void dSwordSwingEffectProcBase_c::calc(f32 f) {
s32 count = mCount;
if (count == 0) {
return;
}
swing_entry *entry = &mpEntries[mHead];
for (u16 i = 0; i < mCount; i++) {
if (entry == &mpEntries[0]) {
entry = &mpEntries[mNum];
}
entry--;
entry->mLifetime -= f;
if (entry->mLifetime <= 0.0f) {
entry->mLifetime = 0.0f;
count--;
}
}
if (mCount != 0 && count == 0) {
mHead = 0;
}
mCount = count;
}
void dSwordSwingEffectProc_c::drawXlu() {
if (mpImg == nullptr) {
dSwordSwingEffectProcBase_c::drawXlu();
} else {
EGG::DrawGX::LoadTexture(mpImg, GX_TEXMAP0);
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, false, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
GXSetNumTexGens(1);
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3c, 0, 0x7d);
GXSetNumTevStages(1);
GXSetNumIndStages(0);
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_RASC, GX_CC_TEXC, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_RASA, GX_CA_TEXA, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV);
GXSetZCompLoc(0);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_OR);
GXSetZMode(true, GX_LEQUAL, false);
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
GXSetFog(GX_FOG_NONE, mColor(0), 0.0, 0.0, 0.0, 0.0);
GXSetFogRangeAdj(0, 0, 0);
GXSetCullMode(GX_CULL_NONE);
nw4r::math::MTX34 mtx;
nw4r::g3d::Camera cam = m3d::getCurrentCamera();
cam.GetCameraMtx(&mtx);
GXLoadPosMtxImm(mtx, 0);
GXSetCurrentMtx(0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, mCount * 2);
u8 alpha = dStageMgr_c::GetInstance()->getGlobalAlpha();
f32 fAlpha = alpha * (1.0f / 255.0f);
s32 idx = mHead - mCount;
if (idx < 0) {
idx += mNum;
}
f32 texCoordOffset = mTexScale * idx;
swing_entry *entry = &mpEntries[idx];
swing_entry *last = &mpEntries[mNum];
for (u16 i = 0; i < mCount; i++) {
GXPosition3f32(entry->mv1.x, entry->mv1.y, entry->mv1.z);
GXColor4u8(entry->mc1.r, entry->mc1.g, entry->mc1.b, entry->mc1.a * entry->mLifetime * fAlpha);
GXTexCoord2f32(texCoordOffset, 0.0f);
GXPosition3f32(entry->mv2.x, entry->mv2.y, entry->mv2.z);
GXColor4u8(entry->mc2.r, entry->mc2.g, entry->mc2.b, entry->mc2.a * entry->mLifetime * fAlpha);
GXTexCoord2f32(texCoordOffset, 1.0f);
texCoordOffset += mTexScale;
entry++;
if (entry == last) {
entry = &mpEntries[0];
}
}
}
}
bool dSwordSwingEffectProc_c::create(s32 num, mAllocator_c *alloc, EGG::ResTIMG *pImg, f32 scale) {
if (!dSwordSwingEffectProcBase_c::create(num, alloc)) {
return false;
}
mpImg = pImg;
mTexScale = scale;
return true;
}
void dSwordSwingEffectProcBase_c::swing_entry::set(
const mVec3_c &pos1, const mColor &c1, const mVec3_c &pos2, const mColor &c2
) {
mLifetime = 1.0f;
mv1 = pos1;
mv2 = pos2;
mc1 = c1;
mc2 = c2;
}
+196
View File
@@ -0,0 +1,196 @@
#include "toBeSorted/d_sword_swing_effect_mgr.h"
#include "c/c_math.h"
#include "egg/math/eggMatrix.h"
#include "m/m_vec.h"
// TODO: can't use EGG::Vector3f::cross because the Vector3f -> mVec3_c conversion
// forces additional stack stores. An open-coded cross function works too in this
// file but maybe pattern comes up in more files and then we can move it to d_vec?
inline void cross(mVec3_c &result, const mVec3_c &left, const mVec3_c &right) {
result.set(
(left.y * right.z) - (left.z * right.y), (left.z * right.x) - (left.x * right.z),
(left.x * right.y) - (left.y * right.x)
);
}
static bool fn_8006A8D0(const mVec2_c &v1, const mVec2_c &v2, const mVec2_c &v3, const mVec2_c &v4, mVec2_c &result) {
mVec2_c t1 = v2 - v1;
mVec2_c t2 = v4 - v3;
if (cM::isZero(t1.x)) {
if (cM::isZero(t2.x)) {
return false;
} else {
result.x = v1.x;
result.y = v3.y + (t2.y / t2.x) * (v1.x - v3.x);
}
} else {
if (cM::isZero(t2.x)) {
result.x = v3.x;
} else {
f32 tmp = t1.y / t1.x - t2.y / t2.x;
if (cM::isZero(tmp)) {
return false;
}
result.x = (v3.x + (((t1.y / t1.x) * v1.x - v1.y) - (t2.y / t2.x) * v3.x)) / tmp;
}
result.y = v1.y + (t1.y / t1.x) * (result.x - v1.x);
}
mVec2_c diff = result - v1;
if (diff.x * t1.x + diff.y * t1.y >= 0.0f) {
return false;
}
diff = result - v3;
if (diff.x * t2.x + diff.y * t2.y >= 0.0f) {
return false;
}
return true;
}
void dSwordSwingEffectProcMgr_c::createSwingEntries(const mVec3_c &v1, const mVec3_c &v2) {
mVec3_c lastDiff = field_0x44 - field_0x38;
mVec3_c diff = v1 - v2;
mVec3_c cross_;
cross(cross_, lastDiff, diff);
f32 diffMag = diff.mag();
lastDiff.normalize();
diff /= diffMag;
cross_.normalize();
// Same code as in dowsing_target...
f32 dot = lastDiff.dot(diff);
dot = cM::minMaxLimit(dot, -1.0f, 1.0f);
f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot);
EGG::Matrix34f mat;
mat.setAxisRotation(cross_, cM::atan2f(a, dot) * 0.1f);
mVec2_c p1, p2, p3, p4;
mVec2_c res1, res2, res3;
p1.set(field_0x38.x, field_0x38.y);
p2.set(field_0x44.x, field_0x44.y);
p3.set(v2.x, v2.y);
p4.set(v1.x, v1.y);
bool b1 = fn_8006A8D0(p1, p2, p3, p4, res1);
p1.set(field_0x38.y, field_0x38.z);
p2.set(field_0x44.y, field_0x44.z);
p3.set(v2.y, v2.z);
p4.set(v1.y, v1.z);
bool b2 = fn_8006A8D0(p1, p2, p3, p4, res2);
p1.set(field_0x38.z, field_0x38.x);
p2.set(field_0x44.z, field_0x44.x);
p3.set(v2.z, v2.x);
p4.set(v1.z, v1.x);
bool b3 = fn_8006A8D0(p1, p2, p3, p4, res3);
bool b;
mVec3_c local_124 = (v2 + field_0x38) * 0.5f;
mVec3_c diff1;
mVec3_c v;
f32 f_29;
f32 f_28;
EGG::Matrix34f mat2;
int i = 0;
if (!b1) {
i += 1;
}
if (!b2) {
i += 1;
}
if (!b3) {
i += 1;
}
if (i >= 2) {
v = (v2 - field_0x38) * 0.1f;
b = false;
} else {
if (b1 && b3) {
local_124.x = (res1.x + res3.y) * 0.5f;
} else if (b1) {
local_124.x = res1.x;
} else if (b3) {
local_124.x = res3.y;
}
if (b2 && b1) {
local_124.y = (res2.x + res1.y) * 0.5f;
} else if (b2) {
local_124.y = res2.x;
} else if (b1) {
local_124.y = res1.y;
}
if (b3 && b2) {
local_124.z = (res3.x + res2.y) * 0.5f;
} else if (b3) {
local_124.z = res3.x;
} else if (b2) {
local_124.z = res2.y;
}
diff1 = field_0x38 - local_124;
mVec3_c diff2 = v2 - local_124;
f_29 = diff1.mag();
f_28 = (diff2.mag() - f_29) * 0.1f;
diff2.normalize();
diff1.normalize();
cross(cross_, diff1, diff2);
cross_.normalize();
// Same code as in dowsing_target...
f32 dot = diff1.dot(diff2);
dot = cM::minMaxLimit(dot, -1.0f, 1.0f);
f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot);
mat2.setAxisRotation(cross_, cM::atan2f(a, dot) * 0.1f);
b = true;
}
f32 blub = 0.1f;
for (int i = 1; i <= 10; i++) {
mVec3_c a;
mVec3_c t;
if (b) {
MTXMultVecSR(mat2.m, diff1, diff1);
t = local_124 + (diff1 * (f_29 + (f_28 * i)));
} else {
t = field_0x38 + v * i;
}
MTXMultVecSR(mat.m, lastDiff, lastDiff);
a = t + lastDiff * diffMag;
mProc.addSwing(a, mC1, t, mC2);
// Unused
blub += 0.1f;
}
}
void dSwordSwingEffectProcMgr_c::calc(const mVec3_c &v1, const mVec3_c &v2) {
mProc.calc(0.1f);
if (mIsActive) {
createSwingEntries(v1, v2);
}
field_0x44 = v1;
field_0x38 = v2;
}
void dSwordSwingEffectProcMgr_c::entry() {
mProc.entry();
}
+1
View File
@@ -174,6 +174,7 @@ DowsingTarget *DowsingTarget::getDowsingInfo(
targetDir.normalize();
// Same code as in d_sword_swing_effect_mgr...
f32 dot = dwsDir.dot(targetDir);
dot = cM::minMaxLimit(dot, -1.0f, 1.0f);
f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot);