mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-05-23 22:45:05 -04:00
6ec6fce8cb
* Fix JUT_ASSERT to be a nested define * Switch names that appear in asserts to be constants instead of defines * Replace `0` in asserts with `NULL` or `FALSE` * Fix fpclassify * Fix ARRAY_SIZE * Use G_CM3D_F_INF * More fixes for fpclassify * Remove FLOAT_LABEL * Remove incorrect FLAG_ON macro * Remove UNK_BSS macro * Silence clangd unused header warning for PCH
565 lines
22 KiB
C++
565 lines
22 KiB
C++
/**
|
|
* @file d_a_obj_flag2.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_obj_flag2.h"
|
|
#include "JSystem/J3DGraphBase/J3DDrawBuffer.h"
|
|
#include "SSystem/SComponent/c_math.h"
|
|
#include "d/actor/d_a_set_bgobj.h"
|
|
#include "d/d_a_obj.h"
|
|
#include "d/d_cc_d.h"
|
|
#include "d/d_com_inf_game.h"
|
|
|
|
#ifdef DEBUG
|
|
class daObjFlag2_Hio_c : public JORReflexible {
|
|
public:
|
|
daObjFlag2_Hio_c() {
|
|
mCount = 0;
|
|
default_set();
|
|
}
|
|
|
|
void default_set() { mAttr = daObjFlag2_c::M_attr; }
|
|
|
|
void genMessage(JORMContext* ctx) {
|
|
ctx->genLabel("§ 旗オブジェパラメータ設定 §\n", 0, 0, NULL, 0xffff, 0xffff, 0x200, 0x18);
|
|
ctx->genSlider("重力", &mAttr.mGravity, -10.0f, 0.0f, 0, NULL, 0xffff, 0xffff, 0x200, 0x18);
|
|
ctx->genSlider("バネ係数", &mAttr.mSpringCoeeficient, 0.0f, 10.0f, 0, NULL, 0xffff, 0xffff,
|
|
0x200, 0x18);
|
|
ctx->genSlider("減衰率", &mAttr.mDecayRate, 0.0f, 1.0f, 0, NULL, 0xffff, 0xffff,
|
|
0x200, 0x18);
|
|
ctx->genSlider("風係数", &mAttr.mWindCoefficient, 0.0f, 100.0f, 0, NULL, 0xffff, 0xffff,
|
|
0x200, 0x18);
|
|
ctx->genSlider("竜巻", &mAttr.mTornado, 0.0f, 500.0f, 0, NULL, 0xffff, 0xffff, 0x200, 0x18);
|
|
}
|
|
|
|
void ct() {
|
|
if (mCount++ == 0) {
|
|
daObj::HioVarious_c::init(this, "旗"); // Flag
|
|
}
|
|
}
|
|
|
|
void dt() {
|
|
if (--mCount == 0) {
|
|
daObj::HioVarious_c::clean(this);
|
|
}
|
|
}
|
|
|
|
/* 0x4 */ int mCount;
|
|
/* 0x8 */ daObjFlag2_Attr_c mAttr;
|
|
};
|
|
|
|
daObjFlag2_Hio_c M_hio;
|
|
#endif
|
|
|
|
/* 80BEE0DC-80BEE0F0 000000 0014+00 5/5 0/0 0/0 .rodata M_attr__12daObjFlag2_c */
|
|
daObjFlag2_Attr_c const daObjFlag2_c::M_attr = {
|
|
-2.0f, 0.74f, 0.68f, 40.0f, 100.0f,
|
|
};
|
|
|
|
/* 80BEE220-80BEE31C 000000 00FC+00 1/1 0/0 0/0 .data l_pennant_flag_pos */
|
|
static Vec l_pennant_flag_pos[21] = {
|
|
0.0f, 0.0f, 500.0f, 0.0f, 30.0f, 400.0f, 0.0f, -30.0f, 400.0f, 0.0f, 60.0f,
|
|
300.0f, 0.0f, 0.0f, 300.0f, 0.0f, -60.0f, 300.0f, 0.0f, 90.0f, 200.0f, 0.0f,
|
|
30.0f, 200.0f, 0.0f, -30.0f, 200.0f, 0.0f, -90.0f, 200.0f, 0.0f, 120.0f, 100.0f,
|
|
0.0f, 60.0f, 100.0f, 0.0f, 0.0f, 100.0f, 0.0f, -60.0f, 100.0f, 0.0f, -120.0f,
|
|
100.0f, 0.0f, 150.0f, 0.0f, 0.0f, 90.0f, 0.0f, 0.0f, 30.0f, 0.0f, 0.0f,
|
|
-30.0f, 0.0f, 0.0f, -90.0f, 0.0f, 0.0f, -150.0f, 0.0f,
|
|
};
|
|
|
|
/* 80BEC658-80BEC790 000078 0138+00 1/1 0/0 0/0 .text
|
|
* initFlagPos__11FlagCloth_cFP4cXyzP10fopAc_ac_c */
|
|
void FlagCloth_c::initFlagPos(cXyz* pFlagPos, fopAc_ac_c* i_actor) {
|
|
mpFlagPosition = pFlagPos;
|
|
cXyz direction;
|
|
f32 power;
|
|
dKyw_get_AllWind_vec(mpFlagPosition, &direction, &power);
|
|
mDoMtx_stack_c::transS(*mpFlagPosition);
|
|
cMtx_copy(mDoMtx_stack_c::get(), mModelMtx);
|
|
cXyz* pPos = getPos();
|
|
for (int i = 0; i < 21; i++, pPos++) {
|
|
pPos->set(l_pennant_flag_pos[i]);
|
|
if (i != 15 && i != 20) {
|
|
pPos->x += cM_rndFX(10.0f);
|
|
pPos->y += cM_rndFX(10.0f);
|
|
pPos->z += cM_rndFX(10.0f);
|
|
}
|
|
}
|
|
|
|
cXyz* pNormal = getNormal();
|
|
for (int i = 0; i < 21; i++, pNormal++) {
|
|
calcFlagNormal(pNormal, i);
|
|
}
|
|
calcFlagNormalBack();
|
|
initCcSphere(i_actor);
|
|
}
|
|
|
|
/* 80BEE31C-80BEE3C4 0000FC 00A8+00 1/1 0/0 0/0 .data l_texCoord_64x64 */
|
|
static f32 l_texCoord_64x64[42] = {
|
|
1.0, 0.5, 0.8f, 0.4f, 0.8f, 0.6f, 0.6f, 0.3f, 0.6f, 0.5, 0.6f, 0.7f, 0.4f, 0.2f,
|
|
0.4f, 0.4f, 0.4f, 0.6f, 0.4f, 0.8f, 0.2f, 0.1f, 0.2f, 0.3f, 0.2f, 0.5, 0.2f, 0.7f,
|
|
0.2f, 0.9f, 0.0, 0.0, 0.0, 0.2f, 0.0, 0.4f, 0.0, 0.6f, 0.0, 0.8f, 0.0, 1.0,
|
|
};
|
|
|
|
/* 80BEE3C4-80BEE480 0001A4 00A8+14 1/1 0/0 0/0 .data l_texCoord */
|
|
static f32 l_texCoord[42] = {
|
|
0.0, 0.5, 0.2f, 0.4f, 0.2f, 0.6f, 0.4f, 0.3f, 0.4f, 0.5, 0.4f, 0.7f, 0.6f, 0.2f,
|
|
0.6f, 0.4f, 0.6f, 0.6f, 0.6f, 0.8f, 0.8f, 0.1f, 0.8f, 0.3f, 0.8f, 0.5, 0.8f, 0.7f,
|
|
0.8f, 0.9f, 1.0, 0.0, 1.0, 0.2f, 1.0, 0.4f, 1.0, 0.6f, 1.0, 0.8f, 1.0, 1.0,
|
|
};
|
|
|
|
/* 80BEE480-80BEE518 000260 0098+00 1/1 0/0 0/0 .data l_pennant_flagDL */
|
|
static u8 l_pennant_flagDL[152] ALIGN_DECL(32) = {
|
|
0x98, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x05,
|
|
0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E, 0x0E, 0x13, 0x13,
|
|
0x13, 0x14, 0x14, 0x14, 0x98, 0x00, 0x09, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04,
|
|
0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x13,
|
|
0x13, 0x13, 0x98, 0x00, 0x07, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x0B, 0x0B,
|
|
0x0B, 0x0C, 0x0C, 0x0C, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x98, 0x00, 0x05, 0x06, 0x06, 0x06,
|
|
0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x90, 0x00, 0x03, 0x10,
|
|
0x10, 0x10, 0x0A, 0x0A, 0x0A, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
};
|
|
|
|
/* 80BEC7CC-80BEC928 0001EC 015C+00 1/1 0/0 0/0 .text
|
|
* calcFlagFactor__11FlagCloth_cFP4cXyzP4cXyzP4cXyzi */
|
|
cXyz FlagCloth_c::calcFlagFactor(cXyz* param_1, cXyz* param_2, cXyz* param_3, int param_4) {
|
|
static int rel_pos_idx_tbl[126] = {
|
|
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 flagFactor(0.0f, 0.0f, 0.0f);
|
|
if (param_4 == 15 || param_4 == 20) {
|
|
return cXyz::Zero;
|
|
}
|
|
|
|
int* pRelPosIdx = rel_pos_idx_tbl + param_4 * 6;
|
|
flagFactor = param_2[param_4] * param_3->inprod(param_2[param_4]);
|
|
flagFactor.y += mGravity;
|
|
for (int i = 0; i < 6; i++, pRelPosIdx++) {
|
|
if (*pRelPosIdx == -1) {
|
|
break;
|
|
}
|
|
f32 fVar1;
|
|
if (*pRelPosIdx == 0 || param_4 == 0 || abs(*pRelPosIdx - param_4) > 1) {
|
|
fVar1 = 104.40307f;
|
|
} else {
|
|
fVar1 = 60.0f;
|
|
}
|
|
calcFlagFactorSub(param_1 + param_4, param_1 + *pRelPosIdx, &flagFactor, fVar1);
|
|
}
|
|
return flagFactor;
|
|
}
|
|
|
|
/* 80BEC928-80BECAE0 000348 01B8+00 1/1 0/0 0/0 .text
|
|
* calcFlagFactorSub__11FlagCloth_cFP4cXyzP4cXyzP4cXyzf */
|
|
void FlagCloth_c::calcFlagFactorSub(cXyz* param_1, cXyz* param_2, cXyz* param_3, f32 param_4) {
|
|
cXyz acStack_2c = *param_2 - *param_1;
|
|
param_4 = acStack_2c.abs() - param_4;
|
|
cXyz cStack_38 = acStack_2c.normZC();
|
|
param_4 *= mSpringRate;
|
|
cStack_38 *= param_4;
|
|
*param_3 += cStack_38;
|
|
}
|
|
|
|
/* 80BECAE0-80BECC34 000500 0154+00 2/2 0/0 0/0 .text calcFlagNormal__11FlagCloth_cFP4cXyzi */
|
|
void FlagCloth_c::calcFlagNormal(cXyz* o_normal, int param_2) {
|
|
static int rel_pos_idx_tbl[147] = {
|
|
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* pPos = getPos();
|
|
cXyz acStack_30(pPos[param_2]);
|
|
cXyz cStack_3c;
|
|
cXyz cStack_48;
|
|
cXyz cStack_54;
|
|
int* piVar3 = rel_pos_idx_tbl + param_2 * 7;
|
|
cXyz cStack_60(0.0f, 0.0f, 0.0f);
|
|
for (int i = 0; i < 6; i++, piVar3++) {
|
|
if (piVar3[1] == -1) {
|
|
break;
|
|
}
|
|
cStack_3c = pPos[piVar3[0]] - acStack_30;
|
|
cStack_48 = pPos[piVar3[1]] - acStack_30;
|
|
cStack_54 = cStack_48.outprod(cStack_3c);
|
|
cStack_60 += cStack_54;
|
|
}
|
|
cStack_60.normalizeZP();
|
|
o_normal->set(cStack_60);
|
|
}
|
|
|
|
/* 80BECC34-80BECC78 000654 0044+00 1/1 0/0 0/0 .text calcFlagNormalBack__11FlagCloth_cFv
|
|
*/
|
|
inline void FlagCloth_c::calcFlagNormalBack() {
|
|
cXyz* pNormal = getNormal();
|
|
cXyz* pNormalBack = getNormalBack();
|
|
for (int i = 0; i < 21; pNormal++, pNormalBack++, i++) {
|
|
pNormalBack->set(-pNormal->x, -pNormal->y, -pNormal->z);
|
|
}
|
|
}
|
|
|
|
/* 80BECC78-80BECCE4 000698 006C+00 1/1 0/0 0/0 .text initCcSphere__11FlagCloth_cFP10fopAc_ac_c */
|
|
void FlagCloth_c::initCcSphere(fopAc_ac_c* i_actor) {
|
|
const static dCcD_SrcSph ccSphSrc = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x0}, {0x10000, 0x11}, 0x0}}, // mObj
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x1}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 100.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
mStts.Init(0xff, 0xff, i_actor);
|
|
mSph.Set(ccSphSrc);
|
|
mSph.SetStts(&mStts);
|
|
mSph.SetC(getTargetPos());
|
|
}
|
|
|
|
/* 80BECCE4-80BECD98 000704 00B4+00 1/1 0/0 0/0 .text setCcSphere__11FlagCloth_cFv */
|
|
void FlagCloth_c::setCcSphere() {
|
|
if (mSph.ChkTgHit()) {
|
|
if (mSph.GetTgHitObj()->ChkAtType(AT_TYPE_BOOMERANG)) {
|
|
cXyz* pVec = getVec();
|
|
for (int i = 0; i < 21; i++, pVec++) {
|
|
if (i != 15 && i != 20) {
|
|
pVec->y += mTornado;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mSph.SetC(getTargetPos());
|
|
dComIfG_Ccsp()->Set(&mSph);
|
|
}
|
|
|
|
/* 80BECD98-80BECF30 0007B8 0198+00 1/1 0/0 0/0 .text execute__11FlagCloth_cFv */
|
|
void FlagCloth_c::execute() {
|
|
cXyz direction;
|
|
f32 power;
|
|
dKyw_get_AllWind_vec(mpFlagPosition, &direction, &power);
|
|
direction.normalizeZP();
|
|
direction *= power * mWindRate;
|
|
cXyz* pPos = getPos();
|
|
cXyz* pNormal = getNormal();
|
|
cXyz* pNormal2 = pNormal;
|
|
cXyz* pVec = getVec();
|
|
cXyz cStack_40;
|
|
for (int i = 0; i < 21; pVec++, i++) {
|
|
cXyz cStack_40 = calcFlagFactor(pPos, pNormal, &direction, i);
|
|
*pVec += cStack_40;
|
|
*pVec *= mDecayRate;
|
|
}
|
|
|
|
pNormal = getVec();
|
|
for (int i = 0; i < 21; pPos++, pNormal++, i++) {
|
|
*pPos += *pNormal;
|
|
}
|
|
|
|
for (int i = 0; i < 21; pNormal2++, i++) {
|
|
calcFlagNormal(pNormal2, i);
|
|
}
|
|
calcFlagNormalBack();
|
|
setCcSphere();
|
|
DCStoreRangeNoSync(getPos(), sizeof(cXyz) * 21);
|
|
DCStoreRangeNoSync(getNormal(), sizeof(cXyz) * 21);
|
|
DCStoreRangeNoSync(getNormalBack(), sizeof(cXyz) * 21);
|
|
}
|
|
|
|
/* 80BECF30-80BED22C 000950 02FC+00 1/0 0/0 0/0 .text draw__11FlagCloth_cFv */
|
|
void FlagCloth_c::draw() {
|
|
j3dSys.reinitGX();
|
|
GXSetNumIndStages(0);
|
|
dKy_setLight_again();
|
|
dKy_GxFog_tevstr_set(&mTevStr);
|
|
dKy_setLight_mine(&mTevStr);
|
|
g_env_light.settingTevStruct(0x10, mpFlagPosition, &mTevStr);
|
|
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));
|
|
GXSetArray(GX_VA_NRM, getNormal(), sizeof(cXyz));
|
|
GXSetArray(GX_VA_TEX0, mpTexCoord, 8);
|
|
GXSetZCompLoc(GX_FALSE);
|
|
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
|
|
GXLoadTexObj(&mTexObj, GX_TEXMAP0);
|
|
GXSetNumChans(1);
|
|
GXSetChanCtrl(GX_COLOR0, GX_TRUE, GX_SRC_REG, GX_SRC_REG, 0xff, GX_DF_CLAMP, GX_AF_SPOT);
|
|
GXSetNumTexGens(1);
|
|
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3c);
|
|
GXSetNumTevStages(1);
|
|
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
|
|
dKy_Global_amb_set(&mTevStr);
|
|
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
|
|
GXSetTevColor(GX_TEVREG0, (GXColor){0, 0, 0, 0xff});
|
|
GXSetTevKColor(GX_KCOLOR0, (GXColor){0, 0, 0, 0xff});
|
|
GXSetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_K0);
|
|
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_KONST, GX_CC_TEXC, GX_CC_RASC, GX_CC_C0);
|
|
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_4, GX_TRUE, GX_TEVPREV);
|
|
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_KONST, GX_CA_TEXA, GX_CA_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
|
GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K3_A);
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
Mtx viewModelMtx;
|
|
cMtx_concat(j3dSys.getViewMtx(), mModelMtx, viewModelMtx);
|
|
GXLoadPosMtxImm(viewModelMtx, 0);
|
|
GXLoadNrmMtxImm(viewModelMtx, 0);
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
GXSetCullMode(GX_CULL_BACK);
|
|
GXCallDisplayList(l_pennant_flagDL, 0x80);
|
|
GXSetArray(GX_VA_NRM, getNormalBack(), sizeof(cXyz));
|
|
GXSetCullMode(GX_CULL_FRONT);
|
|
GXCallDisplayList(l_pennant_flagDL, 0x80);
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
|
|
/* 80BED22C-80BED368 000C4C 013C+00 1/1 0/0 0/0 .text create_init__12daObjFlag2_cFv */
|
|
void daObjFlag2_c::create_init() {
|
|
int* pOffset = (int*)dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), "spec.dat");
|
|
f32 offset = (u16)*pOffset;
|
|
mFlagPosition.set(current.pos.x, current.pos.y + offset, current.pos.z);
|
|
fopAcM_setCullSizeBox(this, -600.0f, -offset, -600.0f, 600.0f, 400.0f, 600.0f);
|
|
eyePos.set(mFlagCloth.getTargetPos());
|
|
mFlagCloth.initFlagPos(&mFlagPosition, this);
|
|
mFlagCloth.setSpringRate(attr().mSpringCoeeficient);
|
|
mFlagCloth.setWindRate(attr().mWindCoefficient);
|
|
mFlagCloth.setDecayRate(attr().mDecayRate);
|
|
mFlagCloth.setGravity(attr().mGravity);
|
|
mFlagCloth.setTornado(attr().mTornado);
|
|
dKy_tevstr_init(&mFlagCloth.mTevStr, fopAcM_GetRoomNo(this), 0xff);
|
|
initBaseMtx();
|
|
initCollision();
|
|
|
|
#ifdef DEBUG
|
|
M_hio.ct();
|
|
#endif
|
|
}
|
|
|
|
/* 80BED368-80BED3B8 000D88 0050+00 1/1 0/0 0/0 .text initBaseMtx__12daObjFlag2_cFv */
|
|
void daObjFlag2_c::initBaseMtx() {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
fopAcM_SetMtx(this, mModel->getBaseTRMtx());
|
|
}
|
|
|
|
/* 80BED3B8-80BED44C 000DD8 0094+00 1/1 0/0 0/0 .text initCollision__12daObjFlag2_cFv */
|
|
void daObjFlag2_c::initCollision() {
|
|
const static dCcD_SrcCyl ccCylSrc = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x0}, {0x0, 0x0}, 0x79}}, // mObj
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x4}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{0.0f, 0.0f, 0.0f}, // mCenter
|
|
15.0f, // mRadius
|
|
30.0f // mHeight
|
|
} // mCyl
|
|
};
|
|
mStts.Init(0xff, 0xff, this);
|
|
mCyl.Set(ccCylSrc);
|
|
mCyl.SetStts(&mStts);
|
|
mCyl.SetC(current.pos);
|
|
mCyl.SetR(15.0f);
|
|
mCyl.SetH(mFlagPosition.y + 200.0f);
|
|
setCollision();
|
|
}
|
|
|
|
/* 80BED44C-80BED480 000E6C 0034+00 2/2 0/0 0/0 .text setCollision__12daObjFlag2_cFv */
|
|
void daObjFlag2_c::setCollision() {
|
|
dComIfG_Ccsp()->Set(&mCyl);
|
|
}
|
|
|
|
/* 80BED480-80BED680 000EA0 0200+00 1/1 0/0 0/0 .text createHeap__12daObjFlag2_cFv */
|
|
int daObjFlag2_c::createHeap() {
|
|
s8 flagNum = (u8)shape_angle.x;
|
|
if (mFlagValid) {
|
|
char acStack_40[16];
|
|
sprintf(acStack_40, "flag%02d.bti", flagNum);
|
|
shape_angle.setall(0);
|
|
current.angle.setall(0);
|
|
ResTIMG* image = (ResTIMG*)dComIfG_getObjectRes(mFlagName, "flag.bti");
|
|
JUT_ASSERT(838, image != NULL);
|
|
GXInitTexObj(mFlagCloth.getImageTexObj(), (u8*)image + image->imageOffset, image->width,
|
|
image->height, (GXTexFmt)image->format, (GXTexWrapMode)image->wrapS,
|
|
(GXTexWrapMode)image->wrapT, image->mipmapCount > 1 ? GX_TRUE : GX_FALSE);
|
|
if (image->mipmapCount > 1) {
|
|
GXInitTexObjLOD(mFlagCloth.getImageTexObj(), (GXTexFilter)image->minFilter,
|
|
(GXTexFilter)image->magFilter, image->minLOD * 0.125f,
|
|
image->maxLOD * 0.125f, image->LODBias * 0.01f, image->biasClamp,
|
|
image->doEdgeLOD, (GXAnisotropy)image->maxAnisotropy);
|
|
}
|
|
if (image->width == image->height) {
|
|
mFlagCloth.setTexCoord_p(l_texCoord_64x64);
|
|
} else if (image->width == (image->height << 1)) {
|
|
mFlagCloth.setTexCoord_p(l_texCoord);
|
|
} else {
|
|
JUT_ASSERT(861, FALSE);
|
|
}
|
|
}
|
|
J3DModelData* modelData_pole = (J3DModelData*)dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), "model0.bmd");
|
|
JUT_ASSERT(865, modelData_pole != NULL);
|
|
mModel = mDoExt_J3DModel__create(modelData_pole, 0x80000, 0x11000084);
|
|
return mModel != NULL ? TRUE : FALSE;
|
|
}
|
|
|
|
/* 80BED680-80BED6A0 0010A0 0020+00 1/1 0/0 0/0 .text createSolidHeap__FP10fopAc_ac_c */
|
|
static int createSolidHeap(fopAc_ac_c* i_this) {
|
|
return static_cast<daObjFlag2_c*>(i_this)->createHeap();
|
|
}
|
|
|
|
/* 80BED6A0-80BED7A4 0010C0 0104+00 1/1 0/0 0/0 .text create__12daObjFlag2_cFv */
|
|
int daObjFlag2_c::create() {
|
|
fopAcM_SetupActor(this, daObjFlag2_c);
|
|
s8 flagNum = (u8)shape_angle.x;
|
|
if (flagNum <= -1 || flagNum > 99) {
|
|
mFlagValid = false;
|
|
} else {
|
|
mFlagValid = true;
|
|
sprintf(mFlagName, "FlagObj%02d", flagNum);
|
|
int rv = dComIfG_resLoad(&mFlagPhase, mFlagName);
|
|
if (rv != cPhs_COMPLEATE_e) {
|
|
return rv;
|
|
}
|
|
}
|
|
|
|
int rv = dComIfG_resLoad(&mArcPhase, daSetBgObj_c::getArcName(this));
|
|
if (rv == cPhs_COMPLEATE_e) {
|
|
if (fopAcM_entrySolidHeap(this, createSolidHeap, 0x820) == 0) {
|
|
return cPhs_ERROR_e;
|
|
} else {
|
|
create_init();
|
|
}
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
/* 80BEDCE0-80BEDDA0 001700 00C0+00 1/1 0/0 0/0 .text draw__12daObjFlag2_cFv */
|
|
int daObjFlag2_c::draw() {
|
|
g_env_light.settingTevStruct(0x10, ¤t.pos, &tevStr);
|
|
dComIfGd_setListBG();
|
|
g_env_light.setLightTevColorType_MAJI(mModel, &tevStr);
|
|
mDoExt_modelUpdateDL(mModel);
|
|
if (mFlagValid) {
|
|
j3dSys.getDrawBuffer(0)->entryImm(&mFlagCloth, 0);
|
|
}
|
|
dComIfGd_setList();
|
|
return 1;
|
|
}
|
|
|
|
/* 80BEDDA0-80BEDDC0 0017C0 0020+00 1/0 0/0 0/0 .text daObjFlag2_Draw__FP12daObjFlag2_c
|
|
*/
|
|
static int daObjFlag2_Draw(daObjFlag2_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
int daObjFlag2_c::execute() {
|
|
if (!mFlagValid) {
|
|
return 1;
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
mFlagCloth.setSpringRate(attr().mSpringCoeeficient);
|
|
mFlagCloth.setWindRate(attr().mWindCoefficient);
|
|
mFlagCloth.setDecayRate(attr().mDecayRate);
|
|
mFlagCloth.setGravity(attr().mGravity);
|
|
mFlagCloth.setTornado(attr().mTornado);
|
|
#endif
|
|
|
|
cXyz direction;
|
|
f32 power;
|
|
dKyw_get_AllWind_vec(&mFlagPosition, &direction, &power);
|
|
if (power > 0.0f) {
|
|
Z2GetAudioMgr()->seStartLevel(Z2SE_OBJ_FLAG_TRAILING, &mFlagPosition, power * 127.0f, 0,
|
|
1.0f, 1.0f, -1.0f, -1.0f, 0);
|
|
}
|
|
mFlagCloth.execute();
|
|
eyePos = mFlagCloth.getTargetPos();
|
|
setCollision();
|
|
return 1;
|
|
}
|
|
|
|
/* 80BEDDC0-80BEDEB0 0017E0 00F0+00 1/0 0/0 0/0 .text daObjFlag2_Execute__FP12daObjFlag2_c */
|
|
static int daObjFlag2_Execute(daObjFlag2_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 80BEDEB0-80BEDEB8 0018D0 0008+00 1/0 0/0 0/0 .text daObjFlag2_IsDelete__FP12daObjFlag2_c */
|
|
static int daObjFlag2_IsDelete(daObjFlag2_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 80BEDEB8-80BEDEE0 0018D8 0028+00 1/0 0/0 0/0 .text daObjFlag2_Delete__FP12daObjFlag2_c
|
|
*/
|
|
static int daObjFlag2_Delete(daObjFlag2_c* i_this) {
|
|
fopAcM_GetID(i_this);
|
|
i_this->~daObjFlag2_c();
|
|
return 1;
|
|
}
|
|
|
|
/* 80BEDEE0-80BEE050 001900 0170+00 1/1 0/0 0/0 .text __dt__12daObjFlag2_cFv */
|
|
daObjFlag2_c::~daObjFlag2_c() {
|
|
#ifdef DEBUG
|
|
M_hio.dt();
|
|
#endif
|
|
|
|
if (mFlagValid) {
|
|
dComIfG_resDelete(&mFlagPhase, mFlagName);
|
|
}
|
|
dComIfG_resDelete(&mArcPhase, daSetBgObj_c::getArcName(this));
|
|
}
|
|
|
|
/* 80BEE050-80BEE070 001A70 0020+00 1/0 0/0 0/0 .text daObjFlag2_Create__FP10fopAc_ac_c
|
|
*/
|
|
static int daObjFlag2_Create(fopAc_ac_c* i_this) {
|
|
return static_cast<daObjFlag2_c*>(i_this)->create();
|
|
}
|
|
|
|
/* 80BEE95C-80BEE97C -00001 0020+00 1/0 0/0 0/0 .data l_daObjFlag2_Method */
|
|
static actor_method_class l_daObjFlag2_Method = {
|
|
(process_method_func)daObjFlag2_Create,
|
|
(process_method_func)daObjFlag2_Delete,
|
|
(process_method_func)daObjFlag2_Execute,
|
|
(process_method_func)daObjFlag2_IsDelete,
|
|
(process_method_func)daObjFlag2_Draw,
|
|
};
|
|
|
|
/* 80BEE97C-80BEE9AC -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_Flag2 */
|
|
extern actor_process_profile_definition g_profile_Obj_Flag2 = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_Flag2, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjFlag2_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
27, // mPriority
|
|
&l_daObjFlag2_Method, // sub_method
|
|
0x00044180, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|
|
|
|
/* 80BEE1E8-80BEE1E8 00010C 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
|