From 3f39078485cb4894c391bde31bb246a159a83af3 Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:24:55 +0100 Subject: [PATCH] d_a_majuu_flag (#824) * d_a_majuu_flag * PR * PR * Fix demo * Replace .clang-format --------- Co-authored-by: LagoLunatic --- .clang-format | 18 + config/D44J01/config.yml | 10 + config/GZLE01/config.yml | 10 + config/GZLJ01/config.yml | 12 +- config/GZLP01/config.yml | 10 + configure.py | 4 +- include/d/actor/d_a_majuu_flag.h | 57 +- include/d/actor/d_a_pirate_flag.h | 1 + include/d/actor/d_a_sail.h | 1 + include/m_Do/m_Do_mtx.h | 3 +- src/d/actor/d_a_majuu_flag.cpp | 1043 ++++++++++++++++++++++++++++- src/d/actor/d_a_pirate_flag.cpp | 6 +- src/d/actor/d_a_sail.cpp | 4 +- 13 files changed, 1134 insertions(+), 45 deletions(-) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..30f2a0c89 --- /dev/null +++ b/.clang-format @@ -0,0 +1,18 @@ +IndentWidth: 4 +AllowShortFunctionsOnASingleLine: InlineOnly +PointerAlignment: Left +ColumnLimit: 160 +RemoveParentheses: ReturnStatement +BinPackArguments: false +BinPackParameters: false +AlignAfterOpenBracket: BlockIndent +BreakBeforeBraces: Custom +BraceWrapping: + AfterControlStatement: MultiLine +ReflowComments: false +SortIncludes: false +AccessModifierOffset: -4 +# BreakBeforeBinaryOperators: None +# BreakBeforeTernaryOperators: true +# AlignConsecutiveAssignments: false +PackConstructorInitializers: Never diff --git a/config/D44J01/config.yml b/config/D44J01/config.yml index 8053424bd..1e3b2f44b 100644 --- a/config/D44J01/config.yml +++ b/config/D44J01/config.yml @@ -258,6 +258,16 @@ modules: splits: config/D44J01/rels/d_a_majuu_flag/splits.txt symbols: config/D44J01/rels/d_a_majuu_flag/symbols.txt # map: orig/D44J01/files/maps/d_a_majuu_flag.map + extract: + - symbol: l_flag02TEX + binary: assets/l_flag02TEX.bin + header: assets/l_flag02TEX.h + - symbol: l_majuu_flag_matDL + binary: assets/l_majuu_flag_matDL.bin + header: assets/l_majuu_flag_matDL.h + - symbol: l_majuu_flagDL + binary: assets/l_majuu_flagDL.bin + header: assets/l_majuu_flagDL.h - object: files/RELS.arc:mmem/d_a_mdoor.rel hash: 4cbaf69a22b8356c144d4343bd6bc46c27870d33 diff --git a/config/GZLE01/config.yml b/config/GZLE01/config.yml index e2a43f52c..282819adf 100644 --- a/config/GZLE01/config.yml +++ b/config/GZLE01/config.yml @@ -224,6 +224,16 @@ modules: hash: 9844a606bcebcceaeff329256665eea72d5aa970 splits: config/GZLE01/rels/d_a_majuu_flag/splits.txt symbols: config/GZLE01/rels/d_a_majuu_flag/symbols.txt + extract: + - symbol: l_flag02TEX + binary: assets/l_flag02TEX.bin + header: assets/l_flag02TEX.h + - symbol: l_majuu_flag_matDL + binary: assets/l_majuu_flag_matDL.bin + header: assets/l_majuu_flag_matDL.h + - symbol: l_majuu_flagDL + binary: assets/l_majuu_flagDL.bin + header: assets/l_majuu_flagDL.h - object: files/RELS.arc:rels/mmem/d_a_mdoor.rel hash: 8ae182c9556fdcd2c21205738af5d83acc903b4a diff --git a/config/GZLJ01/config.yml b/config/GZLJ01/config.yml index b6b664897..9c1961722 100644 --- a/config/GZLJ01/config.yml +++ b/config/GZLJ01/config.yml @@ -182,7 +182,17 @@ modules: - object: files/RELS.arc:rels/mmem/d_a_majuu_flag.rel splits: config/GZLJ01/rels/d_a_majuu_flag/splits.txt symbols: config/GZLJ01/rels/d_a_majuu_flag/symbols.txt - + extract: + - symbol: l_flag02TEX + binary: assets/l_flag02TEX.bin + header: assets/l_flag02TEX.h + - symbol: l_majuu_flag_matDL + binary: assets/l_majuu_flag_matDL.bin + header: assets/l_majuu_flag_matDL.h + - symbol: l_majuu_flagDL + binary: assets/l_majuu_flagDL.bin + header: assets/l_majuu_flagDL.h + - object: files/RELS.arc:rels/mmem/d_a_mdoor.rel splits: config/GZLJ01/rels/d_a_mdoor/splits.txt symbols: config/GZLJ01/rels/d_a_mdoor/symbols.txt diff --git a/config/GZLP01/config.yml b/config/GZLP01/config.yml index eac93dbad..56e830a17 100644 --- a/config/GZLP01/config.yml +++ b/config/GZLP01/config.yml @@ -182,6 +182,16 @@ modules: - object: files/RELS.arc:rels/mmem/d_a_majuu_flag.rel splits: config/GZLP01/rels/d_a_majuu_flag/splits.txt symbols: config/GZLP01/rels/d_a_majuu_flag/symbols.txt + extract: + - symbol: l_flag02TEX + binary: assets/l_flag02TEX.bin + header: assets/l_flag02TEX.h + - symbol: l_majuu_flag_matDL + binary: assets/l_majuu_flag_matDL.bin + header: assets/l_majuu_flag_matDL.h + - symbol: l_majuu_flagDL + binary: assets/l_majuu_flagDL.bin + header: assets/l_majuu_flagDL.h - object: files/RELS.arc:rels/mmem/d_a_mdoor.rel splits: config/GZLP01/rels/d_a_mdoor/splits.txt diff --git a/configure.py b/configure.py index 0ed11b0f5..b3d77981b 100755 --- a/configure.py +++ b/configure.py @@ -1385,11 +1385,11 @@ config.libs = [ ActorRel(Matching, "d_a_kytag05"), ActorRel(Matching, "d_a_kytag06"), ActorRel(Matching, "d_a_kytag07"), - ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_lamp" , extra_cflags=['-sym off']), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_lamp", extra_cflags=['-sym off']), ActorRel(NonMatching, "d_a_lod_bg"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_lwood"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_magma"), - ActorRel(NonMatching, "d_a_majuu_flag"), + ActorRel(NonMatching, "d_a_majuu_flag", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_mdoor", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("D44J01"), "d_a_msw", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_mtoge"), diff --git a/include/d/actor/d_a_majuu_flag.h b/include/d/actor/d_a_majuu_flag.h index fc8fc8d36..858d05612 100644 --- a/include/d/actor/d_a_majuu_flag.h +++ b/include/d/actor/d_a_majuu_flag.h @@ -3,23 +3,55 @@ #include "f_op/f_op_actor.h" #include "SSystem/SComponent/c_phase.h" +#include "JSystem/J3DGraphBase/J3DPacket.h" -class daMajuu_Flag_packet_c { +class daMajuu_Flag_packet_c : public J3DPacket { public: - void changeCurrentPos() {} - void getImageTexObj() {} - void getMtx() {} - void getNrm() {} - void getOffsetVec() {} - void getPos() {} - void getToonTexObj() {} - void setTevStr(dKy_tevstr_c*) {} + daMajuu_Flag_packet_c() { + mCurArr = 0; + mRotateY = 0; + m798 = 0; + m796 = 0; + m79B = 1; + } + virtual ~daMajuu_Flag_packet_c() {} + void changeCurrentPos() { + mCurArr ^= 1; + } + GXTexObj* getImageTexObj() { return &mFlagTex; } + Mtx* getMtx() { return &mPosMtx; } + cXyz* getNrm() { return mpNrmArr[mCurArr]; } + cXyz* getBackNrm() { return mpNrmArrBack[mCurArr]; } + cXyz* getOffsetVec() { return mSpeed; } + cXyz* getPos() { return mpPosArr[mCurArr]; } + GXTexObj* getToonTexObj() { return &mToonTex; } + + void setTevStr(dKy_tevstr_c* tevStr) { mpTevStr = tevStr; } void setNrmMtx(); void setBackNrm(); void setNrmVtx(cXyz*, int); - void draw(); -}; + + virtual void draw(); + +public: + /* 0x010 */ Mtx mPosMtx; + /* 0x040 */ dKy_tevstr_c* mpTevStr; + /* 0x044 */ GXTexObj mToonTex; + /* 0x064 */ GXTexObj mFlagTex; + /* 0x084 */ u8 m084[0x0A0 - 0x084]; + /* 0x0A0 */ cXyz mpPosArr[2][21]; + /* 0x298 */ u8 m298[0x2A0 - 0x298]; + /* 0x2A0 */ cXyz mpNrmArr[2][21]; + /* 0x498 */ u8 m498[0x4A0 - 0x498]; + /* 0x4A0 */ cXyz mpNrmArrBack[2][21]; + /* 0x698 */ cXyz mSpeed[21]; + /* 0x794 */ s16 mRotateY; + /* 0x796 */ s16 m796; + /* 0x798 */ s16 m798; + /* 0x79A */ u8 mCurArr; + /* 0x79B */ u8 m79B; +}; // size >= 0x7A0 class daMajuu_Flag_c : public fopAc_ac_c { public: @@ -44,7 +76,6 @@ public: /* 0xA68 */ Mtx mMtx; /* 0xA98 */ MtxP mpParentMtx; /* 0xA9C */ cXyz* mpParentPos; - /* 0xAA0 */ u8 mAA0[0xB00 - 0xAA0]; -}; +}; // size = 0xAA0 #endif /* D_A_MAJUU_FLAG_H */ diff --git a/include/d/actor/d_a_pirate_flag.h b/include/d/actor/d_a_pirate_flag.h index 227cd73fd..6c1bee14e 100644 --- a/include/d/actor/d_a_pirate_flag.h +++ b/include/d/actor/d_a_pirate_flag.h @@ -24,6 +24,7 @@ public: void setTevStr(dKy_tevstr_c* i_tevStr) { mTevStr = i_tevStr; } cXyz* getPos() { return mPos[m87E]; } cXyz* getNrm() { return mNrm[m87E]; } + cXyz* getBackNrm() { return m4F4[m87E]; } cXyz* getOffsetVec() { return m74C; } // Guessed based on size in debug maps s16 getEscapeNrmAngle() { return m87A; } void changeCurrentPos() { m87E ^= 1; } diff --git a/include/d/actor/d_a_sail.h b/include/d/actor/d_a_sail.h index f0ec999d8..3b8c7c2f6 100644 --- a/include/d/actor/d_a_sail.h +++ b/include/d/actor/d_a_sail.h @@ -23,6 +23,7 @@ public: cXyz* getPos() { return mPos[m1C3A]; } cXyz* getPosSpd() { return m0884; } cXyz* getNrm() { return mNrm[m1C3A]; } + cXyz* getBackNrm() { return m1454[m1C3A]; } void setCorrectNrmAngle(s16, f32); void setNrmMtx(); diff --git a/include/m_Do/m_Do_mtx.h b/include/m_Do/m_Do_mtx.h index fc14edc32..63ac7755b 100644 --- a/include/m_Do/m_Do_mtx.h +++ b/include/m_Do/m_Do_mtx.h @@ -24,13 +24,14 @@ void mDoMtx_concatProjView(f32 const (*param_0)[4], f32 const (*param_1)[4], f32 void mDoMtx_ZrotM(Mtx mtx, s16 z); bool mDoMtx_inverseTranspose(f32 const (*param_0)[4], f32 (*param_1)[4]); void mDoMtx_QuatConcat(Quaternion const* param_0, Quaternion const* param_1, Quaternion* param_2); +void mDoMtx_concat(const Mtx a, const Mtx b, Mtx c); inline void mDoMtx_multVecSR(const Mtx m, const Vec* src, Vec* dst) { MTXMultVecSR(m, src, dst); } inline void cMtx_concat(const Mtx a, const Mtx b, Mtx ab) { - MTXConcat(a, b, ab); + mDoMtx_concat(a, b, ab); } inline void cMtx_scale(Mtx m, f32 x, f32 y, f32 z) { diff --git a/src/d/actor/d_a_majuu_flag.cpp b/src/d/actor/d_a_majuu_flag.cpp index 088c97e4f..deefe9f6e 100644 --- a/src/d/actor/d_a_majuu_flag.cpp +++ b/src/d/actor/d_a_majuu_flag.cpp @@ -4,57 +4,888 @@ // #include "d/actor/d_a_majuu_flag.h" -#include "d/d_procname.h" +#include "d/d_com_inf_game.h" +#include "d/d_kankyo_wether.h" #include "d/d_priority.h" +#include "d/d_s_play.h" +#include "d/d_procname.h" +#include "d/res/res_cloth.h" +#include "d/res/res_matif.h" +#include "d/res/res_vsvfg.h" +#include "d/res/res_xhcf.h" +#include "dolphin/gx/GXTexture.h" +#include "f_op/f_op_actor_mng.h" +#include "m_Do/m_Do_graphic.h" +#include "m_Do/m_Do_hostIO.h" + +class daMajuu_Flag_HIO_c : public mDoHIO_entry_c { +public: + daMajuu_Flag_HIO_c() { + mbUseToonTex = true; + m06 = 0; + m05 = 0; + mWaveSpeed = 0x400; + mWindSpeed1 = 20.0f; + mWindSpeed2 = 10.0f; + mFlagScale = 1.0f; + mbHasCustomRotation = false; + mRotX = -0x5DC; + mTransZ = 50.0f; + mGravity = -1.25f; + mSpring = 0.45f; + m07 = 0; + m08 = 0; + } + virtual ~daMajuu_Flag_HIO_c() {} + + void genMessage(JORMContext* ctx); + +public: + /* 0x04 */ bool mbUseToonTex; + /* 0x05 */ s8 m05; + /* 0x06 */ s8 m06; + /* 0x07 */ s8 m07; + /* 0x08 */ s8 m08; + /* 0x0C */ s32 mWaveSpeed; + /* 0x10 */ f32 mWindSpeed1; + /* 0x14 */ f32 mWindSpeed2; + /* 0x18 */ f32 mGravity; + /* 0x1C */ f32 mSpring; + /* 0x20 */ f32 mFlagScale; + /* 0x24 */ bool mbHasCustomRotation; + /* 0x28 */ cXyz mCustomRotation; + /* 0x34 */ s32 mRotX; + /* 0x38 */ f32 mTransZ; +}; + +static daMajuu_Flag_HIO_c l_HIO; + +#include "weak_data_1811.h" // IWYU pragma: keep + +static u8 unused1[16] = {0}; // IWYU pragma: keep + +#include "assets/l_flag02TEX.h" + +static Vec l_majuu_flag_pos[] = { + {0.0f, -255.0f, 1300.0f}, {0.0f, -306.0f, 1040.0f}, {0.0f, -204.0f, 1040.0f}, {0.0f, -357.0f, 780.0f}, {0.0f, -255.0f, 780.0f}, {0.0f, -153.0f, 780.0f}, + {0.0f, -408.0f, 520.0f}, {0.0f, -306.0f, 520.0f}, {0.0f, -204.0f, 520.0f}, {0.0f, -102.0f, 520.0f}, {0.0f, -459.0f, 260.0f}, {0.0f, -357.0f, 260.0f}, + {0.0f, -255.0f, 260.0f}, {0.0f, -153.0f, 260.0f}, {0.0f, -51.0f, 260.0f}, {0.0f, -510.0f, 0.0f}, {0.0f, -408.0f, 0.0f}, {0.0f, -306.0f, 0.0f}, + {0.0f, -204.0f, 0.0f}, {0.0f, -102.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, +}; +static f32 l_texCoord[][2] = { + { + -0.280444f, + 1.069755f, + }, + { + 0.241439f, + 0.90587097f, + }, + { + 0.24137f, + 1.10964f, + }, + { + 0.91434f, + 0.707848f, + }, + { + 0.91426998f, + 1.069345f, + }, + { + 1.352905f, + 0.52748799f, + }, + { + 1.352837f, + 0.954527f, + }, + { + 1.39049f, + 0.34673199f, + }, + { + 1.390421f, + 0.70902097f, + }, + { + -0.28037399f, + 0.70746398f, + }, + { + 0.241509f, + 0.52670997f, + }, + { + 0.91441f, + 0.346349f, + }, + { + 1.352974f, + 0.100449f, + }, + { + -0.280306f, + 0.34517899f, + }, + { + 0.241579f, + 0.147549f, + }, + { + 0.91447997f, + -0.015147f, + }, + { + -0.28023499f, + -0.017113f, + }, + { + 0.241649f, + -0.186406f, + }, + { + -0.27530599f, + 1.1664619f, + }, + { + -0.280164f, + -0.061744f, + }, + { + 1.396762f, + 0.528265f, + }, +}; + +#include "assets/l_majuu_flagDL.h" +#include "assets/l_majuu_flag_matDL.h" /* 000000EC-00000374 .text set_mtx__FP14daMajuu_Flag_c */ -void set_mtx(daMajuu_Flag_c*) { - /* Nonmatching */ +void set_mtx(daMajuu_Flag_c* i_this) { + if (i_this->mpParentMtx != NULL && i_this->mpParentPos != NULL) { + cMtx_copy(i_this->mpParentMtx, mDoMtx_stack_c::get()); + mDoMtx_stack_c::transM(i_this->mpParentPos->x, i_this->mpParentPos->y, i_this->mpParentPos->z); + mDoMtx_stack_c::YrotM(i_this->current.angle.y); +#if VERSION == VERSION_DEMO + mDoMtx_stack_c::transM(0.0f, 0.0f, REG10_F(10) + 6.0f); +#else + mDoMtx_stack_c::transM(0.0f, 0.0f, 6.0f); +#endif + mDoMtx_stack_c::scaleM(i_this->mFlagScale * l_HIO.mFlagScale, i_this->mFlagScale * l_HIO.mFlagScale, i_this->mFlagScale * l_HIO.mFlagScale); + cXyz sp08 = cXyz::Zero; + mDoMtx_stack_c::multVec(&sp08, &i_this->current.pos); + cMtx_copy(mDoMtx_stack_c::get(), i_this->mMtx); + } else { + MtxTrans(i_this->current.pos.x, i_this->current.pos.y, i_this->current.pos.z, false); + if (l_HIO.mbHasCustomRotation) { + cMtx_ZrotM(*calc_mtx, cM_deg2s(l_HIO.mCustomRotation.z)); + cMtx_XrotM(*calc_mtx, cM_deg2s(l_HIO.mCustomRotation.x)); + cMtx_YrotM(*calc_mtx, cM_deg2s(l_HIO.mCustomRotation.y)); + } else { + cMtx_ZrotM(*calc_mtx, i_this->current.angle.z); + cMtx_XrotM(*calc_mtx, i_this->current.angle.x); + cMtx_YrotM(*calc_mtx, i_this->current.angle.y); + if (i_this->mFlagType == 4 || i_this->mTexType != 0) { +#if VERSION == VERSION_DEMO + MtxTrans(0.0f, 0.0f, REG10_F(10) + 5.0f, true); +#else + MtxTrans(0.0f, 0.0f, 5.0f, true); +#endif + } else { + cMtx_XrotM(*calc_mtx, l_HIO.mRotX); + MtxTrans(0.0f, 0.0f, l_HIO.mTransZ, true); + } + } + MtxScale(i_this->mFlagScale * l_HIO.mFlagScale, i_this->mFlagScale * l_HIO.mFlagScale, i_this->mFlagScale * l_HIO.mFlagScale, true); + cMtx_copy(*calc_mtx, i_this->mMtx); + } } /* 000003B0-000003E4 .text setNrmMtx__21daMajuu_Flag_packet_cFv */ void daMajuu_Flag_packet_c::setNrmMtx() { - /* Nonmatching */ + cMtx_YrotS(*calc_mtx, mRotateY); } /* 000003E4-0000046C .text setBackNrm__21daMajuu_Flag_packet_cFv */ void daMajuu_Flag_packet_c::setBackNrm() { - /* Nonmatching */ +#if VERSION == VERSION_DEMO + cXyz* nrm = mpNrmArr[mCurArr]; + cXyz* nrmBack = mpNrmArrBack[mCurArr]; +#else + cXyz* nrm = getNrm(); + cXyz* nrmBack = getBackNrm(); +#endif + + for (s32 i = 0; i < 21; i++, nrm++, nrmBack++) { + *nrmBack = cXyz::Zero; + *nrmBack -= *nrm; + } } /* 0000046C-000006E8 .text setNrmVtx__21daMajuu_Flag_packet_cFP4cXyzi */ -void daMajuu_Flag_packet_c::setNrmVtx(cXyz*, int) { - /* Nonmatching */ +void daMajuu_Flag_packet_c::setNrmVtx(cXyz* pDst, int index) { + static s32 rel_pos_idx_tbl[][7] = { + { + 1, + 2, + -1, + -1, + -1, + -1, + -1, + }, + { + 3, + 4, + 2, + 0, + -1, + -1, + -1, + }, + { + 0, + 1, + 4, + 5, + -1, + -1, + -1, + }, + { + 6, + 7, + 4, + 1, + -1, + -1, + -1, + }, + { + 1, + 3, + 7, + 8, + 5, + 2, + 1, + }, + { + 2, + 4, + 8, + 9, + -1, + -1, + -1, + }, + { + 10, + 11, + 7, + 3, + -1, + -1, + -1, + }, + { + 3, + 6, + 11, + 12, + 8, + 4, + 3, + }, + { + 4, + 7, + 12, + 13, + 9, + 5, + 4, + }, + { + 5, + 8, + 13, + 14, + -1, + -1, + -1, + }, + { + 15, + 16, + 11, + 6, + -1, + -1, + -1, + }, + { + 6, + 10, + 16, + 17, + 12, + 7, + 6, + }, + { + 7, + 11, + 17, + 18, + 13, + 8, + 7, + }, + { + 8, + 12, + 18, + 19, + 14, + 9, + 8, + }, + { + 9, + 13, + 19, + 20, + -1, + -1, + -1, + }, + { + 16, + 10, + -1, + -1, + -1, + -1, + -1, + }, + { + 17, + 11, + 10, + 15, + -1, + -1, + -1, + }, + { + 18, + 12, + 11, + 16, + -1, + -1, + -1, + }, + { + 19, + 13, + 12, + 17, + -1, + -1, + -1, + }, + { + 20, + 14, + 13, + 18, + -1, + -1, + -1, + }, + { + 14, + 19, + -1, + -1, + -1, + -1, + -1, + }, + }; + cXyz sp80; + cXyz sp74; + cXyz sp68; + cXyz sp5C; + cXyz sp50; + cXyz* pos = getPos(); + + sp50 = pos[index]; + + sp5C.setall(0.0f); + s32* relPos = rel_pos_idx_tbl[index]; + + for (s32 i = 0; i < 6; i++, relPos++) { + if (relPos[1] == -1) { + break; + } + + sp80 = pos[relPos[0]] - sp50; + sp74 = pos[relPos[1]] - sp50; + sp68 = sp74.outprod(sp80); + sp68 = sp68.normZC(); + + sp5C += sp68; + } + + sp5C = sp5C.normZC(); + + s32 iVar2; + s32 iVar4; + if (index == 0) { + iVar4 = 0; + iVar2 = 0; + } else if (index < 3) { + iVar4 = 1; + iVar2 = index + -1; + } else if (index < 6) { + iVar4 = 2; + iVar2 = index + -3; + } else if (index < 10) { + iVar4 = 3; + iVar2 = index + -6; + } else if (index < 0xf) { + iVar4 = 4; + iVar2 = index + -10; + } else { + iVar4 = 5; + iVar2 = index + -0xf; + } + + MtxPush(); +#if VERSION == VERSION_DEMO + cMtx_YrotM(*calc_mtx, (cM_ssin((iVar2 + iVar4) * (REG10_S(3) - 800)) * (REG9_S(74) + 900))); +#else + cMtx_YrotM(*calc_mtx, cM_ssin((iVar2 + iVar4) * -800) * 900.0f); +#endif + MtxPosition(&sp5C, &sp68); + *pDst = sp68.normZC(); + MtxPull(); } /* 000006E8-00000D30 .text draw__21daMajuu_Flag_packet_cFv */ void daMajuu_Flag_packet_c::draw() { - /* Nonmatching */ + j3dSys.reinitGX(); +#if VERSION > VERSION_DEMO + GXSetNumIndStages(0); +#endif + dKy_GxFog_tevstr_set(mpTevStr); + dKy_setLight_mine(mpTevStr); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX8); + GXSetVtxDesc(GX_VA_NRM, GX_INDEX8); + GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_CLR_RGB, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_F32, 0); + GXSetArray(GX_VA_POS, getPos(), sizeof(cXyz) * 1); + GXSetArray(GX_VA_NRM, getNrm(), sizeof(cXyz) * 1); + GXSetArray(GX_VA_TEX0, l_texCoord, sizeof(l_texCoord[0])); + GXLoadTexObj(getImageTexObj(), GX_TEXMAP0); + GXLoadTexObj(getToonTexObj(), GX_TEXMAP1); + GXSetNumChans(1); + + u8 iVar2; + u8 lightMask; + if (mpTevStr->mColorK1.a != 0) { + iVar2 = 3; + lightMask = 3; + } else { + iVar2 = 2; + lightMask = 1; + } + + if (l_HIO.mbUseToonTex) { + GXSetChanCtrl(GX_COLOR0, GX_TRUE, GX_SRC_REG, GX_SRC_REG, lightMask, GX_DF_CLAMP, GX_AF_NONE); + GXSetNumTexGens(2); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_SRTG, GX_TG_COLOR0, GX_IDENTITY); + GXSetNumTevStages(iVar2); + GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C0, GX_CC_C1, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + + if (iVar2 == 3) { + GXSetTevSwapMode(GX_TEVSTAGE2, GX_TEV_SWAP0, GX_TEV_SWAP2); + GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_C2, GX_CC_TEXC, GX_CC_CPREV); + GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + } + } else { + GXSetChanCtrl(GX_COLOR0, GX_TRUE, GX_SRC_REG, GX_SRC_REG, lightMask, GX_DF_CLAMP, GX_AF_NONE); + GXSetNumTexGens(1); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetNumTevStages(iVar2); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP1, GX_TEV_SWAP0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C0, GX_CC_C1, GX_CC_RASC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_CPREV, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + + if (iVar2 == 3) { + GXSetTevSwapMode(GX_TEVSTAGE2, GX_TEV_SWAP2, GX_TEV_SWAP0); + GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_C2, GX_CC_RASC, GX_CC_CPREV); + GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + } + } + + GXSetTevColorS10(GX_TEVREG0, mpTevStr->mColorC0); + GXSetTevColor(GX_TEVREG1, mpTevStr->mColorK0); + GXSetTevColor(GX_TEVREG2, mpTevStr->mColorK1); + GXCallDisplayList(l_majuu_flag_matDL, 0x20); + GXLoadPosMtxImm(*getMtx(), 0); + GXLoadNrmMtxImm(*getMtx(), 0); + GXSetCullMode(GX_CULL_BACK); + GXCallDisplayList(l_majuu_flagDL, 0x80); + GXSetCullMode(GX_CULL_FRONT); +#if VERSION == VERSION_DEMO + GXSetArray(GX_VA_NRM, mpNrmArrBack[mCurArr], sizeof(cXyz) * 1); +#else + GXSetArray(GX_VA_NRM, getBackNrm(), sizeof(cXyz) * 1); +#endif + GXCallDisplayList(l_majuu_flagDL, 0x80); +#if VERSION > VERSION_DEMO + J3DShape::resetVcdVatCache(); +#endif } /* 00000D30-00000DCC .text daMajuu_Flag_Draw__FP14daMajuu_Flag_c */ -static BOOL daMajuu_Flag_Draw(daMajuu_Flag_c*) { - /* Nonmatching */ +static BOOL daMajuu_Flag_Draw(daMajuu_Flag_c* i_this) { + cMtx_concat(j3dSys.getViewMtx(), i_this->mMtx, *i_this->mPacket.getMtx()); + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &i_this->current.pos, &i_this->tevStr); + if (i_this->mbUsePlayerTevStr == 1) { + i_this->mPacket.setTevStr(&dComIfGp_getPlayer(0)->tevStr); + } else { + i_this->mPacket.setTevStr(&i_this->tevStr); + } + j3dSys.getDrawBuffer(0)->entryImm(&i_this->mPacket, 0); + return TRUE; } -/* 00000DCC-00000F00 .text get_cloth_anim_sub_factor__FP4cXyzP4cXyzP4cXyzf */ -void get_cloth_anim_sub_factor(cXyz*, cXyz*, cXyz*, float) { - /* Nonmatching */ +/* 00000DCC-00000F00 .text get_cloth_anim_sub_factor__FP4cXyzP4cXyzP4cXyzf + */ +void get_cloth_anim_sub_factor(cXyz* pPos, cXyz* pOther, cXyz* pDst, float distIdeal) { + cXyz sp30 = *pOther - *pPos; + cXyz sp24 = sp30.normZC(); + + f32 tmp = sp30.abs() - distIdeal; + tmp *= l_HIO.mSpring; + sp24 *= tmp; + + *pDst += sp24; } /* 00000F00-00001064 .text get_cloth_anim_factor__FP4cXyzP4cXyzP4cXyzi */ -void get_cloth_anim_factor(cXyz*, cXyz*, cXyz*, int) { - /* Nonmatching */ +cXyz get_cloth_anim_factor(cXyz* pos, cXyz* nrm, cXyz* wind, int index) { + static s32 rel_pos_idx_tbl[][6] = { + { + 1, + 2, + -1, + -1, + -1, + -1, + }, + { + 3, + 4, + 2, + 0, + -1, + -1, + }, + { + 0, + 1, + 4, + 5, + -1, + -1, + }, + { + 6, + 7, + 4, + 1, + -1, + -1, + }, + { + 1, + 3, + 7, + 8, + 5, + 2, + }, + { + 2, + 4, + 8, + 9, + -1, + -1, + }, + { + 10, + 11, + 7, + 3, + -1, + -1, + }, + { + 3, + 6, + 11, + 12, + 8, + 4, + }, + { + 4, + 7, + 12, + 13, + 9, + 5, + }, + { + 5, + 8, + 13, + 14, + -1, + -1, + }, + { + 15, + 16, + 11, + 6, + -1, + -1, + }, + { + 6, + 10, + 16, + 17, + 12, + 7, + }, + { + 7, + 11, + 17, + 18, + 13, + 8, + }, + { + 8, + 12, + 18, + 19, + 14, + 9, + }, + { + 9, + 13, + 19, + 20, + -1, + -1, + }, + { + 16, + 10, + -1, + -1, + -1, + -1, + }, + { + 17, + 11, + 10, + 15, + -1, + -1, + }, + { + 18, + 12, + 11, + 16, + -1, + -1, + }, + { + 19, + 13, + 12, + 17, + -1, + -1, + }, + { + 20, + 14, + 13, + 18, + -1, + -1, + }, + { + 14, + 19, + -1, + -1, + -1, + -1, + }, + }; + cXyz sp20 = pos[index]; + s32* relPos = rel_pos_idx_tbl[index]; + f32 fVar4 = wind->inprod(nrm[index]); + + if ((index == 15) || (index == 20)) { + return cXyz::Zero; + } + + cXyz sp14 = nrm[index] * fVar4; + sp14.y += l_HIO.mGravity; + + for (s32 i = 0; i < 5; i++, relPos++) { + if (*relPos == -1) { + break; + } + + if (*relPos == 0 || index == 0 || abs(*relPos - index) > 1) { + fVar4 = 264.9547f; + } else { + fVar4 = 102.0f; + } + + get_cloth_anim_sub_factor(&sp20, &pos[*relPos], &sp14, fVar4); + } + + return sp14; } /* 00001064-000012C8 .text majuu_flag_move__FP14daMajuu_Flag_c */ -void majuu_flag_move(daMajuu_Flag_c*) { - /* Nonmatching */ +void majuu_flag_move(daMajuu_Flag_c* i_this) { + cXyz sp2C; + cXyz sp20; + + dKyw_get_wind_vec(); + + cXyz* pPosArr1 = i_this->mPacket.getPos(); + cXyz* nrmArr = i_this->mPacket.getNrm(); + + i_this->mPacket.changeCurrentPos(); + i_this->mWave += l_HIO.mWaveSpeed; + + cXyz* pPosArr2 = i_this->mPacket.getPos(); + cXyz* pSpeed = i_this->mPacket.getOffsetVec(); + + f32 fVar5 = cM_ssin(i_this->mWave) * 0.5f + 0.5f; + sp20.set(0.0f, 0.0f, l_HIO.mWindSpeed1 * fVar5 + l_HIO.mWindSpeed2 * (1.0f - fVar5)); + sp20 *= dKyw_get_wind_pow() * 2.0f; + cMtx_ZrotS(*calc_mtx, -i_this->current.angle.z); + cMtx_XrotM(*calc_mtx, -i_this->current.angle.x); + cXyz wind; + MtxPosition(&sp20, &wind); + + for (s32 i = 0; i < 21; i++) { + f32 tmp = 0.85f; + + pPosArr2[i] = pPosArr1[i]; + sp2C = get_cloth_anim_factor(pPosArr1, nrmArr, &wind, i); + + pSpeed[i] += sp2C; +#if VERSION == VERSION_DEMO + pSpeed[i] *= tmp - REG10_F(25); +#else + pSpeed[i] *= tmp; +#endif + pPosArr2[i] += pSpeed[i]; + } + + cXyz* nrmArr2 = i_this->mPacket.getNrm(); + i_this->mPacket.setNrmMtx(); + + for (s32 i = 0; i < 21; i++, nrmArr2++) { + i_this->mPacket.setNrmVtx(nrmArr2, i); + } + + i_this->mPacket.setBackNrm(); + +#if VERSION <= VERSION_JPN + DCStoreRangeNoSync(i_this->mPacket.getPos(), sizeof(i_this->mPacket.mpPosArr[0]) * 21); +#else + DCStoreRangeNoSync(i_this->mPacket.getPos(), sizeof(i_this->mPacket.mpPosArr[0])); + DCStoreRangeNoSync(i_this->mPacket.getNrm(), sizeof(i_this->mPacket.mpNrmArr[0])); + DCStoreRangeNoSync(i_this->mPacket.getBackNrm(), sizeof(i_this->mPacket.mpNrmArrBack[0])); +#endif } /* 000012C8-000013B0 .text daMajuu_Flag_Execute__FP14daMajuu_Flag_c */ -static BOOL daMajuu_Flag_Execute(daMajuu_Flag_c*) { - /* Nonmatching */ +static BOOL daMajuu_Flag_Execute(daMajuu_Flag_c* i_this) { + if (mDoGph_gInf_c::isMonotone()) { + return TRUE; + } + + cXyz* wind = dKyw_get_wind_vec(); + s16 target = cM_atan2s(wind->x, wind->z); + if (i_this->mpParentMtx != NULL && i_this->mpParentPos != NULL) { + cXyz sp14 = cXyz::BaseZ; + cXyz sp08; + mDoMtx_stack_c::copy(i_this->mpParentMtx); + mDoMtx_stack_c::multVecSR(&sp14, &sp08); + target -= cM_atan2s(sp08.x, sp08.z); + } + cLib_addCalcAngleS2(&i_this->current.angle.y, target, 8, 0x400); + majuu_flag_move(i_this); + set_mtx(i_this); + return TRUE; } /* 000013B0-000013B8 .text daMajuu_Flag_IsDelete__FP14daMajuu_Flag_c */ @@ -63,13 +894,179 @@ static BOOL daMajuu_Flag_IsDelete(daMajuu_Flag_c*) { } /* 000013B8-00001454 .text daMajuu_Flag_Delete__FP14daMajuu_Flag_c */ -static BOOL daMajuu_Flag_Delete(daMajuu_Flag_c*) { - /* Nonmatching */ +static BOOL daMajuu_Flag_Delete(daMajuu_Flag_c* i_this) { + dComIfG_resDeleteDemo(&i_this->mPhsCloth, "Cloth"); + if (i_this->mTexType == 1) { + dComIfG_resDeleteDemo(&i_this->mPhsFlag, "Matif"); + } else if (i_this->mTexType == 2) { + dComIfG_resDeleteDemo(&i_this->mPhsFlag, "Vsvfg"); + } else if (i_this->mTexType == 3) { + dComIfG_resDeleteDemo(&i_this->mPhsFlag, "Xhcf"); + } + return TRUE; } /* 00001454-00001AE0 .text daMajuu_Flag_Create__FP10fopAc_ac_c */ -static cPhs_State daMajuu_Flag_Create(fopAc_ac_c*) { - /* Nonmatching */ +static cPhs_State daMajuu_Flag_Create(fopAc_ac_c* a_this) { + daMajuu_Flag_c* i_this = (daMajuu_Flag_c*)a_this; + + fopAcM_SetupActor(a_this, daMajuu_Flag_c); + + u32 uVar3 = fopAcM_GetParam(a_this); + u32 uVar2 = uVar3 & 0xFF; + i_this->mTexType = (uVar3 >> 0x18) & 0xFF; + cPhs_State ret = dComIfG_resLoad(&i_this->mPhsCloth, "Cloth"); +#if VERSION > VERSION_DEMO + if (ret != cPhs_COMPLEATE_e) { + return ret; + } +#endif + + cPhs_State ret2; + if (i_this->mTexType == 0) { + ret2 = cPhs_COMPLEATE_e; + } else if (i_this->mTexType == 1) { + ret2 = dComIfG_resLoad(&i_this->mPhsFlag, "Matif"); + } else if (i_this->mTexType == 2) { + ret2 = dComIfG_resLoad(&i_this->mPhsFlag, "Vsvfg"); + } else if (i_this->mTexType == 3) { + ret2 = dComIfG_resLoad(&i_this->mPhsFlag, "Xhcf"); + } + +#if VERSION == VERSION_DEMO + s32 r; + if (ret == cPhs_ERROR_e || ret2 == cPhs_ERROR_e) { + return cPhs_ERROR_e; + } else if (ret != cPhs_COMPLEATE_e) { + return ret; + } else if (ret2 != cPhs_COMPLEATE_e) { + return ret2; + } else { + r = cPhs_COMPLEATE_e; + } + + if (r == cPhs_COMPLEATE_e) +#else + if (ret2 != cPhs_COMPLEATE_e) { + return ret2; + } +#endif + + { + i_this->mFlagType = uVar2; + cXyz* posArr = i_this->mPacket.getPos(); + cXyz* nrmArr = i_this->mPacket.getNrm(); + cXyz* speedArr = i_this->mPacket.getOffsetVec(); + + for (s32 i = 0; i < 21; i++, posArr++, speedArr++) { + *posArr = l_majuu_flag_pos[i]; + nrmArr->x = 1.0f; + nrmArr->y = 0.0f; + nrmArr->z = 0.0f; + speedArr->setall(0.0f); + if (i != 15 && i != 20) { + posArr->x += cM_rndFX(10.0f); + posArr->y += cM_rndFX(10.0f); + posArr->z += cM_rndFX(10.0f); + } + } + + i_this->mPacket.setBackNrm(); + i_this->mbUsePlayerTevStr = 0; + + if (i_this->mTexType == 0) { + if (uVar2 == 2) { + i_this->mFlagScale = 2.0f; + } else if (uVar2 == 3) { + i_this->mFlagScale = 1.27f; + i_this->mbUsePlayerTevStr = 1; + } else if (uVar2 == 4) { + i_this->mFlagScale = 0.3f; + } else { + i_this->mFlagScale = 1.0f; + } + } else if (uVar2 == 0xff) { + i_this->mFlagScale = 0.3f; + } else { + i_this->mFlagScale = uVar2 * 0.05f + 0.3f; + } + + set_mtx(i_this); + fopAcM_SetMtx(a_this, i_this->mMtx); + fopAcM_setCullSizeBox(a_this, -300.0f, -1500.0f, -100.0f, 300.0f, 100.0f, 1200.0f); + fopAcM_setCullSizeFar(a_this, 5.0f); + cXyz* wind = dKyw_get_wind_vec(); + i_this->current.angle.y = cM_atan2s(wind->x, wind->z); + + const ResTIMG* texInfo; + GXBool mip; + + if (i_this->mTexType != 0) { + if (i_this->mTexType == 1) { + texInfo = (ResTIMG*)dComIfG_getObjectRes("Matif", MATIF_BTI_FLAG_MATI); + } else if (i_this->mTexType == 2) { + texInfo = (ResTIMG*)dComIfG_getObjectRes("Vsvfg", VSVFG_BTI_VSVFG); + } else if (i_this->mTexType == 3) { + texInfo = (ResTIMG*)dComIfG_getObjectRes("Xhcf", XHCF_BTI_X_HC_FLAG00); + } + mip = GXBool(texInfo->mipmapCount > 1); + GXInitTexObj( + i_this->mPacket.getImageTexObj(), + (u8*)texInfo + texInfo->imageOffset, + texInfo->width, + texInfo->height, + GXTexFmt(texInfo->format), + GXTexWrapMode(texInfo->wrapS), + GXTexWrapMode(texInfo->wrapT), + mip + ); + GXInitTexObjLOD( + i_this->mPacket.getImageTexObj(), + GXTexFilter(texInfo->minFilter), + GXTexFilter(texInfo->magFilter), + texInfo->minLOD * 0.125f, + texInfo->maxLOD * 0.125f, + texInfo->LODBias * 0.01f, + texInfo->biasClamp, + texInfo->doEdgeLOD, + GXAnisotropy(texInfo->maxAnisotropy) + ); + } else { + GXInitTexObj(i_this->mPacket.getImageTexObj(), l_flag02TEX, 0x40, 0x40, GX_TF_CMPR, GX_CLAMP, GX_CLAMP, false); + GXInitTexObjLOD(i_this->mPacket.getImageTexObj(), GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); + } + + texInfo = (ResTIMG*)dComIfG_getObjectRes("Cloth", CLOTH_BTI_CLOTHTOON); + mip = GXBool(texInfo->mipmapCount > 1); + GXInitTexObj( + i_this->mPacket.getToonTexObj(), + (u8*)texInfo + texInfo->imageOffset, + texInfo->width, + texInfo->height, + GXTexFmt(texInfo->format), + GXTexWrapMode(texInfo->wrapS), + GXTexWrapMode(texInfo->wrapT), + mip + ); + GXInitTexObjLOD( + i_this->mPacket.getToonTexObj(), + GXTexFilter(texInfo->minFilter), + GXTexFilter(texInfo->magFilter), + texInfo->minLOD * 0.125f, + texInfo->maxLOD * 0.125f, + texInfo->LODBias * 0.01f, + texInfo->biasClamp, + texInfo->doEdgeLOD, + GXAnisotropy(texInfo->maxAnisotropy) + ); + + if (i_this->mTexType == 3) { + for (s32 i = 0; i < 20; i++) { + majuu_flag_move(i_this); + } + } + } + return cPhs_COMPLEATE_e; } static actor_method_class l_daMajuu_Flag_Method = { diff --git a/src/d/actor/d_a_pirate_flag.cpp b/src/d/actor/d_a_pirate_flag.cpp index ee7845c02..cf909ea9f 100644 --- a/src/d/actor/d_a_pirate_flag.cpp +++ b/src/d/actor/d_a_pirate_flag.cpp @@ -122,7 +122,7 @@ void daPirate_Flag_packet_c::setCorrectNrmAngle(s16 param_0, f32 param_1) { /* 00000364-000003F0 .text setBackNrm__22daPirate_Flag_packet_cFv */ void daPirate_Flag_packet_c::setBackNrm() { cXyz* a = getNrm(); - cXyz* b = m4F4[m87E]; + cXyz* b = getBackNrm(); for (int i = 0; i < (s32)ARRAY_SIZE(*mNrm); i++) { b->setall(0.0f); *b -= *a; @@ -276,7 +276,7 @@ void daPirate_Flag_packet_c::draw() { GXCallDisplayList(l_pirate_flag_DL, sizeof(l_pirate_flag_DL) - 0x04); GXSetCullMode(GX_CULL_FRONT); - GXSetArray(GX_VA_NRM, m4F4[m87E], sizeof(cXyz)); + GXSetArray(GX_VA_NRM, getBackNrm(), sizeof(cXyz)); GXCallDisplayList(l_pirate_flag_DL, sizeof(l_pirate_flag_DL) - 0x04); #if VERSION > VERSION_JPN @@ -457,7 +457,7 @@ static void pirate_flag_move(pirate_flag_class* i_this) { #else DCStoreRangeNoSync(i_this->mPacket.getPos(), sizeof(*i_this->mPacket.mPos)); DCStoreRangeNoSync(i_this->mPacket.getNrm(), sizeof(*i_this->mPacket.mNrm)); - DCStoreRangeNoSync(i_this->mPacket.getNrm() + sizeof(i_this->mPacket.mNrm) / sizeof(cXyz), sizeof(*i_this->mPacket.m4F4)); // Fakematch? + DCStoreRangeNoSync(i_this->mPacket.getBackNrm(), sizeof(*i_this->mPacket.m4F4)); #endif } diff --git a/src/d/actor/d_a_sail.cpp b/src/d/actor/d_a_sail.cpp index 54fd49f1e..76c971051 100644 --- a/src/d/actor/d_a_sail.cpp +++ b/src/d/actor/d_a_sail.cpp @@ -280,7 +280,7 @@ void daSail_packet_c::setNrmMtx() { /* 00000398-00000424 .text setBackNrm__15daSail_packet_cFv */ void daSail_packet_c::setBackNrm() { cXyz* vtxNrm1 = getNrm(); - cXyz* vtxNrm2 = m1454[m1C3A]; + cXyz* vtxNrm2 = getBackNrm(); for (int i = 0; i < 0x54; i++) { vtxNrm2->setall(0.0f); *vtxNrm2 -= *vtxNrm1; @@ -717,7 +717,7 @@ static void sail_move(sail_class* i_this) { #else DCStoreRangeNoSync(i_this->mSailPacket.getPos(), sizeof(*i_this->mSailPacket.mPos)); DCStoreRangeNoSync(i_this->mSailPacket.getNrm(), sizeof(*i_this->mSailPacket.mNrm)); - DCStoreRangeNoSync(i_this->mSailPacket.getNrm() + sizeof(i_this->mSailPacket.mNrm) / sizeof(cXyz), sizeof(*i_this->mSailPacket.m1454)); // Fakematch? + DCStoreRangeNoSync(i_this->mSailPacket.getBackNrm(), sizeof(*i_this->mSailPacket.m1454)); #endif }