diff --git a/include/JSystem/J3DU/J3DUClipper.h b/include/JSystem/J3DU/J3DUClipper.h index 8f5a9df39..113ec60ec 100644 --- a/include/JSystem/J3DU/J3DUClipper.h +++ b/include/JSystem/J3DU/J3DUClipper.h @@ -12,8 +12,8 @@ public: virtual ~J3DUClipper() {} void init(); void calcViewFrustum(); - u32 clip(const Mtx, Vec, f32); - u32 clip(const Mtx, Vec*, Vec*); + s32 clip(const Mtx, Vec, f32); + s32 clip(const Mtx, Vec*, Vec*); u32 clipByBox(J3DModel*); void setFovy(f32 fovy) { mFovY = fovy; } diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 5b567441d..8008f8038 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -213,6 +213,11 @@ public: mGlobalPrmColor.g = g; mGlobalPrmColor.b = b; } + void setGlobalEnvColor(u8 r, u8 g, u8 b) { + mGlobalEnvColor.r = r; + mGlobalEnvColor.g = g; + mGlobalEnvColor.b = b; + } void setVolumeSweep(f32 i_volSweep) { mVolumeSweep = i_volSweep; } void setVolumeSize(u16 size) { mVolumeSize = size; } @@ -284,7 +289,6 @@ public: void isZDraw() {} void loadTexture(u8, GXTexMapID) {} void setEmitterRotation(const JGeometry::TVec3&) {} - void setGlobalEnvColor(u8, u8, u8) {} void setGlobalParticleHeightScale(f32) {} void setGlobalParticleScale(f32, f32) {} void setGlobalParticleWidthScale(f32) {} diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index 6dc3e6af7..371e264a5 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -33,6 +33,7 @@ public: ~JPABaseParticle() {} JPABaseParticle() : mLink(this), mCurFrame(0.0f) {} + void setOffsetPosition(f32 x, f32 y, f32 z) { mGlobalPosition.set(x, y, z); } public: /* 0x00 */ JSULink mLink; diff --git a/include/d/d_particle.h b/include/d/d_particle.h index 8bac3d202..304f37e98 100644 --- a/include/d/d_particle.h +++ b/include/d/d_particle.h @@ -88,7 +88,7 @@ public: void executeAfter(JPABaseEmitter*); void draw(JPABaseEmitter*); void create(JPAEmitterManager*, u16, u8); - void createEmitter(JPAEmitterManager*); + JPABaseEmitter* createEmitter(JPAEmitterManager*); void set(cXyz const*, u8, GXColor const&, GXColor const&, int); /* 0x004 */ JPABaseEmitter* mpBaseEmitter; @@ -119,7 +119,7 @@ public: /* 0x1C */ cXyz mCollapsePos[2]; /* 0x34 */ cXyz* mpPos; /* 0x38 */ csXyz* mpRot; - /* 0x3C */ cXyz mRotMtx[3]; + /* 0x3C */ Vec mRotMtx[3]; /* 0x60 */ JPABaseEmitter* mpBaseEmitter; }; @@ -152,7 +152,7 @@ public: /* 0x04 */ s16 mState; /* 0x08 */ f32 mBaseY; /* 0x0C */ f32 mMinY; - /* 0x10 */ cXyz mPos[3]; + /* 0x10 */ Vec mPos[3]; /* 0x34 */ cXyz* mpPos; /* 0x38 */ csXyz* mpRot; /* 0x3C */ f32 mExTransY; @@ -195,13 +195,37 @@ class JKRSolidHeap; class dPa_J3DmodelEmitter_c : public dPa_modelEmitter_c { public: - u8 temp2[4]; - JKRSolidHeap* mpHeap; - - dPa_J3DmodelEmitter_c(JPABaseEmitter*, J3DModelData*, dKy_tevstr_c&, J3DAnmTexPattern*, unsigned short, int); + dPa_J3DmodelEmitter_c(JPABaseEmitter*, J3DModelData*, dKy_tevstr_c&, J3DAnmTexPattern*, u16, int); virtual ~dPa_J3DmodelEmitter_c(); virtual void draw(); + + /* 0x10 */ JPABaseEmitter* mpBaseEmitter; + /* 0x14 */ JKRSolidHeap* mpHeap; + /* 0x18 */ J3DModelData* field_0x18; + /* 0x1C */ J3DAnmTexPattern* field_0x1c; + /* 0x20 */ J3DTexNoAnm* field_0x20; + /* 0x24 */ u16 field_0x24; + /* 0x26 */ u8 field_0x26; + /* 0x28 */ J3DLightInfo field_0x28; + /* 0x5C */ u8 field_0x5c[0x9c - 0x5c]; + /* 0x9C */ cXyz field_0x9c; + /* 0xA8 */ GXColorS10 field_0xa8; + /* 0xB0 */ GXColor field_0xb0; + /* 0xB4 */ GXColor field_0xb4; + /* 0xB8 */ GXColorS10 field_0xb8; + /* 0xC0 */ f32 field_0xc0; + /* 0xC4 */ f32 field_0xc4; + /* 0xC8 */ f32 field_0xc8; + /* 0xCC */ u8 field_0xcc; + /* 0xCD */ u8 field_0xcd; + /* 0xCE */ u8 field_0xce; + /* 0xCF */ u8 field_0xcf; + /* 0xD0 */ u8 field_0xd0; + /* 0xD1 */ u8 field_0xd1; + /* 0xD2 */ u8 field_0xd2; + /* 0xD3 */ u8 field_0xd3; + /* 0xD4 */ u8 field_0xd4; }; class dPa_J3Dmodel_c { @@ -215,7 +239,7 @@ public: class dPa_smokePcallBack : public JPACallBackBase2 { public: - dPa_smokePcallBack(); + dPa_smokePcallBack() {} virtual ~dPa_smokePcallBack() {} virtual void execute(JPABaseEmitter*, JPABaseParticle*); @@ -224,16 +248,18 @@ public: class dPa_selectTexEcallBack : public dPa_levelEcallBack { public: - dPa_selectTexEcallBack(); + dPa_selectTexEcallBack(u8 param_1) { field_0x4 = param_1; } virtual ~dPa_selectTexEcallBack() {} virtual void draw(JPABaseEmitter*); virtual void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8); + + u8 field_0x4; }; class dPa_windPcallBack : public JPACallBackBase2 { public: - dPa_windPcallBack(); + dPa_windPcallBack() {} virtual ~dPa_windPcallBack() {} virtual void execute(JPABaseEmitter*, JPABaseParticle*); @@ -241,7 +267,7 @@ public: class dPa_singleRippleEcallBack : public dPa_levelEcallBack { public: - dPa_singleRippleEcallBack(); + dPa_singleRippleEcallBack() {} virtual ~dPa_singleRippleEcallBack() {} virtual void execute(JPABaseEmitter*); @@ -251,7 +277,7 @@ public: class dPa_ripplePcallBack : public JPACallBackBase2 { public: - dPa_ripplePcallBack(); + dPa_ripplePcallBack() {} virtual ~dPa_ripplePcallBack() {} virtual void execute(JPABaseEmitter*, JPABaseParticle*); @@ -275,7 +301,7 @@ STATIC_ASSERT(sizeof(dPa_cutTurnEcallBack_c) == 0x10); class dPa_stripesEcallBack : public dPa_levelEcallBack { public: - dPa_stripesEcallBack(); + dPa_stripesEcallBack() {} virtual ~dPa_stripesEcallBack() {} virtual void draw(JPABaseEmitter*); @@ -284,7 +310,7 @@ public: class dPa_kageroEcallBack : public JPACallBackBase { public: - dPa_kageroEcallBack(); + dPa_kageroEcallBack() {} virtual ~dPa_kageroEcallBack() {} virtual void draw(JPABaseEmitter*); @@ -292,7 +318,7 @@ public: class dPa_bombSmokeEcallBack : public dPa_levelEcallBack { public: - dPa_bombSmokeEcallBack(); + dPa_bombSmokeEcallBack() {} virtual ~dPa_bombSmokeEcallBack() {} virtual void execute(JPABaseEmitter*); @@ -301,7 +327,7 @@ public: class dPa_setColorEcallBack : public dPa_levelEcallBack { public: - dPa_setColorEcallBack(); + dPa_setColorEcallBack(const GXColor& color) { mColor = color; } virtual ~dPa_setColorEcallBack() {} virtual void draw(JPABaseEmitter*); @@ -326,7 +352,7 @@ class dPa_control_c { public: dPa_control_c(); - static u16 getRM_ID(u16); + static u8 getRM_ID(u16); void swapFrameBufferTexture(); void createCommon(void const*); void createRoomScene(void const*); @@ -424,6 +450,8 @@ public: void drawModelParticle() { mModelCtrl->draw(); } JKRHeap * getHeap() { return mHeap; } + static dPa_selectTexEcallBack mTsubo[4]; + static dPa_setColorEcallBack* getLifeBallSetColorEcallBack(int idx) { return &mLifeBall[idx]; } static dPa_setColorEcallBack mLifeBall[3]; @@ -432,9 +460,14 @@ public: static void offStatus(u8 status) { mStatus &= ~status; } static u8 mStatus; - static dPa_rippleEcallBack mSingleRippleEcallBack; - static JPAEmitterManager * mEmitterMng; + static dPa_stripesEcallBack mStripes; + static dPa_kageroEcallBack mKagero; + static dPa_smokeEcallBack mSmokeEcallback; + static dPa_smokePcallBack mSmokePcallback; + static dPa_singleRippleEcallBack mSingleRippleEcallBack; + static dPa_ripplePcallBack mRipplePcallBack; + static dPa_bombSmokeEcallBack mBombSmokeEcallBack; static MtxP getWindViewMatrix() { return mWindViewMatrix; } static Mtx mWindViewMatrix; diff --git a/src/JSystem/J3DU/J3DUClipper.cpp b/src/JSystem/J3DU/J3DUClipper.cpp index c5dd0ad97..8e7406612 100644 --- a/src/JSystem/J3DU/J3DUClipper.cpp +++ b/src/JSystem/J3DU/J3DUClipper.cpp @@ -50,7 +50,7 @@ void J3DUClipper::calcViewFrustum() { } /* 80256888-802569D0 .text clip__11J3DUClipperFPA4_Cf3Vecf */ -u32 J3DUClipper::clip(const Mtx mtx, Vec pos, float radius) { +s32 J3DUClipper::clip(const Mtx mtx, Vec pos, float radius) { Vec p; MTXMultVec(mtx, &pos, &p); @@ -71,7 +71,7 @@ u32 J3DUClipper::clip(const Mtx mtx, Vec pos, float radius) { } /* 802569D0-80256CB8 .text clip__11J3DUClipperFPA4_CfP3VecP3Vec */ -u32 J3DUClipper::clip(const Mtx mtx, Vec* pMin, Vec* pMax) { +s32 J3DUClipper::clip(const Mtx mtx, Vec* pMin, Vec* pMax) { s32 clip[6]; for (u32 i = 0; i < ARRAY_SIZE(clip); i++) clip[i] = 0; diff --git a/src/d/d_particle.cpp b/src/d/d_particle.cpp index af4528fc9..c4a68e9bd 100644 --- a/src/d/d_particle.cpp +++ b/src/d/d_particle.cpp @@ -10,6 +10,7 @@ #include "JSystem/JKernel/JKRSolidHeap.h" #include "JSystem/JUtility/JUTAssert.h" #include "SSystem/SComponent/c_malloc.h" +#include "m_Do/m_Do_lib.h" /* 8007A4D8-8007A514 .text __ct__18dPa_modelEmitter_cFv */ dPa_modelEmitter_c::dPa_modelEmitter_c() { @@ -17,8 +18,54 @@ dPa_modelEmitter_c::dPa_modelEmitter_c() { } /* 8007A514-8007A804 .text __ct__21dPa_J3DmodelEmitter_cFP14JPABaseEmitterP12J3DModelDataR12dKy_tevstr_cP16J3DAnmTexPatternUsi */ -dPa_J3DmodelEmitter_c::dPa_J3DmodelEmitter_c(JPABaseEmitter*, J3DModelData*, dKy_tevstr_c&, J3DAnmTexPattern*, u16, int) { +dPa_J3DmodelEmitter_c::dPa_J3DmodelEmitter_c(JPABaseEmitter* param_1, J3DModelData* param_2, dKy_tevstr_c& param_3, J3DAnmTexPattern* param_4, u16 param_5, int param_6) { /* Nonmatching */ + field_0x28 = j3dDefaultLightInfo; + mpBaseEmitter = param_1; + field_0x18 = param_2; + field_0x26 = param_6; + field_0x28 = param_3.mLightObj.getLightInfo(); + field_0x9c = param_3.mLightPosWorld; + field_0xa8 = param_3.mColorC0; + field_0xb0 = param_3.mColorK0; + field_0xb4 = param_3.mColorK1; + field_0xb8 = param_3.mFogColor; + field_0xc0 = param_3.mFogStartZ; + field_0xc4 = param_3.mFogEndZ; + field_0xc8 = param_3.mColpatBlend; + field_0xcc = param_3.mInitTimer; + field_0xcd = param_3.mEnvrIdxCurr; + field_0xce = param_3.mEnvrIdxPrev; + field_0xcf = param_3.mColpatCurr; + field_0xd0 = param_3.mColpatPrev; + field_0xd1 = param_3.mRoomNo; + field_0xd2 = param_3.mEnvrIdxOverride; + field_0xd3 = param_3.mLightMode; + field_0xd4 = param_3.mInitType; + field_0x1c = param_4; + if (!field_0x1c) { + mpHeap = NULL; + field_0x20 = NULL; + } else { + u16 r29 = field_0x1c->getUpdateMaterialNum(); + mpHeap = mDoExt_createSolidHeapToCurrent(r29 * 12 + 16, NULL, 0); + if (mpHeap) { + field_0x20 = new J3DTexNoAnm[r29]; + if (field_0x20) { + field_0x1c->searchUpdateMaterialID(field_0x18); + J3DTexNoAnm* tex = field_0x20; + for (u16 i = 0; i < r29; i++) { + tex->setAnmIndex(i); + tex->setAnmTexPattern(field_0x1c); + tex++; + } + field_0x24 = param_5; + } + mDoExt_restoreCurrentHeap(); + mDoExt_adjustSolidHeap(mpHeap); + } + } + param_1->becomeImmortalEmitter(); } /* 8007A84C-8007A8C8 .text __dt__21dPa_J3DmodelEmitter_cFv */ @@ -54,12 +101,12 @@ dPa_J3Dmodel_c::dPa_J3Dmodel_c() { /* 8007AED8-8007AF64 .text __dt__18dPa_modelControl_cFv */ dPa_modelControl_c::~dPa_modelControl_c() { - /* Nonmatching (node_class has no virtual destructor) */ - node_class* node = mpHead; + /* this cast is a guess */ + dPa_modelEmitter_c* node = (dPa_modelEmitter_c*)mpHead; while (node) { - node_class* nextNode = node->mpNextNode; + dPa_modelEmitter_c* nextNode = (dPa_modelEmitter_c*)node->mpNextNode; cLs_SingleCut(node); - // delete node; + delete node; node = nextNode; } } @@ -157,8 +204,12 @@ dPa_smokeEcallBack::dPa_smokeEcallBack(const _GXColor&, dKy_tevstr_c*, u8) { } /* 8007B5E8-8007B698 .text setup__18dPa_smokeEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void dPa_smokeEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) { - /* Nonmatching */ +void dPa_smokeEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) { + static dPa_smokePcallBack l_smokePcallBack; + dPa_followEcallBack::setup(param_1, param_2, param_3, param_4); + field_0x14 = param_4; + param_1->mpParticleCallBack = &dPa_control_c::mSmokePcallback; + param_1->mUserData = field_0x15; } /* 8007B73C-8007B804 .text initiateLighting__FR11_GXColorS10R8_GXColorR8_GXColor */ @@ -213,8 +264,38 @@ dPa_simpleData_c::dPa_simpleData_c() { } /* 8007C460-8007C618 .text executeAfter__19dPa_simpleEcallBackFP14JPABaseEmitter */ -void dPa_simpleEcallBack::executeAfter(JPABaseEmitter*) { +void dPa_simpleEcallBack::executeAfter(JPABaseEmitter* param_1) { /* Nonmatching */ + s32 r28 = JPABaseEmitter::emtrInfo.mVolumeEmitCount; + if (r28 <= 0) { + mCount = 0; + } else { + dPa_simpleData_c* simpleData = mSimpleData; + param_1->playCreateParticle(); + while (mCount != 0) { + Vec local_38 = simpleData->mPos; + if (mDoLib_clipper::mClipper.clip(j3dSys.getViewMtx(), local_38, 200.0f) == 0) { + param_1->setGlobalTranslation(simpleData->mPos.x, simpleData->mPos.y, simpleData->mPos.z); + param_1->setGlobalPrmColor(simpleData->mPrmColor.r, simpleData->mPrmColor.g, simpleData->mPrmColor.b); + param_1->setGlobalAlpha(simpleData->mPrmColor.a); + param_1->setGlobalEnvColor(simpleData->mEnvColor[0], simpleData->mEnvColor[1], simpleData->mEnvColor[2]); + for (int i = 0; i < r28; i++) { + JPABaseParticle* particle = param_1->createParticle(); + if (particle == NULL) { + break; + } + particle->setOffsetPosition(simpleData->mPos.x, simpleData->mPos.y, simpleData->mPos.z); + if (simpleData->mbAffectedByWind) { + static dPa_windPcallBack l_windPcallBack; + particle->mpCallBack2 = &l_windPcallBack; + } + } + } + mCount--; + simpleData++; + } + } + param_1->stopCreateParticle(); } /* 8007C674-8007C6EC .text draw__19dPa_simpleEcallBackFP14JPABaseEmitter */ @@ -228,8 +309,18 @@ void dPa_simpleEcallBack::create(JPAEmitterManager*, u16, u8) { } /* 8007C774-8007C840 .text createEmitter__19dPa_simpleEcallBackFP17JPAEmitterManager */ -void dPa_simpleEcallBack::createEmitter(JPAEmitterManager*) { - /* Nonmatching */ +JPABaseEmitter* dPa_simpleEcallBack::createEmitter(JPAEmitterManager* manager) { + if (!mpBaseEmitter) { + static JGeometry::TVec3 pos(0.0f, 0.0f, 0.0f); + mpBaseEmitter = manager->createSimpleEmitterID(pos, mResID, mGrpID, dPa_control_c::getRM_ID(mResID), NULL, NULL); + if (!mpBaseEmitter) { + return mpBaseEmitter; + } + mpBaseEmitter->mpEmitterCallBack = this; + mpBaseEmitter->mMaxFrame = 0; + mpBaseEmitter->stopCreateParticle(); + } + return mpBaseEmitter; } /* 8007C840-8007C8C4 .text set__19dPa_simpleEcallBackFPC4cXyzUcRC8_GXColorRC8_GXColori */ @@ -242,7 +333,34 @@ void dPa_windPcallBack::execute(JPABaseEmitter*, JPABaseParticle*) { /* Nonmatching */ } +GXColor l_lifeBallColor[] = { + 0xeb, 0x20, 0x78, 0xff, + 0x20, 0xf1, 0x9b, 0xff, + 0xeb, 0xd7, 0x2f, 0xff +}; + +dPa_selectTexEcallBack dPa_control_c::mTsubo[] = { + dPa_selectTexEcallBack(0), + dPa_selectTexEcallBack(1), + dPa_selectTexEcallBack(2), + dPa_selectTexEcallBack(3), +}; + +dPa_setColorEcallBack dPa_control_c::mLifeBall[] = { + dPa_setColorEcallBack(l_lifeBallColor[0]), + dPa_setColorEcallBack(l_lifeBallColor[1]), + dPa_setColorEcallBack(l_lifeBallColor[2]), +}; + JPAEmitterManager * dPa_control_c::mEmitterMng; +dPa_stripesEcallBack dPa_control_c::mStripes; +dPa_kageroEcallBack dPa_control_c::mKagero; +dPa_smokeEcallBack dPa_control_c::mSmokeEcallback(0, 1, 1, 1); +dPa_smokePcallBack dPa_control_c::mSmokePcallback; +dPa_singleRippleEcallBack dPa_control_c::mSingleRippleEcallBack; +dPa_ripplePcallBack dPa_control_c::mRipplePcallBack; +dPa_bombSmokeEcallBack dPa_control_c::mBombSmokeEcallBack; +u8 dPa_control_c::mStatus; /* 8007C8E8-8007C9A4 .text __ct__13dPa_control_cFv */ dPa_control_c::dPa_control_c() { @@ -257,7 +375,7 @@ dPa_control_c::dPa_control_c() { } /* 8007CA28-8007CA30 .text getRM_ID__13dPa_control_cFUs */ -u16 dPa_control_c::getRM_ID(u16 uid) { +u8 dPa_control_c::getRM_ID(u16 uid) { return (uid >> 15) & 0x01; } @@ -327,12 +445,12 @@ JPABaseEmitter* dPa_control_c::setBombSmoke(u16, const cXyz*, const csXyz*, cons } /* 8007D414-8007D998 .text setSimpleLand__13dPa_control_cFiPC4cXyzPC5csXyzfffP12dKy_tevstr_cPii */ -void dPa_control_c::setSimpleLand(int, const cXyz*, const csXyz*, float, float, float, dKy_tevstr_c*, int*, int) { +void dPa_control_c::setSimpleLand(int, const cXyz*, const csXyz*, f32, f32, f32, dKy_tevstr_c*, int*, int) { /* Nonmatching */ } /* 8007D998-8007DA58 .text setSimpleLand__13dPa_control_cFR13cBgS_PolyInfoPC4cXyzPC5csXyzfffP12dKy_tevstr_cPii */ -void dPa_control_c::setSimpleLand(cBgS_PolyInfo&, const cXyz*, const csXyz*, float, float, float, dKy_tevstr_c*, int*, int) { +void dPa_control_c::setSimpleLand(cBgS_PolyInfo&, const cXyz*, const csXyz*, f32, f32, f32, dKy_tevstr_c*, int*, int) { /* Nonmatching */ } @@ -472,7 +590,7 @@ void dPa_bombSmokeEcallBack::execute(JPABaseEmitter*) { } /* 8007F108-8007F1A8 .text getMaxWaterY__18dPa_trackEcallBackFPQ29JGeometry8TVec3 */ -void dPa_trackEcallBack::getMaxWaterY(JGeometry::TVec3*) { +void dPa_trackEcallBack::getMaxWaterY(JGeometry::TVec3*) { /* Nonmatching */ }