d_particle

This commit is contained in:
Jcw87
2023-12-13 01:09:01 -08:00
parent dc60a90571
commit 554f653bbc
6 changed files with 194 additions and 38 deletions
+2 -2
View File
@@ -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; }
+5 -1
View File
@@ -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<s16>&) {}
void setGlobalEnvColor(u8, u8, u8) {}
void setGlobalParticleHeightScale(f32) {}
void setGlobalParticleScale(f32, f32) {}
void setGlobalParticleWidthScale(f32) {}
+1
View File
@@ -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<JPABaseParticle> mLink;
+52 -19
View File
@@ -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<JPABaseEmitter*, JPABaseParticle*> {
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<JPABaseEmitter*, JPABaseParticle*> {
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<JPABaseEmitter*, JPABaseParticle*> {
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<JPABaseEmitter*> {
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;
+2 -2
View File
@@ -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;
+132 -14
View File
@@ -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<f32> 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<f> */
void dPa_trackEcallBack::getMaxWaterY(JGeometry::TVec3<float>*) {
void dPa_trackEcallBack::getMaxWaterY(JGeometry::TVec3<f32>*) {
/* Nonmatching */
}