Files
tww/src/d/actor/d_a_majuu_flag.cpp
T
LagoLunatic b77717694c Add dolzel_rel.pch
This fixes the sdata linker error in the debug build.
2025-08-23 12:17:10 -04:00

1084 lines
28 KiB
C++

//
// Generated by dtk
// Translation Unit: d_a_majuu_flag.cpp
//
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_majuu_flag.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"
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;
}
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;
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* 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() {
cMtx_YrotS(*calc_mtx, mRotateY);
}
/* 000003E4-0000046C .text setBackNrm__21daMajuu_Flag_packet_cFv */
void daMajuu_Flag_packet_c::setBackNrm() {
cXyz* nrm = mpNrmArr[mCurArr];
cXyz* nrmBack = mpNrmArrBack[mCurArr];
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* 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() {
j3dSys.reinitGX();
#if VERSION > VERSION_JPN
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);
GXSetArray(GX_VA_NRM, mpNrmArrBack[mCurArr], sizeof(cXyz) * 1);
GXCallDisplayList(l_majuu_flagDL, 0x80);
#if VERSION > VERSION_JPN
J3DShape::resetVcdVatCache();
#endif
}
/* 00000D30-00000DCC .text daMajuu_Flag_Draw__FP14daMajuu_Flag_c */
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* 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 */
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* 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* 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 */
static BOOL daMajuu_Flag_IsDelete(daMajuu_Flag_c*) {
return TRUE;
}
/* 000013B8-00001454 .text daMajuu_Flag_Delete__FP14daMajuu_Flag_c */
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* 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 = {
(process_method_func)daMajuu_Flag_Create,
(process_method_func)daMajuu_Flag_Delete,
(process_method_func)daMajuu_Flag_Execute,
(process_method_func)daMajuu_Flag_IsDelete,
(process_method_func)daMajuu_Flag_Draw,
};
actor_process_profile_definition g_profile_MAJUU_FLAG = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 0x0007,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_MAJUU_FLAG,
/* Proc SubMtd */ &g_fpcLf_Method.base,
/* Size */ sizeof(daMajuu_Flag_c),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Priority */ PRIO_MAJUU_FLAG,
/* Actor SubMtd */ &l_daMajuu_Flag_Method,
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e,
/* Group */ fopAc_ACTOR_e,
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
};