d_a_obj_vyasi (#1233)

* structure

* _create()

* stopJointAnimation

* so many BOOL

* set_collision

* sagWind

* more process

* process fns

* JointNodeCallBack

* create_heap()

* leaf_scale_main()

* execute, draw

* calc_dif_angle, quaternion_main

* renames + enum

* configure.py

* fix const cast
This commit is contained in:
Teddy Heidmann
2026-10-07 10:56:57 -07:00
committed by GitHub
parent bdde14570c
commit c56434c150
3 changed files with 468 additions and 77 deletions
+1 -1
View File
@@ -1806,7 +1806,7 @@ config.libs = [
ActorRel(Matching, "d_a_obj_vmsms"),
ActorRel(Matching, "d_a_obj_volcano"),
ActorRel(NonMatching, "d_a_obj_vtil"),
ActorRel(NonMatching, "d_a_obj_vyasi"),
ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_vyasi"),
ActorRel(Matching, "d_a_obj_xfuta"),
ActorRel(Matching, "d_a_obj_zouK"),
ActorRel(Matching, "d_a_oship"),
+47 -37
View File
@@ -2,6 +2,7 @@
#define D_A_OBJ_VYASI_H
#include "f_op/f_op_actor.h"
#include "d/d_a_obj.h"
#include "d/d_cc_d.h"
#include "SSystem/SComponent/c_phase.h"
@@ -11,29 +12,34 @@ class J3DNode;
namespace daObjVyasi {
static BOOL JointNodeCallBack(J3DNode*, int);
class Act_c : public fopAc_ac_c {
public:
void is_switch() const {}
void SetStopJointAnimation(J3DAnmTransformKey*, float, float);
void PlayStopJointAnimation();
virtual ~Act_c() {
}
BOOL is_switch() const {
return fopAcM_isSwitch(const_cast<Act_c*>(this), daObj::PrmAbstract(this, 8, 0));
}
BOOL SetStopJointAnimation(J3DAnmTransformKey*, float, float);
BOOL PlayStopJointAnimation();
void set_first_process();
void set_collision();
void process_none_init();
BOOL process_none_init();
void process_none_main();
void process_sag_init();
BOOL process_sag_init();
void process_sag_main();
void process_sagWind_init();
BOOL process_sagWind_init();
void process_sagWind_main();
void process_toNormal_init();
BOOL process_toNormal_init();
void process_toNormal_main();
void process_normal_init();
BOOL process_normal_init();
void process_normal_main();
void process_init(int);
BOOL process_init(int);
void process_main();
void solidHeapCB(fopAc_ac_c*);
void create_heap();
static BOOL solidHeapCB(fopAc_ac_c*);
bool create_heap();
cPhs_State _create();
bool _delete();
void set_mtx();
@@ -42,39 +48,43 @@ namespace daObjVyasi {
void leaf_scale_main();
bool _execute();
bool _draw();
static char const M_arcname[];
public:
/* 0x0290 */ u8 m0290[0x0294 - 0x0290];
/* 0x0294 */ s16 m0294[14];
/* 0x02B0 */ s16 m02B0[14];
/* 0x0294 */ s16 mAnimWave[14];
/* 0x02B0 */ s16 mAnimDir[14];
/* 0x02CC */ Quaternion mJointQuat[14];
/* 0x03AC */ csXyz m03AC[14];
/* 0x0400 */ cXyz m0400[14];
/* 0x04A8 */ f32 m04A8;
/* 0x04AC */ f32 m04AC;
/* 0x04B0 */ f32 m04B0;
/* 0x03AC */ csXyz mJointAngle[14];
/* 0x0400 */ cXyz mJointPos[14];
/* 0x04A8 */ cXyz mLeafScale;
/* 0x04B4 */ request_of_phase_process_class mPhs;
/* 0x04BC */ Mtx m04BC;
/* 0x04BC */ Mtx mMtx;
/* 0x04EC */ mDoExt_McaMorf* mpMorf;
/* 0x04F0 */ J3DAnmTransformKey* mpBckData;
/* 0x04F0 */ J3DAnmTransformKey* M_bck_data;
/* 0x04F4 */ cXyz mEkszsPos;
/* 0x0500 */ s16 mEkszsRotY;
/* 0x0502 */ u8 m0502[0x0504 - 0x0502];
/* 0x0504 */ f32 m0504;
/* 0x0508 */ u8 m0508[0x0524 - 0x0508];
/* 0x0524 */ s16 m0524[15];
/* 0x0542 */ u8 m0542[0x0544 - 0x0542];
/* 0x0502 */ u8 pad_0x502[0x0504 - 0x0502];
/* 0x0504 */ f32 mSagRatio;
/* 0x0508 */ s16 mWavePhase[14];
/* 0x0524 */ s16 mWaveSpeed[14];
/* 0x0540 */ u8 pad_0x540[0x0544 - 0x0540];
/* 0x0544 */ s16 mNormalCounter;
/* 0x0546 */ u8 m0546[0x0584 - 0x0546];
/* 0x0546 */ u8 pad_0x546[0x0548 - 0x0546];
/* 0x0548 */ dCcD_Stts mStts;
/* 0x0584 */ dCcD_Cyl mCyl;
/* 0x06B4 */ u8 m06B4[0x19C4 - 0x06B4];
/* 0x19C4 */ int m19C4;
/* 0x06B4 */ dCcD_Stts mCpsStts[5];
/* 0x07E0 */ dCcD_Cps mCps[5];
/* 0x0DF8 */ cM3dGCpsS field_0xDF8[5];
/* 0x0E84 */ dCcD_Stts field_0xE84[8];
/* 0x1064 */ dCcD_Sph field_0x1064[8];
/* 0x19C4 */ int mAnmPlaying;
/* 0x19C8 */ int mState;
/* 0x19CC */ f32 m19CC;
/* 0x19D0 */ s16 m19D0;
/* 0x19D2 */ u8 m19D2[0x19D4 - 0x19D2];
/* 0x19D4 */ f32 m19D4;
};
/* 0x19CC */ f32 field_0x19CC;
/* 0x19D0 */ s16 field_0x19D0;
/* 0x19D2 */ u8 pad_0x19D2[0x19D4 - 0x19D2];
/* 0x19D4 */ f32 mWindScale;
}; // Size: 0x19D8
};
#endif /* D_A_OBJ_VYASI_H */
+420 -39
View File
@@ -5,10 +5,51 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_vyasi.h"
#include "d/d_a_obj.h"
#include "d/d_cc_d.h"
#include "d/d_kankyo_wether.h"
#include "d/d_lib.h"
#include "res/Object/Vyasi.h"
#include "SSystem/SComponent/c_lib.h"
namespace daObjVyasi {
namespace {
struct Attr_c {
/* 0x00 */ f32 field_0x00;
/* 0x04 */ f32 field_0x04;
/* 0x08 */ f32 field_0x08;
/* 0x0C */ f32 field_0x0C;
/* 0x10 */ f32 field_0x10;
/* 0x14 */ f32 field_0x14;
/* 0x18 */ f32 field_0x18;
/* 0x1C */ f32 field_0x1C;
/* 0x20 */ s16 field_0x20;
/* 0x22 */ s16 field_0x22;
/* 0x24 */ f32 field_0x24;
/* 0x28 */ f32 field_0x28;
/* 0x2C */ f32 field_0x2C;
/* 0x30 */ u8 pad[0x84 - 0x30];
}; // Size: 0x84
static Attr_c const L_attr = {
1.0f, 79.0f, 250.0f, 0.0f, 0.0f, 0.0f, 0.4f, 1.5f, 2, 0, 700.0f, 1700.0f, 1700.0f, {},
};
inline Attr_c const& attr() {
return L_attr;
}
} // namespace
enum {
STATE_NONE = 0,
STATE_SAG,
STATE_SAG_WIND,
STATE_TO_NORMAL,
STATE_NORMAL,
STATE_MAX,
};
static const dCcD_SrcCyl M_cyl_src = {
// dCcD_SrcGObjInf
{
@@ -100,142 +141,482 @@ static const dCcD_SrcSph M_sph_src = {
}},
};
static u8 joint_kind_table[14] = { 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 };
}; // namespace daObjVyasi
/* 000000EC-0000015C .text SetStopJointAnimation__Q210daObjVyasi5Act_cFP18J3DAnmTransformKeyff */
void daObjVyasi::Act_c::SetStopJointAnimation(J3DAnmTransformKey*, float, float) {
/* Nonmatching */
BOOL daObjVyasi::Act_c::SetStopJointAnimation(J3DAnmTransformKey* i_key, float i_speed, float i_morf) {
if (i_key != NULL) {
mpMorf->setAnm(i_key, 0, i_morf, i_speed, 0.0f, -1.0f, NULL);
mAnmPlaying = 1;
return TRUE;
}
return FALSE;
}
/* 0000015C-00000194 .text PlayStopJointAnimation__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::PlayStopJointAnimation() {
/* Nonmatching */
BOOL daObjVyasi::Act_c::PlayStopJointAnimation() {
if (mpMorf->play(NULL, 0, 0) == 0) {
return TRUE;
}
return FALSE;
}
/* 00000194-0000021C .text set_first_process__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::set_first_process() {
/* Nonmatching */
process_init(is_switch() ? STATE_NORMAL : STATE_SAG);
mNormalCounter = 0;
mWindScale = 1.0f;
shape_angle.y += 0x8000;
}
/* 0000021C-000005B8 .text set_collision__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::set_collision() {
/* Nonmatching */
if (mCyl.ChkTgHit()) {
mCyl.GetTgHitObj();
daObj::HitSeStart(&current.pos, fopAcM_GetRoomNo(this), &mCyl, 7);
daObj::HitEff_kikuzu(this, &mCyl);
dKy_Sound_set(current.pos, 4, fopAcM_GetID(this), 100);
mCyl.ClrTgHit();
} else {
mCyl.SetR(79.0f);
mCyl.SetH(250.0f);
mCyl.SetC(current.pos);
dComIfG_Ccsp()->Set(&mCyl);
}
for (int i = 0; i < 5; i++) {
if (mCps[i].ChkTgHit()) {
mCps[i].GetTgHitObj();
daObj::HitSeStart(&current.pos, fopAcM_GetRoomNo(this), &mCps[i], 7);
dKy_Sound_set(current.pos, 4, fopAcM_GetID(this), 100);
mCps[i].ClrTgHit();
} else {
int k = i + 1;
field_0xDF8[i].mStart = mJointPos[i];
field_0xDF8[i].mEnd = mJointPos[k];
field_0xDF8[i].mRadius = 47.4f;
mCps[i].cM3dGCps::Set(field_0xDF8[i]);
dComIfG_Ccsp()->Set(&mCps[i]);
}
}
for (int i = 0; i < 8; i += 2) {
int idx = i >> 1;
int j = idx + 1;
int k = idx + 2;
cXyz delta((mJointPos[k].x - mJointPos[j].x) * 0.33333f, (mJointPos[k].y - mJointPos[j].y) * 0.33333f, (mJointPos[k].z - mJointPos[j].z) * 0.33333f);
cXyz pos;
pos.x = mJointPos[j].x + delta.x;
pos.y = mJointPos[j].y + delta.y;
pos.z = mJointPos[j].z + delta.z;
field_0x1064[i].SetC(pos);
field_0x1064[i].SetR(47.4f);
dComIfG_Ccsp()->Set(&field_0x1064[i]);
pos.x = mJointPos[j].x + delta.x * 2.0f;
pos.y = mJointPos[j].y + delta.y * 2.0f;
pos.z = mJointPos[j].z + delta.z * 2.0f;
field_0x1064[i + 1].SetC(pos);
field_0x1064[i + 1].SetR(47.4f);
dComIfG_Ccsp()->Set(&field_0x1064[i + 1]);
}
}
/* 000005F4-000009B8 .text JointNodeCallBack__10daObjVyasiFP7J3DNodei */
BOOL daObjVyasi::JointNodeCallBack(J3DNode*, int) {
/* Nonmatching */
BOOL daObjVyasi::JointNodeCallBack(J3DNode* i_node, int i_calcTiming) {
J3DModel* model = j3dSys.getModel();
s32 jntNo = ((J3DJoint*)i_node)->getJntNo();
Act_c* i_this = (Act_c*)model->getUserArea();
if (i_calcTiming == J3DNodeCBCalcTiming_In) {
mDoMtx_stack_c::copy(model->getAnmMtx(jntNo));
Mtx mtx;
MTXCopy(model->getAnmMtx(jntNo), mtx);
cXyz trans(mtx[0][3], mtx[1][3], mtx[2][3]);
mtx[0][3] = mtx[1][3] = mtx[2][3] = 0.0f;
mDoMtx_stack_c::transS(trans);
mDoMtx_stack_c::quatM(&i_this->mJointQuat[jntNo]);
mDoMtx_stack_c::concat(mtx);
model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
csXyz angles_table[14] = {
csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0),
csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0),
};
csXyz angle = angles_table[jntNo];
angle += i_this->mJointAngle[jntNo];
mDoMtx_stack_c::copy(model->getAnmMtx(jntNo));
mDoMtx_stack_c::ZXYrotM(angle);
if (joint_kind_table[jntNo] == 0) {
mDoMtx_stack_c::scaleM(i_this->mLeafScale.x, i_this->mLeafScale.y, i_this->mLeafScale.z);
}
model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
cXyz src(0.0f, 0.0f, 0.0f);
cMtx_multVec(mDoMtx_stack_c::get(), &src, &i_this->mJointPos[jntNo]);
}
return TRUE;
}
/* 000009F4-000009FC .text process_none_init__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_none_init() {
/* Nonmatching */
BOOL daObjVyasi::Act_c::process_none_init() {
return TRUE;
}
/* 000009FC-00000A00 .text process_none_main__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_none_main() {
/* Nonmatching */
return;
}
/* 00000A00-00000A64 .text process_sag_init__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_sag_init() {
/* Nonmatching */
BOOL daObjVyasi::Act_c::process_sag_init() {
if (SetStopJointAnimation(M_bck_data, 1.0f, 0.0f) != 0) {
mpMorf->setPlaySpeed(0.0f);
return TRUE;
}
return FALSE;
}
/* 00000A64-00000AD8 .text process_sag_main__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_sag_main() {
/* Nonmatching */
fopAc_ac_c* actor = fopAcM_SearchByName(fpcNm_Obj_Ekskz_e);
if (actor != NULL) {
mEkszsPos = actor->current.pos;
mEkszsRotY = actor->shape_angle.y;
process_init(STATE_SAG_WIND);
}
}
/* 00000AD8-00000CC0 .text process_sagWind_init__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_sagWind_init() {
/* Nonmatching */
BOOL daObjVyasi::Act_c::process_sagWind_init() {
if (SetStopJointAnimation(M_bck_data, 1.0f, 3.0f)) {
f32 dist = mEkszsPos.abs(current.pos);
dist = cLib_maxLimit(dist, 2800.0f);
dist = cLib_minLimit(dist, 1000.0f);
mSagRatio = (dist - 2800.0f) / -1800.0f;
f32 amp = 5000.0f + 7000.0f * mSagRatio;
for (int i = 0; i < 14; i++) {
if (joint_kind_table[i] == 0) {
if (!(i & 1)) {
mWaveSpeed[i] = amp + cM_rndF(2000.0f);
} else {
mWaveSpeed[i] = -(amp + cM_rndF(2000.0f));
}
} else {
mWaveSpeed[i] = 0.5f * amp;
}
}
mpMorf->setPlaySpeed(0.0f);
return TRUE;
}
return FALSE;
}
/* 00000CC0-00000D20 .text process_sagWind_main__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_sagWind_main() {
/* Nonmatching */
if (is_switch()) {
process_init(STATE_TO_NORMAL);
}
}
/* 00000D20-00000D54 .text process_toNormal_init__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_toNormal_init() {
/* Nonmatching */
BOOL daObjVyasi::Act_c::process_toNormal_init() {
return SetStopJointAnimation(M_bck_data, 1.0f, 0.0f);
}
/* 00000D54-00000E10 .text process_toNormal_main__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_toNormal_main() {
/* Nonmatching */
if (mAnmPlaying == 0) {
if (std::fabsf(field_0x19CC) <= 0.1f && process_init(STATE_NORMAL)) {
field_0x19CC = 0.0f;
mWindScale = 0.0f;
mNormalCounter = 2;
}
field_0x19CC *= 0.85f;
field_0x19D0 += 0x3000;
} else {
field_0x19CC = -1792.0f * mSagRatio;
field_0x19D0 = 0;
}
}
/* 00000E10-00000E74 .text process_normal_init__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_normal_init() {
/* Nonmatching */
BOOL daObjVyasi::Act_c::process_normal_init() {
if (SetStopJointAnimation(M_bck_data, -1.0f, 0.0f)) {
mpMorf->setPlaySpeed(0.0f);
return TRUE;
}
return FALSE;
}
/* 00000E74-00000ED0 .text process_normal_main__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_normal_main() {
/* Nonmatching */
if (mNormalCounter == 0 || mNormalCounter == 1) {
mNormalCounter++;
}
cLib_addCalc(&mWindScale, 1.0f, 0.01f, 1.0f, 0.007f);
}
char const daObjVyasi::Act_c::M_arcname[] = "Vyasi";
/* 00000ED0-00000FE4 .text process_init__Q210daObjVyasi5Act_cFi */
void daObjVyasi::Act_c::process_init(int) {
/* Nonmatching */
BOOL daObjVyasi::Act_c::process_init(int i_idx) {
typedef BOOL (daObjVyasi::Act_c::*initProc)();
static initProc init_table[] = {
&daObjVyasi::Act_c::process_none_init, &daObjVyasi::Act_c::process_sag_init, &daObjVyasi::Act_c::process_sagWind_init,
&daObjVyasi::Act_c::process_toNormal_init, &daObjVyasi::Act_c::process_normal_init,
};
if (i_idx >= 0 && i_idx < STATE_MAX && (this->*init_table[i_idx])()) {
mState = i_idx;
return TRUE;
}
return FALSE;
}
/* 00000FE4-000010C8 .text process_main__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::process_main() {
/* Nonmatching */
typedef void (daObjVyasi::Act_c::*mainProc)();
static mainProc main_table[] = {
&daObjVyasi::Act_c::process_none_main, &daObjVyasi::Act_c::process_sag_main, &daObjVyasi::Act_c::process_sagWind_main,
&daObjVyasi::Act_c::process_toNormal_main, &daObjVyasi::Act_c::process_normal_main,
};
if (mState >= 0 && mState < STATE_MAX) {
(this->*main_table[mState])();
}
}
/* 000010C8-000010EC .text solidHeapCB__Q210daObjVyasi5Act_cFP10fopAc_ac_c */
void daObjVyasi::Act_c::solidHeapCB(fopAc_ac_c*) {
/* Nonmatching */
BOOL daObjVyasi::Act_c::solidHeapCB(fopAc_ac_c* i_this) {
return ((daObjVyasi::Act_c*)i_this)->create_heap();
}
/* 000010EC-00001290 .text create_heap__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::create_heap() {
/* Nonmatching */
bool daObjVyasi::Act_c::create_heap() {
J3DModelData* mdl_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, dRes_INDEX_VYASI_BDL_VYASI_e);
JUT_ASSERT(1146, mdl_data != NULL);
M_bck_data = (J3DAnmTransformKey*)dComIfG_getObjectRes(M_arcname, dRes_INDEX_VYASI_BCK_VYASI_e);
JUT_ASSERT(1151, M_bck_data != NULL);
if (M_bck_data != NULL && mdl_data != NULL) {
mpMorf = new mDoExt_McaMorf(mdl_data, NULL, NULL, M_bck_data, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, 1, NULL, 0, 0x11000002);
}
return M_bck_data != NULL && mpMorf != NULL && mpMorf->getModel() != NULL;
}
/* 00001290-000016E0 .text _create__Q210daObjVyasi5Act_cFv */
cPhs_State daObjVyasi::Act_c::_create() {
/* Nonmatching */
fopAcM_ct(this, daObjVyasi::Act_c);
cPhs_State res = dComIfG_resLoad(&mPhs, M_arcname);
if (res == cPhs_COMPLEATE_e) {
if (fopAcM_entrySolidHeap(this, solidHeapCB, 0)) {
set_first_process();
set_mtx();
fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx());
fopAcM_setCullSizeBox(this, -2000.0f, 0.0f, -2000.0f, 2000.0f, 2000.0f, 2000.0f);
fopAcM_setCullSizeFar(this, 2.0f);
mStts.Init(0xFF, 0xFF, this);
mCyl.Set(M_cyl_src);
mCyl.SetStts(&mStts);
mCyl.SetTgVec((cXyz&)cXyz::Zero);
mCyl.OnTgNoHitMark();
for (int i = 0; i < 5; i++) {
mCpsStts[i].Init(100, 0xFF, this);
mCps[i].Set(M_cps_src);
mCps[i].SetStts(&mCpsStts[i]);
field_0xDF8[i].mStart = current.pos;
field_0xDF8[i].mEnd = current.pos;
field_0xDF8[i].mRadius = 100.0f;
}
for (int i = 0; i < 8; i++) {
field_0xE84[i].Init(100, 0xFF, this);
field_0x1064[i].Set(M_sph_src);
field_0x1064[i].SetStts(&field_0xE84[i]);
mCyl.SetTgVec((cXyz&)cXyz::Zero);
mCyl.OnTgNoHitMark();
}
J3DModel* model = mpMorf->getModel();
J3DModelData* modelData = model->getModelData();
model->setUserArea((uintptr_t)this);
for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) {
modelData->getJointNodePointer(i)->setCallBack(JointNodeCallBack);
}
for (u16 i = 0; i < 14; i++) {
mJointQuat[i] = ZeroQuat;
}
mLeafScale.set(1.0f, 1.0f, 1.0f);
} else {
res = cPhs_ERROR_e;
}
}
return res;
}
/* 00001D8C-00001DBC .text _delete__Q210daObjVyasi5Act_cFv */
bool daObjVyasi::Act_c::_delete() {
/* Nonmatching */
dComIfG_resDeleteDemo(&mPhs, M_arcname);
return true;
}
/* 00001DBC-00001E5C .text set_mtx__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::set_mtx() {
/* Nonmatching */
mpMorf->getModel()->setBaseScale(scale);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
MTXCopy(mDoMtx_stack_c::get(), mMtx);
}
/* 00001E5C-000025A8 .text calc_dif_angle__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::calc_dif_angle() {
/* Nonmatching */
for (int i = 0; i < 14; i++) {
csXyz target(0, 0, 0);
s16 step = 2;
if (mState == STATE_SAG_WIND) {
if (joint_kind_table[i] == 2) {
f32 ratio = mSagRatio * cM_ssin(mWavePhase[i]);
target.set(20.0f * ratio, 40.0f * ratio, 40.0f * ratio);
} else if (joint_kind_table[i] == 1) {
f32 ratio = mSagRatio * cM_ssin(mWavePhase[i]);
target.set(120.0f * ratio, 180.0f * ratio, 220.0f * ratio);
if (i == 1) {
target.z += (s16)(-3200.0f + 3200.0f * mSagRatio);
}
} else if (joint_kind_table[i] == 0) {
static csXyz sag_offset_angle[14] = {
csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0),
csXyz(0, 0, 0), csXyz(0, 0, 5000), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, -5000), csXyz(0, 0, -7000), csXyz(0, 0, -2700),
};
f32 ratio = mSagRatio * cM_ssin(mWavePhase[i]);
target.set(700.0f * ratio, 1700.0f * ratio, 1700.0f * ratio);
target.x += sag_offset_angle[i].x;
target.y += sag_offset_angle[i].y;
target.z += sag_offset_angle[i].z;
step = 1;
}
} else if (mState == STATE_TO_NORMAL) {
if (mAnmPlaying == 0 && (i == 0 || i == 1 || i == 6)) {
target.z = field_0x19CC * cM_ssin(field_0x19D0);
}
}
cLib_addCalcAngleS2(&mJointAngle[i].x, target.x, step, 0x4000);
cLib_addCalcAngleS2(&mJointAngle[i].y, target.y, step, 0x4000);
cLib_addCalcAngleS2(&mJointAngle[i].z, target.z, step, 0x4000);
if (joint_kind_table[i] == 0) {
mWavePhase[i] += (s16)(1.5f * mWaveSpeed[i]);
} else {
mWavePhase[i] += mWaveSpeed[i];
}
}
}
/* 000025A8-00002880 .text quaternion_main__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::quaternion_main() {
/* Nonmatching */
for (int i = 0; i < 14; i++) {
Quaternion quat;
quat = ZeroQuat;
if (mState == STATE_NORMAL && joint_kind_table[i] == 0) {
cXyz up(0.0f, 1.0f, 0.0f);
cMtx_YrotS(*calc_mtx, -current.angle.y);
cXyz windDir;
MtxPosition(dKyw_get_wind_vec(), &windDir);
f32 windPow = dKyw_get_wind_pow();
cXyz dir = up.outprod(windDir);
s16 angle = 1400.0f * windPow * mWindScale;
f32 sin = cM_ssin(angle);
Quaternion windQuat;
windQuat.x = sin * dir.x;
windQuat.y = sin * dir.y;
windQuat.z = sin * dir.z;
windQuat.w = cM_scos(angle);
s16 target = 360.0f * windPow * mWindScale;
target = target > 0xDC ? 0xDC : target;
cLib_addCalcAngleS2(&mAnimDir[i], target, 4, 0x20);
s32 add = (2048.0f * windPow * mWindScale) + cM_rndFX(256.0f);
mAnimWave[i] += add;
f32 w = cM_ssin(mAnimDir[i]);
Quaternion animQuat;
animQuat.x = w * cM_ssin(mAnimWave[i]);
animQuat.y = 0.0f;
animQuat.z = w * cM_ssin(mAnimWave[i]);
animQuat.w = cM_scos(mAnimDir[i]);
mDoMtx_quatMultiply(&windQuat, &animQuat, &quat);
}
if (mNormalCounter == 1) {
mJointQuat[i] = quat;
} else {
mDoMtx_quatSlerp(&mJointQuat[i], &quat, &mJointQuat[i], 0.4f);
}
}
}
/* 00002880-00002938 .text leaf_scale_main__Q210daObjVyasi5Act_cFv */
void daObjVyasi::Act_c::leaf_scale_main() {
/* Nonmatching */
cXyz scale(1.0f, 1.0f, 1.0f);
if (mState == STATE_SAG_WIND) {
scale.x = 0.35000002f * mSagRatio + 1.0f;
scale.y = -0.5f * mSagRatio + 1.0f;
scale.z = scale.y;
}
cLib_addCalc2(&mLeafScale.x, scale.x, 0.5f, 0.5f);
cLib_addCalc2(&mLeafScale.y, scale.y, 0.5f, 0.5f);
cLib_addCalc2(&mLeafScale.z, scale.z, 0.5f, 0.5f);
}
/* 00002938-000029BC .text _execute__Q210daObjVyasi5Act_cFv */
bool daObjVyasi::Act_c::_execute() {
/* Nonmatching */
if (mState != STATE_NONE) {
mAnmPlaying = PlayStopJointAnimation();
process_main();
set_collision();
quaternion_main();
calc_dif_angle();
leaf_scale_main();
set_mtx();
fopAcM_rollPlayerCrash(this, 79.0f, 7);
}
return true;
}
/* 000029BC-00002A6C .text _draw__Q210daObjVyasi5Act_cFv */
bool daObjVyasi::Act_c::_draw() {
/* Nonmatching */
if (mState != STATE_NONE) {
g_env_light.settingTevStruct(TEV_TYPE_BG0, &current.pos, &tevStr);
g_env_light.setLightTevColorType(mpMorf->getModel(), &tevStr);
dComIfGd_setListBG();
mpMorf->updateDL();
dComIfGd_setList();
}
return true;
}
namespace daObjVyasi {