mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-28 08:24:59 -04:00
564 lines
18 KiB
C++
564 lines
18 KiB
C++
//
|
|
// Generated by dtk
|
|
// Translation Unit: d_grass.cpp
|
|
//
|
|
|
|
#include "d/d_grass.h"
|
|
#include "f_op/f_op_overlap_mng.h"
|
|
#include "d/d_bg_s_gnd_chk.h"
|
|
#include "d/d_cc_d.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_kankyo.h"
|
|
#include "d/d_kankyo_wether.h"
|
|
#include "d/d_procname.h"
|
|
#include "m_Do/m_Do_mtx.h"
|
|
#include "m_Do/m_Do_lib.h"
|
|
#include "m_Do/m_Do_graphic.h"
|
|
#include "SSystem/SComponent/c_counter.h"
|
|
#include "dolphin/gf/GFGeometry.h"
|
|
#include "dolphin/gf/GFTev.h"
|
|
|
|
#include "weak_data_1811.h" // IWYU pragma: keep
|
|
|
|
#include "assets/l_K_kusa_00TEX.h"
|
|
const u32 l_K_kusa_00TEX__width = 64;
|
|
const u32 l_K_kusa_00TEX__height = 128;
|
|
|
|
Vec l_Vmori_pos[] = {
|
|
{0.0f, -0.0f, 0.0f},
|
|
{-20.232309f, 2.398434f, -12.457211f},
|
|
{-22.421972f, 96.708992f, -32.329994f},
|
|
{-0.689661f, 28.224686f, -17.54632f},
|
|
{18.556299f, 68.562164f, -34.307945f},
|
|
{18.543142f, 2.398434f, -11.276213f},
|
|
{-0.200689f, 2.398434f, 21.652548f},
|
|
{-25.964092f, 96.708992f, 30.826571f},
|
|
{-14.926651f, 28.224686f, 6.578368f},
|
|
{-35.45715f, 68.562164f, -0.097443f},
|
|
{36.34602f, 96.708992f, 0.33899f},
|
|
{13.406961f, 28.224686f, 6.463065f},
|
|
{22.201593f, 68.562164f, 30.207361f},
|
|
{-17.307545f, 92.651337f, -11.431835f},
|
|
{-0.689661f, 28.224686f, -17.546318f},
|
|
{16.828806f, 92.651367f, -10.67745f},
|
|
{-0.098656f, 85.026367f, 19.19121f},
|
|
{-14.926647f, 28.224686f, 6.578368f},
|
|
{-0.479885f, 11.192533f, -13.94727f},
|
|
{11.278254f, 12.157036f, 6.079208f},
|
|
{-12.355106f, 13.254459f, 6.175385f},
|
|
{-15.73156f, 5.409967f, -8.529058f},
|
|
{13.355361f, 5.409967f, -8.554744f},
|
|
{-0.305629f, 4.337076f, 16.596081f},
|
|
{-0.479884f, 11.192533f, -13.94727f},
|
|
{-12.355103f, 13.254459f, 6.175385f},
|
|
{11.278254f, 12.157036f, 6.079209f},
|
|
};
|
|
|
|
GXColor l_Vmori_color[] = {
|
|
{0xFF, 0xFF, 0xFF, 0xFF},
|
|
{0x41, 0x41, 0x41, 0xFF},
|
|
{0xDD, 0xCF, 0x71, 0xFF},
|
|
{0, 0x2E, 0x1, 0xFF},
|
|
{0xAE, 0xA4, 0x57, 0xFF},
|
|
};
|
|
|
|
cXy l_Vmori_texCoord[] = {
|
|
{0.006063f, 0.998037f},
|
|
{0.659757f, 0.0f},
|
|
{0.974817f, 1.0f},
|
|
{-0.00456f, 1.0f},
|
|
{0.980413f, 1.0f},
|
|
{0.980413f, 1.002798f},
|
|
{0.933797f, 0.82872f},
|
|
{0.938976f, 0.84993f},
|
|
{0.940903f, 0.138216f},
|
|
};
|
|
|
|
#include "assets/l_Vmori_00DL.h"
|
|
#include "assets/l_Vmori_01DL.h"
|
|
#include "assets/l_Vmori_matDL.h"
|
|
l_Vmori_matDL(l_K_kusa_00TEX);
|
|
|
|
#include "assets/l_Txa_ob_kusa_aTEX.h"
|
|
const u32 l_Txa_ob_kusa_aTEX__width = 64;
|
|
const u32 l_Txa_ob_kusa_aTEX__height = 64;
|
|
|
|
Vec l_pos[] = {
|
|
{0.0f, -0.0f, 0.0f},
|
|
{-20.232309f, 7.048814f, -12.457211f},
|
|
{-22.421972f, 96.708992f, -32.329994f},
|
|
{-0.689661f, 28.224686f, -17.54632f},
|
|
{18.556299f, 68.562164f, -34.307945f},
|
|
{18.543142f, 7.048814f, -11.276213f},
|
|
{-0.200689f, 4.806987f, 21.652548f},
|
|
{-25.964092f, 96.708992f, 30.826571f},
|
|
{-14.926651f, 28.224686f, 6.578368f},
|
|
{-35.45715f, 68.562164f, -0.097443f},
|
|
{36.34602f, 96.708992f, 0.33899f},
|
|
{13.406961f, 28.224686f, 6.463065f},
|
|
{22.201593f, 68.562164f, 30.207361f},
|
|
{-17.307545f, 92.651337f, -11.431835f},
|
|
{-0.689661f, 28.224686f, -17.546318f},
|
|
{16.828806f, 92.651367f, -10.67745f},
|
|
{-0.098656f, 85.026367f, 19.19121f},
|
|
{-14.926647f, 28.224686f, 6.578368f},
|
|
{-0.479885f, 11.192533f, -13.94727f},
|
|
{11.278254f, 12.157036f, 6.079208f},
|
|
{-12.355106f, 13.254459f, 6.175385f},
|
|
{-15.73156f, 5.409967f, -8.529058f},
|
|
{13.355361f, 5.409967f, -8.554744f},
|
|
{-0.305629f, 4.337076f, 16.596081f},
|
|
{-0.479884f, 11.192533f, -13.94727f},
|
|
{-12.355103f, 13.254459f, 6.175385f},
|
|
{11.278254f, 12.157036f, 6.079209f},
|
|
};
|
|
|
|
GXColor l_color[] = {
|
|
{0x87, 0x87, 0x87, 0xFF},
|
|
{0xFF, 0xFF, 0xFF, 0xFF},
|
|
{0x6E, 0x6E, 0x6E, 0xFF},
|
|
{0x69, 0x69, 0x69, 0xFF},
|
|
{0x7B, 0x7B, 0x7B, 0xFF},
|
|
{0x76, 0x76, 0x76, 0xFF},
|
|
{0xB1, 0xB1, 0xB1, 0xFF},
|
|
{0xCC, 0xCC, 0xCC, 0xFF},
|
|
};
|
|
|
|
cXy l_texCoord[] = {
|
|
{0.375f, 0.625f},
|
|
{1.0f, 0.0f},
|
|
{1.0f, 1.0f},
|
|
{2.0f, 1.0f},
|
|
{0.0f, 1.0f},
|
|
{1.625f, 0.625f},
|
|
{0.0f, 0.5f},
|
|
{0.5f, 0.0f},
|
|
{0.0f, 0.0f},
|
|
};
|
|
|
|
#include "assets/l_Oba_kusa_aDL.h"
|
|
#include "assets/l_Oba_kusa_a_cutDL.h"
|
|
#include "assets/l_matDL__d_grass.h"
|
|
l_matDL__d_grass(l_Txa_ob_kusa_aTEX);
|
|
|
|
static bool l_CutSoundFlag;
|
|
|
|
/* 80077048-8007712C .text setBatta__FP4cXyzP8_GXColor */
|
|
void setBatta(cXyz* pos, GXColor* color) {
|
|
if (!dKy_rain_check() && !dComIfGp_event_runCheck() && strncmp(dComIfGp_getStartStageName(), "kin", 3) != 0 && strcmp(dComIfGp_getStartStageName(), "Xboss1") != 0 && cM_rnd() > 0.99f)
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_0453, pos, NULL, NULL, 0xFF, NULL, -1, color, color);
|
|
}
|
|
|
|
/* 8007712C-8007734C .text WorkCo__13dGrass_data_cFP10fopAc_ac_cUli */
|
|
void dGrass_data_c::WorkCo(fopAc_ac_c* other, u32, int roomNo) {
|
|
cXyz delta;
|
|
delta.x = mPos.x - other->current.pos.x;
|
|
delta.z = mPos.z - other->current.pos.z;
|
|
|
|
f32 distSq = delta.abs2XZ();
|
|
if (distSq > 1600.0f)
|
|
return;
|
|
|
|
delta.y = mPos.y - other->current.pos.y;
|
|
s16 rotY = cM_atan2s(delta.x, delta.z);
|
|
f32 dist = std::sqrtf(distSq);
|
|
|
|
dGrass_anm_c* anm;
|
|
if (mAnimIdx < 8) {
|
|
if (other->speedF > 16.0f) {
|
|
cXyz pos(mPos.x, mPos.y + 20.0f, mPos.z);
|
|
dKy_tevstr_c* tevStr = dComIfGp_roomControl_getTevStr(roomNo);
|
|
dComIfGp_particle_setSimple(dComIfGp_getGrass()->getKusaRunPID(), &pos, 0xFF, tevStr->mColorK0, tevStr->mColorK0, 1);
|
|
setBatta(&mPos, &tevStr->mColorK0);
|
|
}
|
|
|
|
s32 anmIdx = dComIfGp_getGrass()->newAnm();
|
|
if (anmIdx < 0)
|
|
return;
|
|
mAnimIdx = anmIdx;
|
|
anm = &dComIfGp_getGrass()->getAnm(mAnimIdx);
|
|
} else {
|
|
anm = &dComIfGp_getGrass()->getAnm(mAnimIdx);
|
|
}
|
|
|
|
anm->mRotY = rotY;
|
|
anm->mRotX = cM_atan2s(40.0f - dist, 40.0f);
|
|
anm->mState = 2;
|
|
}
|
|
|
|
/* 8007734C-800775E4 .text WorkAt_NoCutAnim__13dGrass_data_cFP10fopAc_ac_cUliP15dCcMassS_HitInfP8cCcD_Obj */
|
|
void dGrass_data_c::WorkAt_NoCutAnim(fopAc_ac_c* ac, u32 p1, int roomNo, dCcMassS_HitInf* hitInf, cCcD_Obj* hitObj) {
|
|
dCcD_GObjInf* hitObjInf = dCcD_GetGObjInf(hitObj);
|
|
cXyz vel = *hitObjInf->GetAtVecP();
|
|
f32 mag = vel.abs2XZ();
|
|
|
|
if (cM3d_IsZero(mag)) {
|
|
if (hitObj->GetShapeAttr()->GetNVec(mPos, &vel)) {
|
|
vel *= 5.0f;
|
|
mag = vel.abs2XZ();
|
|
} else {
|
|
vel.x = mPos.x - ac->current.pos.x;
|
|
vel.y = mPos.y - ac->current.pos.y;
|
|
vel.z = mPos.z - ac->current.pos.z;
|
|
mag = vel.abs2XZ();
|
|
}
|
|
}
|
|
|
|
if (!cM3d_IsZero(mag)) {
|
|
s16 angle = cM_atan2s(vel.x, vel.z);
|
|
dGrass_anm_c* anm;
|
|
if (mAnimIdx < 8) {
|
|
s32 newIdx = dComIfGp_getGrass()->newAnm();
|
|
if (newIdx < 0)
|
|
return;
|
|
mAnimIdx = newIdx;
|
|
anm = &dComIfGp_getGrass()->getAnm(mAnimIdx);
|
|
} else {
|
|
anm = &dComIfGp_getGrass()->getAnm(mAnimIdx);
|
|
}
|
|
|
|
anm->mRotY = angle * (cM_rnd() * 0.2f + 0.9f);
|
|
anm->mRotX = cM_atan2s(mag, 40.0f) * (cM_rnd() * 0.2f + 0.9f);
|
|
anm->mState = 2;
|
|
}
|
|
}
|
|
|
|
/* 800775EC-800777CC .text WorkAt__13dGrass_data_cFP10fopAc_ac_cUliP15dCcMassS_HitInf */
|
|
void dGrass_data_c::WorkAt(fopAc_ac_c* ac, u32 p1, int roomNo, dCcMassS_HitInf* inf) {
|
|
cCcD_Obj* hitObj = inf->GetAtHitObj();
|
|
if (hitObj != NULL && (hitObj->ChkAtType(AT_TYPE_WIND) ||
|
|
hitObj->ChkAtType(AT_TYPE_NORMAL_ARROW) ||
|
|
hitObj->ChkAtType(AT_TYPE_FIRE_ARROW) ||
|
|
hitObj->ChkAtType(AT_TYPE_ICE_ARROW) ||
|
|
hitObj->ChkAtType(AT_TYPE_LIGHT_ARROW) ||
|
|
hitObj->ChkAtType(AT_TYPE_HOOKSHOT))) {
|
|
WorkAt_NoCutAnim(ac, p1, roomNo, inf, hitObj);
|
|
} else {
|
|
if (mAnimIdx >= 8) {
|
|
dComIfGp_getGrass()->deleteAnm(mAnimIdx);
|
|
}
|
|
mAnimIdx = -1;
|
|
static csXyz ang(0, 0, 0);
|
|
cXyz pos(mPos.x, mPos.y + 25.0f, mPos.z);
|
|
dKy_tevstr_c* tevStr = dComIfGp_roomControl_getTevStr(roomNo);
|
|
dComIfGp_particle_setSimple(dComIfGp_getGrass()->getKusaKenPID(), &pos, 0xFF, tevStr->mColorK0, tevStr->mColorK0, 1);
|
|
setBatta(&mPos, &tevStr->mColorK0);
|
|
|
|
if (mItemIdx >= 0)
|
|
fopAcM_createItemFromTable(&mPos, mItemIdx, -1, roomNo, daItemType_0_e, NULL, daItemAct_1_e, NULL);
|
|
if (!l_CutSoundFlag) {
|
|
l_CutSoundFlag = true;
|
|
mDoAud_seStart(JA_SE_LK_CUT_GRASS, &mPos, 0, dComIfGp_getReverb(roomNo));
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 800777CC-800779D4 .text hitCheck__13dGrass_data_cFi */
|
|
void dGrass_data_c::hitCheck(int roomNo) {
|
|
dCcMassS_HitInf hitInf;
|
|
fopAc_ac_c* actor;
|
|
u32 ret = dComIfG_Ccsp()->ChkMass(&mPos, &actor, &hitInf);
|
|
bool checkAt = (ret & 1) && (actor != NULL && fopAcM_GetName(actor) != PROC_TSUBO && fopAcM_GetName(actor) != PROC_STONE);
|
|
|
|
if ((ret & 2) == 0 && !checkAt) {
|
|
if (mAnimIdx >= 8) {
|
|
dGrass_anm_c& anm = dComIfGp_getGrass()->getAnm(mAnimIdx);
|
|
s16 rotY = anm.mRotY;
|
|
s16 targetY = rotY & 0xe000;
|
|
u32 origIdx = (rotY >> 13) & 0x07;
|
|
dGrass_anm_c& origAnm = dComIfGp_getGrass()->getAnm(origIdx);
|
|
if (anm.mState == 2) {
|
|
mDoAud_seStart(JA_SE_FT_ADD_GRASS, &mPos, 0, dComIfGp_getReverb(roomNo));
|
|
anm.mState = 1;
|
|
}
|
|
|
|
if (!cLib_addCalcAngleS(&anm.mRotX, origAnm.mRotX, 16, 4000, 100)) {
|
|
if (cLib_chaseAngleS(&anm.mRotY, targetY, 800)) {
|
|
dComIfGp_getGrass()->deleteAnm(mAnimIdx);
|
|
mAnimIdx = (anm.mRotY >> 13) & 7;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if ((ret & 2))
|
|
WorkCo(actor, ret, roomNo);
|
|
if (checkAt)
|
|
WorkAt(actor, ret, roomNo, &hitInf);
|
|
}
|
|
}
|
|
|
|
/* 80077A1C-80077A2C .text newData__13dGrass_room_cFP13dGrass_data_c */
|
|
void dGrass_room_c::newData(dGrass_data_c* data) {
|
|
data->mpNextData = mpData;
|
|
mpData = data;
|
|
}
|
|
|
|
/* 80077A2C-80077A90 .text deleteData__13dGrass_room_cFv */
|
|
void dGrass_room_c::deleteData() {
|
|
while (mpData != NULL) {
|
|
mpData->mState = 0;
|
|
mDoAud_seDeleteObject(&mpData->mPos);
|
|
mpData = mpData->mpNextData;
|
|
}
|
|
}
|
|
|
|
/* 80077A90-80077CB8 .text __ct__15dGrass_packet_cFv */
|
|
dGrass_packet_c::dGrass_packet_c() {
|
|
dGrass_data_c* data = getData();
|
|
for (s32 i = 0; i < ARRAY_SIZE(mGrassData); i++, data++)
|
|
data->mState = 0;
|
|
mNextIdx = 0;
|
|
dGrass_anm_c* anm = getAnm();
|
|
for (s32 i = 0; i < ARRAY_SIZE(mGrassAnm); i++, anm++)
|
|
anm->mState = 0;
|
|
s16 angle = 0;
|
|
for (s32 i = 0; i < 8; i++, angle += 0x2000)
|
|
setAnm(i, angle);
|
|
if (strncmp(dComIfGp_getStartStageName(), "kin", 3) == 0 || strcmp(dComIfGp_getStartStageName(), "Xboss1") == 0) {
|
|
mpPosArr = (f32*)l_Vmori_pos;
|
|
mpColorArr = l_Vmori_color;
|
|
mpTexCoordArr = (f32*)l_Vmori_texCoord;
|
|
mpMatDL = l_Vmori_matDL;
|
|
mMatDLSize = 0xa0;
|
|
mpDL = l_Vmori_00DL;
|
|
mDLSize = 0xa0;
|
|
mpDLCut = l_Vmori_01DL;
|
|
mDLCutSize = 0x80;
|
|
mCoParticle = dPa_name::ID_SCENE_8222;
|
|
mAtParticle = dPa_name::ID_SCENE_8221;
|
|
} else {
|
|
mpPosArr = (f32*)l_pos;
|
|
mpColorArr = l_color;
|
|
mpTexCoordArr = (f32*)l_texCoord;
|
|
mpMatDL = l_matDL;
|
|
mMatDLSize = 0xa0;
|
|
mpDL = l_Oba_kusa_aDL;
|
|
mDLSize = 0xa0;
|
|
mpDLCut = l_Oba_kusa_a_cutDL;
|
|
mDLCutSize = 0x80;
|
|
mCoParticle = dPa_name::ID_COMMON_03DB;
|
|
mAtParticle = dPa_name::ID_COMMON_03DA;
|
|
}
|
|
}
|
|
|
|
/* 80077CB8-80077CC4 .text __ct__13dGrass_room_cFv */
|
|
dGrass_room_c::dGrass_room_c() {
|
|
mpData = NULL;
|
|
}
|
|
|
|
/* 80077CC4-80077CD0 .text __ct__12dGrass_anm_cFv */
|
|
dGrass_anm_c::dGrass_anm_c() {
|
|
mState = 0;
|
|
}
|
|
|
|
/* 80077CD0-80077CDC .text __ct__13dGrass_data_cFv */
|
|
dGrass_data_c::dGrass_data_c() {
|
|
mState = 0;
|
|
}
|
|
|
|
/* 80077CDC-80077E58 .text draw__15dGrass_packet_cFv */
|
|
void dGrass_packet_c::draw() {
|
|
#if VERSION != VERSION_JPN
|
|
j3dSys.reinitGX();
|
|
GXSetNumIndStages(0);
|
|
#endif
|
|
|
|
static GXVtxDescList l_vtxDescList[] = {
|
|
{GX_VA_POS, GX_INDEX8},
|
|
{GX_VA_CLR0, GX_INDEX8},
|
|
{GX_VA_TEX0, GX_INDEX8},
|
|
{GX_VA_NULL, GX_NONE},
|
|
};
|
|
|
|
static GXVtxAttrFmtList l_vtxAttrFmtList[] = {
|
|
{GX_VA_POS, GX_POS_XYZ, GX_F32, 0x00},
|
|
{GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0x00},
|
|
{GX_VA_TEX0, GX_TEX_ST, GX_F32, 0x00},
|
|
{GX_VA_NULL, GX_POS_XYZ, GX_S8, 0x00},
|
|
};
|
|
|
|
GFSetVtxDescv(l_vtxDescList);
|
|
GFSetVtxAttrFmtv(GX_VTXFMT0, l_vtxAttrFmtList);
|
|
GFSetArray(GX_VA_POS, mpPosArr, sizeof(cXyz));
|
|
GFSetArray(GX_VA_CLR0, mpColorArr, sizeof(*mpColorArr));
|
|
GFSetArray(GX_VA_TEX0, mpTexCoordArr, sizeof(cXy));
|
|
GXCallDisplayList(mpMatDL, mMatDLSize);
|
|
|
|
dGrass_room_c* room = &mGrassRoom[0];
|
|
for (s32 i = 0; i < (s32)ARRAY_SIZE(mGrassRoom); room++, i++) {
|
|
dKy_tevstr_c* tevstr = dComIfGp_roomControl_getTevStr(i);
|
|
GFSetTevColorS10(GX_TEVREG0, tevstr->mColorC0);
|
|
GFSetTevColor(GX_TEVREG1, tevstr->mColorK0);
|
|
dKy_GfFog_tevstr_set(tevstr);
|
|
for (dGrass_data_c* data = room->mpData; data != NULL; data = data->mpNextData) {
|
|
if (!cLib_checkBit<u8>(data->mInitFlags, 0x02)) {
|
|
GXLoadPosMtxImm(data->mModelMtx, GX_PNMTX0);
|
|
if (data->mAnimIdx >= 0)
|
|
GXCallDisplayList(mpDL, mDLSize);
|
|
else
|
|
GXCallDisplayList(mpDLCut, mDLCutSize);
|
|
}
|
|
}
|
|
}
|
|
|
|
#if VERSION != VERSION_JPN
|
|
J3DShape::resetVcdVatCache();
|
|
#endif
|
|
}
|
|
|
|
/* 80077E58-80078008 .text calc__15dGrass_packet_cFv */
|
|
void dGrass_packet_c::calc() {
|
|
dGrass_anm_c* anm = getAnm();
|
|
|
|
f32 windSpeed = 0.0f;
|
|
if (!mDoGph_gInf_c::isMonotone() || strcmp(dComIfGp_getStartStageName(), "Hyrule") != 0) {
|
|
windSpeed = dKyw_get_wind_pow() * 1000.0f + 1000.0f;
|
|
windSpeed = cLib_maxLimit(windSpeed, 2000.0f);
|
|
}
|
|
|
|
for (s32 i = 0; i < 8; anm++, i++) {
|
|
anm->mRotX = windSpeed + windSpeed * cM_scos(windSpeed * (g_Counter.mTimer + (i*250)));
|
|
}
|
|
|
|
int roomNo = dComIfGp_roomControl_getStayNo();
|
|
dGrass_data_c* data = mGrassRoom[roomNo].getData();
|
|
if (data != NULL) {
|
|
l_CutSoundFlag = false;
|
|
dComIfG_Ccsp()->SetMassAttr(40.0f, 80.0f, 11, 0);
|
|
|
|
while (true) {
|
|
if (!cLib_checkBit<u8>(data->mInitFlags, 0x02) && data->mAnimIdx >= 0)
|
|
data->hitCheck(roomNo);
|
|
|
|
data = data->mpNextData;
|
|
if (data == NULL)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80078008-800782B8 .text checkGroundY__FR4cXyz */
|
|
static f32 checkGroundY(cXyz& pos) {
|
|
dBgS_GndChk chk;
|
|
pos.y += 50.0f;
|
|
chk.SetPos(&pos);
|
|
f32 y = dComIfG_Bgsp()->GroundCross(&chk);
|
|
pos.y -= 50.0f;
|
|
if (y <= C_BG_MIN_HEIGHT)
|
|
return pos.y;
|
|
else
|
|
return y;
|
|
}
|
|
|
|
/* 800782B8-800784E8 .text update__15dGrass_packet_cFv */
|
|
void dGrass_packet_c::update() {
|
|
dGrass_anm_c* anm = getAnm();
|
|
for (int i = 0; i < (s32)ARRAY_SIZE(mGrassAnm); i++, anm++) {
|
|
mDoMtx_stack_c::YrotS(anm->mRotY);
|
|
mDoMtx_stack_c::XrotM(anm->mRotX);
|
|
mDoMtx_stack_c::YrotM(-anm->mRotY);
|
|
mDoMtx_copy(mDoMtx_stack_c::get(), anm->mAnimMtx);
|
|
}
|
|
|
|
dGrass_data_c* data = getData();
|
|
anm = getAnm();
|
|
|
|
s32 numPerFrame = 0;
|
|
|
|
mDoLib_clipper::changeFar(mDoLib_clipper::getFar() * 1.6363636f);
|
|
for (int i = 0; i < (s32)ARRAY_SIZE(mGrassData); i++) {
|
|
if (data->mState != 0) {
|
|
if (data->mState == 1 && numPerFrame < 30) {
|
|
data->mPos.y = checkGroundY(data->mPos);
|
|
data->mState = 2;
|
|
numPerFrame++;
|
|
}
|
|
|
|
cXyz pos(data->mPos.x, data->mPos.y + 260.0f, data->mPos.z);
|
|
if (mDoLib_clipper::clip(j3dSys.getViewMtx(), pos, 260.0f)) {
|
|
cLib_onBit<u8>(data->mInitFlags, 0x02);
|
|
} else {
|
|
cLib_offBit<u8>(data->mInitFlags, 0x02);
|
|
if (data->mAnimIdx >= 0) {
|
|
Mtx& mtx = anm[data->mAnimIdx].mAnimMtx;
|
|
mtx[0][3] = data->mPos.x;
|
|
mtx[1][3] = data->mPos.y;
|
|
mtx[2][3] = data->mPos.z;
|
|
mDoMtx_concat(j3dSys.getViewMtx(), mtx, data->mModelMtx);
|
|
} else {
|
|
mDoMtx_trans(data->mModelMtx, data->mPos.x, data->mPos.y, data->mPos.z);
|
|
mDoMtx_YrotM(data->mModelMtx, i * 0xDCF);
|
|
mDoMtx_concat(j3dSys.getViewMtx(), data->mModelMtx, data->mModelMtx);
|
|
}
|
|
}
|
|
}
|
|
data++;
|
|
}
|
|
mDoLib_clipper::resetFar();
|
|
j3dSys.getDrawBuffer(0)->entryImm(this, 0);
|
|
}
|
|
|
|
/* 800784E8-800785C0 .text setData__15dGrass_packet_cFP13dGrass_data_ciR4cXyziSc */
|
|
void dGrass_packet_c::setData(dGrass_data_c* data, int nextIdx, cXyz& pos, int i_roomNo, s8 itemIdx) {
|
|
f32 y;
|
|
if (fopOvlpM_IsPeek()) {
|
|
y = checkGroundY(pos);
|
|
data->mState = 2;
|
|
} else {
|
|
y = pos.y;
|
|
data->mState = 1;
|
|
}
|
|
cLib_setBit<u8>(data->mInitFlags, 0x02);
|
|
data->mAnimIdx = (u8)cM_rndF(7.0f);
|
|
data->mPos.set(pos.x, y, pos.z);
|
|
data->mItemIdx = itemIdx;
|
|
mGrassRoom[i_roomNo].newData(data);
|
|
mNextIdx = nextIdx;
|
|
}
|
|
|
|
/* 800785C0-800786FC .text newData__15dGrass_packet_cFR4cXyziSc */
|
|
dGrass_data_c* dGrass_packet_c::newData(cXyz& pos, int i_roomNo, s8 itemIdx) {
|
|
JUT_ASSERT(VERSION_SELECT(1530, 1536, 1536), 0 <= i_roomNo && i_roomNo < 64);
|
|
|
|
dGrass_data_c* data = &mGrassData[mNextIdx];
|
|
s32 i = mNextIdx;
|
|
for (; i < (s32)ARRAY_SIZE(mGrassData); data++, i++) {
|
|
if (data->mState == 0) {
|
|
setData(data, i, pos, i_roomNo, itemIdx);
|
|
return data;
|
|
}
|
|
}
|
|
|
|
data = getData();
|
|
for (i = 0; i < mNextIdx; data++, i++) {
|
|
if (data->mState == 0) {
|
|
setData(data, i, pos, i_roomNo, itemIdx);
|
|
return data;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* 800786FC-80078748 .text newAnm__15dGrass_packet_cFv */
|
|
s32 dGrass_packet_c::newAnm() {
|
|
dGrass_anm_c* anm = &getAnm(8);
|
|
for (s32 i = 8; i < 104; anm++, i++) {
|
|
if (anm->mState == 0) {
|
|
anm->mState = 1;
|
|
anm->mRotY = 0;
|
|
anm->mRotX = 0;
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/* 80078748-80078770 .text setAnm__15dGrass_packet_cFis */
|
|
void dGrass_packet_c::setAnm(int idx, s16 angleY) {
|
|
dGrass_anm_c& anm = getAnm(idx);
|
|
anm.mState = 1;
|
|
anm.mRotY = angleY;
|
|
anm.mRotX = 0;
|
|
}
|