From 77f5d98159e561a05f1fe31254cac0faa3375839 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 11 Nov 2023 13:22:49 -0800 Subject: [PATCH] d_drawlist, d_particle, f_op_actor_mng, JPA work --- include/JSystem/J3DGraphBase/J3DStruct.h | 19 +- include/JSystem/JParticle/JPADraw.h | 8 +- include/JSystem/JParticle/JPAEmitter.h | 24 +- include/JSystem/JParticle/JPAEmitterLoader.h | 4 + include/JSystem/JParticle/JPAEmitterManager.h | 45 ++++ include/JSystem/JParticle/JPAField.h | 44 +++- include/JSystem/JParticle/JPAParticle.h | 1 + .../JSystem/JParticle/JPAResourceManager.h | 2 + include/SSystem/SComponent/c_list.h | 9 +- include/d/d_drawlist.h | 5 + include/d/d_particle.h | 95 +++----- include/f_op/f_op_actor_mng.h | 5 +- include/m_Do/m_Do_ext.h | 1 + src/JSystem/JParticle/JPAEmitterManager.cpp | 172 ++++++++++----- src/d/d_drawlist.cpp | 206 ++++++++++++------ src/d/d_particle.cpp | 87 +++++++- src/f_op/f_op_actor_mng.cpp | 90 ++++---- 17 files changed, 572 insertions(+), 245 deletions(-) create mode 100644 include/JSystem/JParticle/JPAEmitterManager.h diff --git a/include/JSystem/J3DGraphBase/J3DStruct.h b/include/JSystem/J3DGraphBase/J3DStruct.h index 179284835..1d2609ef8 100644 --- a/include/JSystem/J3DGraphBase/J3DStruct.h +++ b/include/JSystem/J3DGraphBase/J3DStruct.h @@ -58,7 +58,24 @@ struct J3DTexMtxInfo { mInfo = other.mInfo; mSRT = other.mSRT; } - void setEffectMtx(Mtx); + void setEffectMtx(Mtx m) { + mEffectMtx[0][0] = m[0][0]; + mEffectMtx[0][1] = m[0][1]; + mEffectMtx[0][2] = m[0][2]; + mEffectMtx[0][3] = m[0][3]; + mEffectMtx[1][0] = m[1][0]; + mEffectMtx[1][1] = m[1][1]; + mEffectMtx[1][2] = m[1][2]; + mEffectMtx[1][3] = m[1][3]; + mEffectMtx[2][0] = m[2][0]; + mEffectMtx[2][1] = m[2][1]; + mEffectMtx[2][2] = m[2][2]; + mEffectMtx[2][3] = m[2][3]; + mEffectMtx[3][2] = 0.0f; + mEffectMtx[3][1] = 0.0f; + mEffectMtx[3][0] = 0.0f; + mEffectMtx[3][3] = 1.0f; + } /* 0x00 */ u8 mProjection; /* 0x01 */ u8 mInfo; diff --git a/include/JSystem/JParticle/JPADraw.h b/include/JSystem/JParticle/JPADraw.h index 032e22ffd..fa93ef08c 100644 --- a/include/JSystem/JParticle/JPADraw.h +++ b/include/JSystem/JParticle/JPADraw.h @@ -34,7 +34,7 @@ class JPADrawContext { class JPADraw { public: enum JPADrawVisitorDefFlags {}; - + void initialize(JPABaseEmitter*, JPATextureResource*); void draw(MtxP); void calc(); @@ -54,7 +54,7 @@ public: void zDrawParticle(); void zDrawChild(); void loadYBBMtx(MtxP); - + /* 0x00 */ JPADrawExecEmitterVisitor* mpExecEmtrVis[1]; /* 0x04 */ JPADrawExecEmitterVisitor* mpExecEmtrPVis[5]; /* 0x18 */ JPADrawExecEmitterVisitor* mpExecEmtrCVis[3]; @@ -77,7 +77,9 @@ public: /* 0xBC */ GXColor mEnvColor; /* 0xC0 */ s16 mTexIdx; /* 0xC2 */ u8 field_0xc2; - /* 0xC3 */ u8 field_0xC3[0xC4 - 0xC3]; + /* 0xC3 */ u8 field_0xc3; }; +STATIC_ASSERT(sizeof(JPADraw) == 0xC4); + #endif /* JPADRAW_H */ diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 3f37f1358..45b1b1ae1 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -113,8 +113,8 @@ public: /* 0x0E0 */ JGeometry::TVec3 mEmitterGlobalCenter; /* 0x0EC */ JGeometry::TVec3 mPublicScale; /* 0x0F8 */ JGeometry::TVec3 mgReRDir; - /* 0x100 */ void* field_0x100; - /* 0x104 */ void* field_0x104; + /* 0x100 */ f32 mFovy; + /* 0x104 */ f32 mAspect; /* 0x10C */ JGeometry::TVec3 mVolumePos; /* 0x118 */ JGeometry::TVec3 mVelOmni; /* 0x124 */ JGeometry::TVec3 mVelAxis; @@ -129,6 +129,8 @@ public: class JPABaseEmitter { public: + JPABaseEmitter(); + typedef void (JPABaseEmitter::*VolumeFunc)(); void calcVolumePoint(); @@ -166,6 +168,9 @@ public: return mActiveParticles.getNumLinks() + mChildParticles.getNumLinks(); } + u8 getGroupID() { return mGroupID; } + u8 getResourceManagerID() { return mResMgrID; } + JPADataBlockLinkInfo * getEmitterDataBlockInfoPtr() const { return mpDataLinkInfo; } bool isEnableDeleteEmitter() { return checkStatus(JPAEmtrStts_EnableDeleteEmitter) && getParticleNumber() == 0; } @@ -204,10 +209,14 @@ public: void setRate(float i_rate) { mRate = i_rate; } void setDirectionalSpeed(float i_speed) { mInitialVelDir = i_speed; } void setAwayFromAxisSpeed(float i_speed) { mInitialVelAxis = i_speed; } + void setAwayFromCenterSpeed(float i_speed) { mInitialVelOmni = i_speed; } void setSpread(float i_spread) { mSpread = i_spread; } void stopCreateParticle() { setStatus(JPAEmtrStts_StopEmit); } + void playCreateParticle() { clearStatus(JPAEmtrStts_StopEmit); } void stopDrawParticle() { setStatus(JPAEmtrStts_StopDraw); } + void playDrawParticle() { clearStatus(JPAEmtrStts_StopDraw); } + bool isDraw() { return !checkStatus(JPAEmtrStts_StopDraw); } void becomeImmortalEmitter() { setStatus(JPAEmtrStts_Immortal); } void quitImmortalEmitter() { clearStatus(JPAEmtrStts_Immortal); } @@ -222,6 +231,11 @@ public: void setParticleCallBackPtr(JPACallBackBase2* callback) { mpParticleCallBack = callback; } + void setParticleList(JSUList* list) { mpPtclVacList = list; } + void setFieldList(JSUList* list) { mFieldManager.mVacList = list; } + JSULink* getLinkBufferPtr() { return &mLink; } + void initDrawMgr(JPATextureResource* texRes) { mDraw.initialize(this, texRes); } + void draw(MtxP cameraMtxP) { mDraw.draw(cameraMtxP); } static JPAEmitterInfo emtrInfo; @@ -256,14 +270,14 @@ public: /* 0x084 */ f32 mVolumeMinRad; /* 0x088 */ s32 mDataFlag; /* 0x08C */ s32 mUseKeyFlag; - /* 0x090 */ JSUPtrLink mLink; + /* 0x090 */ JSULink mLink; /* 0x0A0 */ JPADraw mDraw; /* 0x164 */ f32 mTick; /* 0x168 */ f32 mTime; /* 0x16C */ JPAFieldManager mFieldManager; /* 0x17C */ JSUList mActiveParticles; /* 0x188 */ JSUList mChildParticles; - /* 0x194 */ JSUPtrList* mpPtclVacList; + /* 0x194 */ JSUList* mpPtclVacList; /* 0x198 */ JPADataBlockLinkInfo* mpDataLinkInfo; /* 0x19C */ JPACallBackBase* mpEmitterCallBack; /* 0x1A0 */ JPACallBackBase2* mpParticleCallBack; @@ -280,7 +294,7 @@ public: /* 0x210 */ u32 mUserData; /* 0x214 */ u8 mGroupID; /* 0x215 */ u8 mResMgrID; - /* 0x216 */ u8 field_0x216[0x218 - 0x216]; + /* 0x216 */ u16 field_0x216; }; void JPACallBackBase::init(JPABaseEmitter*) {} diff --git a/include/JSystem/JParticle/JPAEmitterLoader.h b/include/JSystem/JParticle/JPAEmitterLoader.h index 709d289e7..86fd9ca88 100644 --- a/include/JSystem/JParticle/JPAEmitterLoader.h +++ b/include/JSystem/JParticle/JPAEmitterLoader.h @@ -14,7 +14,11 @@ public: }; struct JPAEmitterData { +public: JPAEmitterData() : pLinkInfoArray(NULL) {} + JPADataBlockLinkInfo** getLinkInfo() { return pLinkInfoArray; } + +public: /* 0x00 */ JPADataBlockLinkInfo** pLinkInfoArray; /* 0x04 */ u16 infoNum; /* 0x06 */ u16 userIndex; diff --git a/include/JSystem/JParticle/JPAEmitterManager.h b/include/JSystem/JParticle/JPAEmitterManager.h new file mode 100644 index 000000000..4e13a336f --- /dev/null +++ b/include/JSystem/JParticle/JPAEmitterManager.h @@ -0,0 +1,45 @@ +#ifndef JPAEMITTERMANAGER_H +#define JPAEMITTERMANAGER_H + +#include "JSystem/JGeometry.h" +#include "JSystem/JParticle/JPAEmitter.h" + +class JPABaseEmitter; +class JPABaseParticle; +class JPAResourceManager; +class JKRHeap; + +class JPADrawInfo { +public: + MtxP getCameraMtxPtr() { return mCameraMtxPtr; } + f32 getFovy() { return mFovy; } + f32 getAspect() { return mAspect; } + + /* 0x00 */ MtxP mCameraMtxPtr; + /* 0x04 */ f32 mFovy; + /* 0x08 */ f32 mAspect; +}; + +class JPAEmitterManager { +public: + JPAEmitterManager(JPAResourceManager*, u32, u32, u32, JKRHeap*); + JPABaseEmitter* createSimpleEmitterID(const JGeometry::TVec3&, u16, u8, u8, JPACallBackBase*, JPACallBackBase2*); + void calc(u8); + void draw(JPADrawInfo*, u8); + void deleteEmitter(JPABaseEmitter*); + void forceDeleteEmitter(JPABaseEmitter*); + void forceDeleteAllEmitter(); + void clearResourceManager(u8); + +public: + /* 0x00 */ JSUList mPtclPool; + /* 0x0C */ JSUList mEmtrPool; + /* 0x18 */ JSUList mFieldPool; + /* 0x24 */ u32 mPtclNum; + /* 0x28 */ u32 mEmtrNum; + /* 0x2C */ u32 mFieldNum; + /* 0x30 */ JPAResourceManager * pResMgrArray[8]; + /* 0x50 */ JSUList mEmtrGroup[16]; +}; + +#endif /* JPAEMITTERMANAGER_H */ diff --git a/include/JSystem/JParticle/JPAField.h b/include/JSystem/JParticle/JPAField.h index d7dbe9e52..20580b972 100644 --- a/include/JSystem/JParticle/JPAField.h +++ b/include/JSystem/JParticle/JPAField.h @@ -2,11 +2,13 @@ #define JPAFIELD_H #include "JSystem/JSupport/JSUList.h" +#include "JSystem/JGeometry.h" class JPADataBlockLinkInfo; class JPAEmitterInfo; class JPAFieldData; class JPABaseParticle; +class JPABaseField; class JPAFieldManager { public: @@ -17,8 +19,46 @@ public: void deleteField(JPAFieldData*); void deleteAllField(); - /* 0x00 */ JSUPtrList mList; - /* 0x0C */ JSUPtrList* field_0x0c; +public: + /* 0x00 */ JSUList mList; + /* 0x0C */ JSUList* mVacList; +}; + +class JPAFieldData { +public: + JPAFieldData(); + virtual ~JPAFieldData(); + JSULink* getLinkBufferPtr() { return &mLink; } + +public: + /* 0x04 */ JPABaseField * mpBaseField; + /* 0x08 */ JSULink mLink; + /* 0x18 */ JGeometry::TVec3 mVel; + /* 0x24 */ JGeometry::TVec3 mAirPos; + /* 0x30 */ f32 mAirMinDist; + /* 0x34 */ u32 field_0x34; + /* 0x38 */ u32 field_0x38; + /* 0x3C */ JGeometry::TVec3 mAirDir; + /* 0x48 */ u32 field_0x48; + /* 0x4C */ f32 mFadeOutRate; + /* 0x50 */ f32 mFadeInRate; + /* 0x54 */ JGeometry::TVec3 mPos; + /* 0x60 */ JGeometry::TVec3 mDir; + /* 0x6C */ f32 mMag; + /* 0x70 */ f32 mMagRndm; + /* 0x74 */ f32 mMaxDist; + /* 0x78 */ f32 mVal1; + /* 0x7C */ f32 mVal2; + /* 0x80 */ f32 mVal3; + /* 0x84 */ f32 mFadeIn; + /* 0x88 */ f32 mFadeOut; + /* 0x8C */ f32 mEnTime; + /* 0x90 */ f32 mDisTime; + /* 0x94 */ u16 mSttFlag; + /* 0x96 */ u8 mType; + /* 0x97 */ u8 mID; + /* 0x98 */ u8 mVelType; + /* 0x99 */ u8 mCycle; }; #endif /* JPAFIELD_H */ diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index 0b53a3f7f..0a9feb6e2 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -29,6 +29,7 @@ public: void calcVelocity(); void calcPosition(); bool checkCreateChild(); + JSULink* getLinkBufferPtr() { return &mLink; } ~JPABaseParticle(); JPABaseParticle(); diff --git a/include/JSystem/JParticle/JPAResourceManager.h b/include/JSystem/JParticle/JPAResourceManager.h index 72db5170a..75a006fa9 100644 --- a/include/JSystem/JParticle/JPAResourceManager.h +++ b/include/JSystem/JParticle/JPAResourceManager.h @@ -38,6 +38,8 @@ class JPAResourceManager { public: JPAResourceManager(const void*, JKRHeap*); const ResTIMG* swapTexture(const ResTIMG*, const char*); + JPATextureResource * getTextureResource() { return pTexRes; } + JPAEmitterResource * getEmitterResource() { return pEmtrRes; } public: /* 0x00 */ JKRHeap * pHeap; diff --git a/include/SSystem/SComponent/c_list.h b/include/SSystem/SComponent/c_list.h index 4b7d5d178..4794b75c4 100644 --- a/include/SSystem/SComponent/c_list.h +++ b/include/SSystem/SComponent/c_list.h @@ -1,13 +1,12 @@ #ifndef C_LIST_H #define C_LIST_H - typedef struct node_class node_class; typedef struct node_list_class { - node_class* mpHead; - node_class* mpTail; - int mSize; + /* 0x00 */ node_class* mpHead; + /* 0x04 */ node_class* mpTail; + /* 0x08 */ int mSize; } node_list_class; void cLs_Init(node_list_class* pList); @@ -17,4 +16,6 @@ int cLs_Insert(node_list_class* pList, int idx, node_class* pNode); node_class* cLs_GetFirst(node_list_class* pList); void cLs_Create(node_list_class* pList); +#define LIST_GET_HEAD(pList) (pList->mpHead) + #endif /* C_LIST_H */ diff --git a/include/d/d_drawlist.h b/include/d/d_drawlist.h index 0d1b19a30..5730c6624 100644 --- a/include/d/d_drawlist.h +++ b/include/d/d_drawlist.h @@ -335,6 +335,11 @@ public: struct dDlst_alphaModelPacket : public J3DPacket { public: virtual void draw(); + +public: + /* 0x10 */ u8 mType; + /* 0x11 */ GXColor mColor; + /* 0x18 */ Mtx* mMtxP; }; struct dDlst_alphaVolPacket : public J3DPacket { diff --git a/include/d/d_particle.h b/include/d/d_particle.h index 9d2624bf7..8915f362a 100644 --- a/include/d/d_particle.h +++ b/include/d/d_particle.h @@ -41,16 +41,16 @@ class dPa_followEcallBack : public dPa_levelEcallBack { public: dPa_followEcallBack(u8=0, u8=0); virtual ~dPa_followEcallBack() {} - + virtual void execute(JPABaseEmitter*); virtual void draw(JPABaseEmitter*); virtual void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); virtual void end(); - + JPABaseEmitter* getEmitter() { return mpEmitter; } void setRateOff(u8 param_0) { field_0x11 = param_0; } bool isEnd() { return field_0x10 & 1; } - + /* 0x04 */ JPABaseEmitter* mpEmitter; /* 0x08 */ u8 field_0x08[0x10 - 0x08]; /* 0x10 */ u8 field_0x10; @@ -67,11 +67,11 @@ public: dPa_smokeEcallBack(u8, u8, u8, u8); dPa_smokeEcallBack(const GXColor&, dKy_tevstr_c*, u8); virtual ~dPa_smokeEcallBack() {} - + virtual void draw(JPABaseEmitter*); virtual void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); virtual void end(); - + /* 0x14 */ s8 field_0x14; /* 0x15 */ u8 field_0x15; /* 0x16 */ GXColor field_0x16; @@ -167,7 +167,7 @@ class dPa_rippleEcallBack : public dPa_levelEcallBack { public: dPa_rippleEcallBack() { mpBaseEmitter = NULL; } virtual ~dPa_rippleEcallBack() {} - + void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); void end(); void execute(JPABaseEmitter*); @@ -181,10 +181,8 @@ public: /* 0x10 */ f32 mRate; }; -class dPa_modelEmitter_c { +class dPa_modelEmitter_c : public node_class { public: - u8 temp[0xC]; - dPa_modelEmitter_c(); virtual ~dPa_modelEmitter_c() {} }; @@ -195,23 +193,27 @@ 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); virtual ~dPa_J3DmodelEmitter_c(); - + virtual void draw(); }; class dPa_J3Dmodel_c { public: dPa_J3Dmodel_c(); + +public: + /* 0x00 */ u8 mInit; + /* 0x04 */ J3DModel* mModel; }; class dPa_smokePcallBack : public JPACallBackBase2 { public: dPa_smokePcallBack(); virtual ~dPa_smokePcallBack() {} - + virtual void execute(JPABaseEmitter*, JPABaseParticle*); virtual void draw(JPABaseEmitter*, JPABaseParticle*); }; @@ -220,7 +222,7 @@ class dPa_selectTexEcallBack : public dPa_levelEcallBack { public: dPa_selectTexEcallBack(); virtual ~dPa_selectTexEcallBack() {} - + virtual void draw(JPABaseEmitter*); virtual void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8); }; @@ -229,7 +231,7 @@ class dPa_windPcallBack : public JPACallBackBase2 { public: dPa_kageroEcallBack(); virtual ~dPa_kageroEcallBack() {} - + virtual void draw(JPABaseEmitter*); }; @@ -288,7 +290,7 @@ class dPa_bombSmokeEcallBack : public dPa_levelEcallBack { public: dPa_bombSmokeEcallBack(); virtual ~dPa_bombSmokeEcallBack() {} - + virtual void execute(JPABaseEmitter*); virtual void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8); }; @@ -297,7 +299,7 @@ class dPa_setColorEcallBack : public dPa_levelEcallBack { public: dPa_setColorEcallBack(); virtual ~dPa_setColorEcallBack() {} - + virtual void draw(JPABaseEmitter*); virtual void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8); @@ -305,53 +307,22 @@ public: /* 0x04 */ GXColor mColor; }; // Size: 0x08 -class dPa_modelControl_c { +class dPa_modelControl_c : public node_list_class { public: dPa_modelControl_c(J3DModelData*); ~dPa_modelControl_c(); - void newModel(J3DModelData*); + static J3DModel * newModel(J3DModelData*); void draw(); - /* 0x00 */ node_list_class parent; - /* 0x0C */ void* field_0x0c; - /* 0x10 */ void* field_0x10; - /* 0x14 */ void* field_0x14; - /* 0x18 */ void* field_0x18; - /* 0x1C */ void* field_0x1c; - /* 0x20 */ void* field_0x20; - /* 0x24 */ void* field_0x24; - /* 0x28 */ void* field_0x28; - /* 0x2C */ void* field_0x2c; - /* 0x30 */ void* field_0x30; - /* 0x34 */ void* field_0x34; - /* 0x38 */ void* field_0x38; - /* 0x3C */ void* field_0x3c; - /* 0x40 */ void* field_0x40; - /* 0x44 */ void* field_0x44; - /* 0x48 */ void* field_0x48; - /* 0x4C */ void* field_0x4c; - /* 0x50 */ void* field_0x50; - /* 0x54 */ void* field_0x54; - /* 0x58 */ void* field_0x58; - /* 0x5C */ void* field_0x5c; - /* 0x60 */ void* field_0x60; - /* 0x64 */ void* field_0x64; - /* 0x68 */ void* field_0x68; - /* 0x6C */ void* field_0x6c; - /* 0x70 */ void* field_0x70; - /* 0x74 */ void* field_0x74; - /* 0x78 */ void* field_0x78; - /* 0x7C */ void* field_0x7c; - /* 0x80 */ void* field_0x80; - // /* 0x84 */ J3DVertexData mVertexData; + static dPa_J3Dmodel_c * mModel; }; class dPa_control_c { public: dPa_control_c(); - void getRM_ID(u16); + static u16 getRM_ID(u16); void swapFrameBufferTexture(); void createCommon(void const*); void createRoomScene(void const*); @@ -434,16 +405,18 @@ public: return set(5, particleID, pos, angle, scale, alpha, &mSingleRippleEcallBack, -1, NULL, NULL, NULL); } - + void drawModelParticle() { mModelCtrl->draw(); } - JKRHeap * getHeap() { return mpHeap; } - + JKRHeap * getHeap() { return mHeap; } + static dPa_setColorEcallBack* getLifeBallSetColorEcallBack(int idx) { return &mLifeBall[idx]; } - + static dPa_rippleEcallBack mSingleRippleEcallBack; static dPa_setColorEcallBack mLifeBall[3]; - /* 0x0000 */ JKRHeap* mpHeap; + static JPAEmitterManager * mEmitterMng; + + /* 0x0000 */ JKRHeap* mHeap; /* 0x0004 */ JPAResourceManager* mpCommonResMgr; /* 0x0008 */ dPa_modelControl_c* mModelCtrl; /* 0x000C */ JKRHeap* mpSceneHeap; diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 17252f7e0..5117ee8d6 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -16,6 +16,7 @@ class J3DModelData; // placeholder class JKRHeap; class cM3dGPla; +class daItem_c; struct fopAcM_prmBase_class { /* 0x00 */ u32 field_0x00; @@ -463,9 +464,7 @@ s32 fopAcM_createDemoItem(cXyz* p_pos, int itemNo, int itemBitNo, csXyz* p_angle s32 fopAcM_createItemForBoss(cXyz* p_pos, int param_2, int roomNo, csXyz* p_angle, cXyz* p_scale, int param_8); -void* fopAcM_createItemForSimpleDemo(cXyz* p_pos, int i_itemNo, int i_roomNo, - csXyz* p_angle, cXyz* p_scale, f32 speedF, - f32 speedY); +daItem_c* fopAcM_createItemForSimpleDemo(cXyz* p_pos, int i_itemNo, int i_roomNo, csXyz* p_angle, cXyz* p_scale, f32 speedF, f32 speedY); s32 fopAcM_createItem(cXyz* p_pos, int itemNo, int param_3, int roomNo, int type, csXyz* p_angle, int action, cXyz* p_scale); diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index ba4d04499..c8c4cd954 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -615,6 +615,7 @@ s32 mDoExt_resIDToIndex(JKRArchive*, u16); JKRSolidHeap * mDoExt_createSolidHeapFromGameToCurrent(u32 size, u32 align); JKRSolidHeap * mDoExt_createSolidHeapToCurrent(u32, JKRHeap *, u32 align); +JKRSolidHeap * mDoExt_createSolidHeapFromSystem(u32 i_size, u32 i_alignment); void mDoExt_restoreCurrentHeap(); s32 mDoExt_adjustSolidHeap(JKRSolidHeap * pHeap); void mDoExt_destroySolidHeap(JKRSolidHeap * pHeap); diff --git a/src/JSystem/JParticle/JPAEmitterManager.cpp b/src/JSystem/JParticle/JPAEmitterManager.cpp index f82e8ea77..ef909b52a 100644 --- a/src/JSystem/JParticle/JPAEmitterManager.cpp +++ b/src/JSystem/JParticle/JPAEmitterManager.cpp @@ -4,84 +4,150 @@ // #include "JSystem/JParticle/JPAEmitterManager.h" -#include "dolphin/types.h" +#include "JSystem/JParticle/JPAEmitterLoader.h" +#include "JSystem/JParticle/JPAResourceManager.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" /* 8025EE44-8025F0E4 .text __ct__17JPAEmitterManagerFP18JPAResourceManagerUlUlUlP7JKRHeap */ -JPAEmitterManager::JPAEmitterManager(JPAResourceManager*, unsigned long, unsigned long, unsigned long, JKRHeap*) { - /* Nonmatching */ +JPAEmitterManager::JPAEmitterManager(JPAResourceManager* resMgr, u32 ptclNum, u32 emtrNum, u32 fieldNum, JKRHeap* heap) { + heap = heap != NULL ? heap : JKRHeap::getCurrentHeap(); + mPtclNum = ptclNum; + mEmtrNum = emtrNum; + mFieldNum = fieldNum; + pResMgrArray[0] = resMgr; + + for (u32 i = 1; i < 8; i++) + pResMgrArray[i] = 0; + + JPABaseParticle* pPtclArray = new(heap, 0) JPABaseParticle[mPtclNum]; + JUT_ASSERT(0x2e, pPtclArray); + for (u32 i = 0; i < mPtclNum; i++) { + JPABaseParticle* ptcl = &pPtclArray[i]; + mPtclPool.prepend(ptcl->getLinkBufferPtr()); + } + + JPABaseEmitter* pEmtrArray = new(heap, 0) JPABaseEmitter[mEmtrNum]; + JUT_ASSERT(0x35, pEmtrArray); + for (u32 i = 0; i < mEmtrNum; i++) { + JPABaseEmitter* emtr = &pEmtrArray[i]; + emtr->setParticleList(&mPtclPool); + emtr->setFieldList(&mFieldPool); + mEmtrPool.prepend(emtr->getLinkBufferPtr()); + } + + JPAFieldData* pFieldArray = new(heap, 0) JPAFieldData[mFieldNum]; + JUT_ASSERT(0x3e, pFieldArray); + for (u32 i = 0; i < mFieldNum; i++) { + JPAFieldData* field = &pFieldArray[i]; + mFieldPool.prepend(field->getLinkBufferPtr()); + } } /* 8025F0E4-8025F2F4 .text createSimpleEmitterID__17JPAEmitterManagerFRCQ29JGeometry8TVec3UsUcUcP34JPACallBackBaseP54JPACallBackBase2 */ -void JPAEmitterManager::createSimpleEmitterID(const JGeometry::TVec3&, unsigned short, unsigned char, unsigned char, JPACallBackBase*, JPACallBackBase2*) { +JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(const JGeometry::TVec3& pos, u16 userID, u8 groupID, u8 rmID, JPACallBackBase* pEmtrCallBack, JPACallBackBase2* pPtclCallBack) { /* Nonmatching */ + JUT_ASSERT(0x56, groupID < 16); + JUT_ASSERT(0x57, rmID < 8); + JUT_ASSERT(0x58, pResMgrArray[rmID] != 0); + + JPABaseEmitter* emtr; + JPAEmitterData* emtrData; + JPAResourceManager* resMgr; + + emtr = NULL; + resMgr = pResMgrArray[rmID]; + emtrData = resMgr->getEmitterResource()->getByUserIndex(userID); + + if (emtrData == NULL) { + JUT_WARN(98, "%s", "JParticle::Couldn't Create Emitter!"); + JUT_WARN(99, "%s", "User Index Number specification has mistaken."); + JUT_WARN(100, "Group ID (%d),EmitterManagerPtr(%x)", groupID, resMgr); + } else if (mEmtrPool.getNumLinks() != 0) { + emtr = mEmtrPool.getFirst()->getObject(); + mEmtrPool.remove(emtr->getLinkBufferPtr()); + mEmtrGroup[groupID].append(emtr->getLinkBufferPtr()); + emtr->create(emtrData->getLinkInfo()[0]); + emtr->initDrawMgr(pResMgrArray[rmID]->getTextureResource()); + emtr->setEmitterCallBackPtr(pEmtrCallBack); + emtr->setParticleCallBackPtr(pPtclCallBack); + emtr->mGroupID = groupID; + emtr->mResMgrID = rmID; + emtr->mGlobalTranslation.set(pos); + } + + return emtr; } /* 8025F2F4-8025F3C4 .text calc__17JPAEmitterManagerFUc */ -void JPAEmitterManager::calc(unsigned char) { - /* Nonmatching */ +void JPAEmitterManager::calc(u8 groupID) { + JUT_ASSERT(0xbb, groupID < 16); + for (JSULink* link = mEmtrGroup[groupID].getFirst(); link != NULL;) { + JSULink* next = link->getNext(); + JPABaseEmitter *emtr = link->getObject(); + bool started = emtr->doStartFrameProcess(); + if (started) { + if (emtr->doTerminationProcess()) + deleteEmitter(emtr); + else + emtr->calc(); + } + link = next; + } } /* 8025F3C4-8025F494 .text draw__17JPAEmitterManagerFP11JPADrawInfoUc */ -void JPAEmitterManager::draw(JPADrawInfo*, unsigned char) { - /* Nonmatching */ +void JPAEmitterManager::draw(JPADrawInfo* drawInfo, u8 groupID) { + JUT_ASSERT(0xde, groupID < 16); + JPABaseEmitter::emtrInfo.mFovy = drawInfo->getFovy(); + JPABaseEmitter::emtrInfo.mAspect = drawInfo->getAspect(); + for (JSULink* link = mEmtrGroup[groupID].getFirst(); link != NULL; link = link->getNext()) { + JPABaseEmitter *emtr = link->getObject(); + if (emtr->isDraw()) { + emtr->calcgReRDirection(); + emtr->draw(drawInfo->getCameraMtxPtr()); + } + } } /* 8025F494-8025F4F4 .text deleteEmitter__17JPAEmitterManagerFP14JPABaseEmitter */ -void JPAEmitterManager::deleteEmitter(JPABaseEmitter*) { - /* Nonmatching */ +void JPAEmitterManager::deleteEmitter(JPABaseEmitter* emtr) { + emtr->mFieldManager.deleteAllField(); + mEmtrGroup[emtr->getGroupID()].remove(emtr->getLinkBufferPtr()); + mEmtrPool.prepend(emtr->getLinkBufferPtr()); } /* 8025F4F4-8025F53C .text forceDeleteEmitter__17JPAEmitterManagerFP14JPABaseEmitter */ -void JPAEmitterManager::forceDeleteEmitter(JPABaseEmitter*) { - /* Nonmatching */ +void JPAEmitterManager::forceDeleteEmitter(JPABaseEmitter* emtr) { + emtr->deleteAllParticle(); + deleteEmitter(emtr); } /* 8025F53C-8025F5B4 .text forceDeleteAllEmitter__17JPAEmitterManagerFv */ void JPAEmitterManager::forceDeleteAllEmitter() { /* Nonmatching */ + for (u32 i = 0; i < 16; i++) { + for (JSULink* link = mEmtrGroup[i].getFirst(); link != NULL;) { + JSULink* next = link->getNext(); + JPABaseEmitter* emtr = link->getObject(); + forceDeleteEmitter(emtr); + link = next; + } + } } /* 8025F5B4-8025F68C .text clearResourceManager__17JPAEmitterManagerFUc */ -void JPAEmitterManager::clearResourceManager(unsigned char) { - /* Nonmatching */ -} - -/* 8025F68C-8025F6F8 .text __dt__12JPAFieldDataFv */ -JPAFieldData::~JPAFieldData() { - /* Nonmatching */ -} - -/* 8025F6F8-8025F73C .text __ct__12JPAFieldDataFv */ -JPAFieldData::JPAFieldData() { - /* Nonmatching */ -} - -/* 8025F73C-8025F7E0 .text __dt__14JPABaseEmitterFv */ -JPABaseEmitter::~JPABaseEmitter() { - /* Nonmatching */ -} - -/* 8025F7E0-8025F848 .text __ct__14JPABaseEmitterFv */ -JPABaseEmitter::JPABaseEmitter() { - /* Nonmatching */ -} - -/* 8025F848-8025F8A0 .text __dt__15JPABaseParticleFv */ -JPABaseParticle::~JPABaseParticle() { - /* Nonmatching */ -} - -/* 8025F8A0-8025F8DC .text __ct__15JPABaseParticleFv */ -JPABaseParticle::JPABaseParticle() { - /* Nonmatching */ -} - -/* 8025F8DC-8025F90C .text __ct__25JSUList<14JPABaseEmitter>Fv */ -JSUList::JSUList() { - /* Nonmatching */ -} - -/* 8025F90C-8025F960 .text __dt__25JSUList<14JPABaseEmitter>Fv */ -JSUList::~JSUList() { +void JPAEmitterManager::clearResourceManager(u8 rmID) { /* Nonmatching */ + JUT_ASSERT(0x14b, rmID < 8); + for (u32 i = 0; i < 16; i++) { + for (JSULink* link = mEmtrGroup[i].getFirst(); link != NULL;) { + JSULink* next = link->getNext(); + JPABaseEmitter* emtr = link->getObject(); + if (emtr->getResourceManagerID() == rmID) + forceDeleteEmitter(emtr); + link = next; + } + } + pResMgrArray[rmID] = NULL; } diff --git a/src/d/d_drawlist.cpp b/src/d/d_drawlist.cpp index 52dfe7eb5..57ca2c8a4 100644 --- a/src/d/d_drawlist.cpp +++ b/src/d/d_drawlist.cpp @@ -5,6 +5,8 @@ #include "d/d_drawlist.h" #include "d/d_com_inf_game.h" +#include "d/d_kankyo_rain.h" +#include "f_op/f_op_camera_mng.h" #include "m_Do/m_Do_lib.h" #include "m_Do/m_Do_mtx.h" #include "JSystem/JKernel/JKRHeap.h" @@ -21,6 +23,9 @@ f32 dDlst_list_c::mWipeSpeed = 0.0f; GXColor dDlst_list_c::mWipeColor = { 0, 0, 0, 0 }; dDlst_2DT2_c dDlst_list_c::mWipeDlst; +static Vec dummy1 = { 1.0f, 1.0f, 1.0f }; +static Vec dummy2 = { 1.0f, 1.0f, 1.0f }; + /* 800804A4-800804C0 .text setViewPort__14dDlst_window_cFffffff */ void dDlst_window_c::setViewPort(f32 x, f32 y, f32 w, f32 h, f32 n, f32 f) { mViewport.mXOrig = x; @@ -83,12 +88,12 @@ void dDlst_2DT2_c::draw() { GXSetNumTevStages(1); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO); - GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1,true, GX_TEVPREV); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); if (mAlpha) GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0); else GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); - GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1,true, GX_TEVPREV); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXSetZCompLoc(0); GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE); GXSetBlendMode(GX_BM_NONE, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_CLEAR); @@ -474,21 +479,21 @@ extern void GFSetVtxAttrFmtv(GXVtxFmt, GXVtxAttrFmtList*); extern void GFSetBlendModeEtc(GXBlendMode, GXBlendFactor, GXBlendFactor, GXLogicOp, u8, u8, u8); extern void GFSetArray(GXAttr, void*, u8); -char l_backRevZMat[0x40] = {}; -char l_frontZMat[0x20] = {}; -char l_frontNoZSubMat[0x20] = {}; +char l_backRevZMat[0x41] __attribute__((aligned(32))) = {}; +char l_frontZMat[0x3c] __attribute__((aligned(32))) = {}; +char l_frontNoZSubMat[0x2a] __attribute__((aligned(32))) = {}; Vec l_bonboriPos[0x2a] = {}; -char l_bonboriDL[0xa0] = {}; +char l_bonboriDL[0xa7] __attribute__((aligned(32))) = {}; -Vec l_beam_checkPos[0x10] = {}; -char l_beam_checkDL[0xe0] = {}; +Vec l_s_beam_checkPos[0x28] = {}; +char l_s_beam_checkDL[0xf8] __attribute__((aligned(32))) = {}; -Vec l_cubePos[0x10] = {}; -char l_cubeDL[0xe0] = {}; +Vec l_cubePos[0x08] = {}; +char l_cubeDL[0x4a] __attribute__((aligned(32))) = {}; -Vec l_bonbori2Pos[0x2a] = {}; -char l_bonbori2DL[0xa0] = {}; +Vec l_bonbori2Pos[0x56] = {}; +char l_bonbori2DL[0x2a8] __attribute__((aligned(32))) = {}; /* 80082838-80082E44 .text draw__22dDlst_alphaModelData_cFPA4_f */ void dDlst_alphaModelData_c::draw(Mtx viewMtx) { @@ -505,12 +510,12 @@ void dDlst_alphaModelData_c::draw(Mtx viewMtx) { if (mType == 0) { /* Bonbori */ GFSetArray(GX_VA_POS, l_bonboriPos, sizeof(*l_bonboriPos)); - GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); - GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); - GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_backRevZMat, 0x40); + GXCallDisplayList(l_bonboriDL, 0xa0); + GXCallDisplayList(l_frontZMat, 0x20); + GXCallDisplayList(l_bonboriDL, 0xa0); + GXCallDisplayList(l_frontNoZSubMat, 0x20); + GXCallDisplayList(l_bonboriDL, 0xa0); } else if (mType == 1) { /* Bonborix2 */ GFSetArray(GX_VA_POS, l_bonboriPos, sizeof(*l_bonboriPos)); @@ -519,22 +524,22 @@ void dDlst_alphaModelData_c::draw(Mtx viewMtx) { MTXConcat(mtx, tmp, tmp); GFLoadPosMtxImm(tmp, GX_PNMTX1); - GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_backRevZMat, 0x40); + GXCallDisplayList(l_bonboriDL, 0xa0); GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); - GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); + GXCallDisplayList(l_frontZMat, 0x20); GFSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); - GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); + GXCallDisplayList(l_frontNoZSubMat, 0x20); GFSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); } else if (mType == 5) { /* Bonborix3 */ GFSetArray(GX_VA_POS, l_bonboriPos, sizeof(*l_bonboriPos)); @@ -547,53 +552,53 @@ void dDlst_alphaModelData_c::draw(Mtx viewMtx) { MTXConcat(mtx, tmp, tmp); GFLoadPosMtxImm(tmp, GX_PNMTX2); - GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_backRevZMat, 0x40); + GXCallDisplayList(l_bonboriDL, 0xa0); GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); GFSetCurrentMtx(GX_PNMTX2, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); - GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); + GXCallDisplayList(l_frontZMat, 0x20); GFSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); GFSetCurrentMtx(GX_PNMTX2, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); - GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); + GXCallDisplayList(l_frontNoZSubMat, 0x20); GFSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); GFSetCurrentMtx(GX_PNMTX2, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); - GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_bonboriDL, 0xa0); } else if (mType == 2) { /* BeamCheck */ - GFSetArray(GX_VA_POS, l_beam_checkPos, sizeof(*l_beam_checkPos)); - GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); - GXCallDisplayList(l_beam_checkDL, sizeof(l_beam_checkDL)); - GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); - GXCallDisplayList(l_beam_checkDL, sizeof(l_beam_checkDL)); - GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); - GXCallDisplayList(l_beam_checkDL, sizeof(l_beam_checkDL)); + GFSetArray(GX_VA_POS, l_s_beam_checkPos, sizeof(*l_s_beam_checkPos)); + GXCallDisplayList(l_backRevZMat, 0x40); + GXCallDisplayList(l_s_beam_checkDL, 0xe0); + GXCallDisplayList(l_frontZMat, 0x20); + GXCallDisplayList(l_s_beam_checkDL, 0xe0); + GXCallDisplayList(l_frontNoZSubMat, 0x20); + GXCallDisplayList(l_s_beam_checkDL, 0xe0); } else if (mType == 3) { /* Cube */ /* BeamCheck */ GFSetArray(GX_VA_POS, l_cubePos, sizeof(*l_cubePos)); - GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); - GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); - GXCallDisplayList(l_cubeDL, sizeof(l_cubeDL)); + GXCallDisplayList(l_backRevZMat, 0x40); + GXCallDisplayList(l_frontZMat, 0x20); + GXCallDisplayList(l_cubeDL, 0xe0); } else if (mType == 4) { /* Bonbori2 */ GFSetArray(GX_VA_POS, l_bonbori2Pos, sizeof(*l_bonbori2Pos)); - GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); - GXCallDisplayList(l_bonbori2DL, sizeof(l_bonbori2DL)); - GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); - GXCallDisplayList(l_bonbori2DL, sizeof(l_bonbori2DL)); - GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); - GXCallDisplayList(l_bonbori2DL, sizeof(l_bonbori2DL)); + GXCallDisplayList(l_backRevZMat, 0x40); + GXCallDisplayList(l_bonbori2DL, 0x2a0); + GXCallDisplayList(l_frontZMat, 0x20); + GXCallDisplayList(l_bonbori2DL, 0x2a0); + GXCallDisplayList(l_frontNoZSubMat, 0x20); + GXCallDisplayList(l_bonbori2DL, 0x2a0); } } @@ -623,17 +628,20 @@ dDlst_alphaModel_c * dDlst_alphaModel_c::create(int num) { /* 80082EFC-80082F38 .text __dt__22dDlst_alphaModelData_cFv */ dDlst_alphaModelData_c::~dDlst_alphaModelData_c() { - /* Nonmatching */ } /* 80082F38-80082F3C .text __ct__22dDlst_alphaModelData_cFv */ dDlst_alphaModelData_c::dDlst_alphaModelData_c() { - /* Nonmatching */ } /* 80082F3C-80082F9C .text set__18dDlst_alphaModel_cFUcPA4_fUc */ BOOL dDlst_alphaModel_c::set(u8 type, Mtx mtx, u8 alpha) { - /* Nonmatching */ + if (mNum >= mCapacity) + return FALSE; + + mpData[mNum].set(type, mtx, alpha); + mNum++; + return TRUE; } /* 80082F9C-80083064 .text draw__18dDlst_alphaModel_cFPA4_f */ @@ -641,7 +649,7 @@ BOOL dDlst_alphaModel_c::draw(Mtx mtx) { if (mNum == 0) return FALSE; - static char l_matDL[0x60] = {}; + static char l_matDL[0x64] __attribute__((aligned(32))) = {}; static GXVtxDescList l_vtxDescList[2] = { }; @@ -649,7 +657,7 @@ BOOL dDlst_alphaModel_c::draw(Mtx mtx) { static GXVtxAttrFmtList l_vtxAttrFmtList[2] = { }; - GXCallDisplayList(l_matDL, sizeof(l_matDL)); + GXCallDisplayList(l_matDL, 0x60); GFSetVtxDescv(l_vtxDescList); GFSetVtxAttrFmtv(GX_VTXFMT0, l_vtxAttrFmtList); GXSetClipMode(GX_CLIP_ENABLE); @@ -705,6 +713,43 @@ char l_shadowVolumeDL[] = { /* 80083064-800832C4 .text draw__22dDlst_alphaModelPacketFv */ void dDlst_alphaModelPacket::draw() { /* Nonmatching */ + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE); + GXSetChanMatColor(GX_COLOR0A0, mColor); + GXSetNumTexGens(0); + GXSetNumTevStages(1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_RASA); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetZCompLoc(GX_TRUE); + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_CLEAR); + GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); + GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor); + GXSetCullMode(GX_CULL_FRONT); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX8); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + Mtx mtx; + MTXConcat(j3dSys.getViewMtx(), *mMtxP, mtx); + GXLoadPosMtxImm(mtx, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + + if (mType == 0) { + GXSetArray(GX_VA_POS, l_bonboriPos, sizeof(*l_bonboriPos)); + GXCallDisplayList(l_bonboriDL, 0xa0); + } else if (mType == 1) { + GXSetArray(GX_VA_POS, l_bonboriPos, sizeof(*l_bonboriPos)); + GXCallDisplayList(l_bonboriDL, 0xa0); + } else if (mType == 2) { + GXSetArray(GX_VA_POS, l_s_beam_checkPos, sizeof(*l_s_beam_checkPos)); + GXCallDisplayList(l_s_beam_checkDL, 0xe0); + } else if (mType == 3) { + GXSetArray(GX_VA_POS, l_cubePos, sizeof(*l_cubePos)); + GXCallDisplayList(l_cubeDL, 0x40); + } } /* 800832C4-800833CC .text set__18dDlst_shadowPoly_cFP10cBgD_Vtx_tUsUsUsP8cM3dGPla */ @@ -1194,11 +1239,46 @@ void dDlst_list_c::calcWipe() { mWipeDlst.mScrollS = mWipeRate * 2.0f; mWipeDlst.mScrollT = mWipeDlst.mScrollS * 1.218f; - set2DXlu(&mWipeDlst); + dComIfGd_set2DXlu(&mWipeDlst); } } +camera_class * dCam_getCamera(); + /* 80086790-8008696C .text dDlst_texSpecmapST__FPC4cXyzPC12dKy_tevstr_cP12J3DModelDataf */ -void dDlst_texSpecmapST(const cXyz*, const dKy_tevstr_c*, J3DModelData*, f32) { - /* Nonmatching */ +void dDlst_texSpecmapST(const cXyz* pos, const dKy_tevstr_c* tevStr, J3DModelData* modelData, f32 scale) { + static Mtx mtx_adj = { + 0.5f, 0.0f, 0.0f, 0.5f, + 0.0f, -0.5f, 0.0f, 0.5f, + 0.0f, 0.0f, 1.0f, 0.0f, + }; + + f32 inv = 1.0f / scale; + camera_class * camera = dCam_getCamera(); + cXyz lookDir = *pos - camera->mLookat.mEye; + cXyz refl; + cXyz lightDir; + + dKyr_get_vectle_calc((cXyz*)&tevStr->mLightPosWorld, (cXyz*)pos, &lightDir); + + C_VECHalfAngle(&lookDir, &lightDir, &refl); + Mtx reflMtx, effMtx; + C_MTXLookAt(reflMtx, &cXyz::Zero, &cXyz::BaseY, &refl); + MTXScale(effMtx, inv, inv, 1.0f); + MTXConcat(effMtx, mtx_adj, effMtx); + MTXConcat(effMtx, reflMtx, effMtx); + effMtx[0][3] = 0.0f; + effMtx[1][3] = 0.0f; + effMtx[2][3] = 0.0f; + + s32 materialNum = modelData->getMaterialNum(); + for (s32 i = 0; i < materialNum; i++) { + J3DMaterial* mat = modelData->getMaterialNodePointer(i); + for (s32 j = 0; j < 8; j++) { + J3DTexMtx* texMtx = mat->getTexMtx(j); + if (texMtx != NULL && texMtx->getTexMtxInfo().mInfo == 10) { + texMtx->getTexMtxInfo().setEffectMtx(effMtx); + } + } + } } diff --git a/src/d/d_particle.cpp b/src/d/d_particle.cpp index ed4be8356..af4528fc9 100644 --- a/src/d/d_particle.cpp +++ b/src/d/d_particle.cpp @@ -4,11 +4,16 @@ // #include "d/d_particle.h" -#include "dolphin/types.h" +#include "JSystem/JParticle/JPAParticle.h" +#include "JSystem/JParticle/JPAEmitter.h" +#include "JSystem/JParticle/JPAEmitterManager.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "SSystem/SComponent/c_malloc.h" /* 8007A4D8-8007A514 .text __ct__18dPa_modelEmitter_cFv */ dPa_modelEmitter_c::dPa_modelEmitter_c() { - /* Nonmatching */ + cNd_ForcedClear(this); } /* 8007A514-8007A804 .text __ct__21dPa_J3DmodelEmitter_cFP14JPABaseEmitterP12J3DModelDataR12dKy_tevstr_cP16J3DAnmTexPatternUsi */ @@ -29,19 +34,28 @@ void dPa_J3DmodelEmitter_c::draw() { } /* 8007ADC4-8007AECC .text __ct__18dPa_modelControl_cFP12J3DModelData */ -dPa_modelControl_c::dPa_modelControl_c(J3DModelData*) { - /* Nonmatching */ +dPa_modelControl_c::dPa_modelControl_c(J3DModelData* modelData) { + mModel = new dPa_J3Dmodel_c[0x80]; + JUT_ASSERT(0x10f, mModel != 0); + + dPa_J3Dmodel_c * model = mModel; + for (s32 i = 0; i < 0x80; i++, model++) { + model->mModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x37221223); + JUT_ASSERT(0x120, model->mModel != 0); + } + + cLs_Create(this); } /* 8007AECC-8007AED8 .text __ct__14dPa_J3Dmodel_cFv */ dPa_J3Dmodel_c::dPa_J3Dmodel_c() { - /* Nonmatching */ + mInit = 0; } /* 8007AED8-8007AF64 .text __dt__18dPa_modelControl_cFv */ dPa_modelControl_c::~dPa_modelControl_c() { /* Nonmatching (node_class has no virtual destructor) */ - node_class* node = parent.mpHead; + node_class* node = mpHead; while (node) { node_class* nextNode = node->mpNextNode; cLs_SingleCut(node); @@ -50,14 +64,56 @@ dPa_modelControl_c::~dPa_modelControl_c() { } } +dPa_J3Dmodel_c * dPa_modelControl_c::mModel; + /* 8007AF64-8007B074 .text newModel__18dPa_modelControl_cFP12J3DModelData */ -void dPa_modelControl_c::newModel(J3DModelData*) { - /* Nonmatching */ +J3DModel * dPa_modelControl_c::newModel(J3DModelData* modelData) { + dPa_J3Dmodel_c * model = mModel; + for (s32 i = 0; i < 0x80; i++, model++) { + if (model->mInit == 0) { + model->mInit = 1; + J3DModel * j3dmodel = model->mModel; + j3dmodel->mModelData = modelData; + + J3DShapePacket * shapePacket = j3dmodel->getShapePacket(0); + for (u16 j = 0; j < modelData->getShapeNum(); shapePacket++, j++) { + shapePacket->setShape(modelData->getShapeNodePointer(j)); + } + + J3DMatPacket * matPacket = j3dmodel->getMatPacket(0); + for (u16 j = 0; j < modelData->getMaterialNum(); matPacket++, j++) { + J3DMaterial* mat = modelData->getMaterialNodePointer(j); + matPacket->setMaterial(mat); + J3DShapePacket * shapePacket = j3dmodel->getShapePacket(mat->getShape()->getIndex()); + matPacket->setInitShapePacket(shapePacket); + matPacket->addShapePacket(shapePacket); + matPacket->setTexture(modelData->getTexture()); + matPacket->setDisplayListObj(mat->getSharedDisplayListObj()); + } + + j3dmodel->mVertexBuffer.setVertexData(&modelData->getVertexData()); + return model->mModel; + } + } + + return NULL; } /* 8007B074-8007B158 .text draw__18dPa_modelControl_cFv */ void dPa_modelControl_c::draw() { /* Nonmatching */ + for (u32 i = 0; i < 0x80; i++) + mModel[i].mInit = 0; + + dKy_GxFog_set(); + + for (node_class * nd = LIST_GET_HEAD(this); nd != NULL;) { + node_class* pNext = NODE_GET_NEXT(nd); + + // TODO + + nd = pNext; + } } /* 8007B158-8007B194 .text __ct__19dPa_followEcallBackFUcUc */ @@ -186,14 +242,23 @@ void dPa_windPcallBack::execute(JPABaseEmitter*, JPABaseParticle*) { /* Nonmatching */ } +JPAEmitterManager * dPa_control_c::mEmitterMng; + /* 8007C8E8-8007C9A4 .text __ct__13dPa_control_cFv */ dPa_control_c::dPa_control_c() { - /* Nonmatching */ + mHeap = mDoExt_createSolidHeapFromSystem(0x16e800, 0); + JUT_ASSERT(0x4d8, mHeap != 0); + mSceneNo = 0xFF; + mCount = 0; + mEmitterMng = NULL; + mNumSimple = 0; + mpCommonResMgr = NULL; + mpSceneResMgr = NULL; } /* 8007CA28-8007CA30 .text getRM_ID__13dPa_control_cFUs */ -void dPa_control_c::getRM_ID(u16) { - /* Nonmatching */ +u16 dPa_control_c::getRM_ID(u16 uid) { + return (uid >> 15) & 0x01; } /* 8007CA30-8007CA98 .text swapFrameBufferTexture__13dPa_control_cFv */ diff --git a/src/f_op/f_op_actor_mng.cpp b/src/f_op/f_op_actor_mng.cpp index 60fca4a0b..fec0ae34d 100644 --- a/src/f_op/f_op_actor_mng.cpp +++ b/src/f_op/f_op_actor_mng.cpp @@ -575,18 +575,18 @@ s32 fopAcM_cullingCheck(fopAc_ac_c* i_this) { cMtx_concat(j3dSys.getViewMtx(), i_this->mCullMtx, mtx); pMtx = mtx; } - + f32 cullFar = i_this->mCullSizeFar; if (dComIfGp_event_runCheck()) { cullFar *= dComIfGp_event_getCullRate(); } - + int cullType = i_this->mCullType; bool isBox = false; if ((cullType >= 0 && cullType < fopAc_CULLBOX_CUSTOM_e) || cullType == fopAc_CULLBOX_CUSTOM_e) { isBox = true; } - + if (isBox) { if (cullType == fopAc_CULLBOX_CUSTOM_e) { if (i_this->mCullSizeFar > 0.0f) { @@ -781,42 +781,42 @@ fopAc_ac_c* fopAcM_getEventPartner(fopAc_ac_c* i_this) { /* 80026118-800261E8 .text fopAcM_createItemForPresentDemo__FP4cXyziUciiP5csXyzP4cXyz */ s32 fopAcM_createItemForPresentDemo(cXyz* pos, int i_itemNo, u8 param_3, int roomNo, int param_5, csXyz* rot, cXyz* scale) { JUT_ASSERT(2413, 0 <= i_itemNo && i_itemNo < 256); - + dComIfGp_event_setGtItm(i_itemNo); - + if (i_itemNo == NO_ITEM) { return -1; } - + return fopAcM_createDemoItem(pos, i_itemNo, roomNo, rot, param_5, scale, param_3); } /* 800261E8-800262B4 .text fopAcM_createItemForTrBoxDemo__FP4cXyziiiP5csXyzP4cXyz */ s32 fopAcM_createItemForTrBoxDemo(cXyz* pos, int i_itemNo, int roomNo, int param_5, csXyz* rot, cXyz* scale) { JUT_ASSERT(2458, 0 <= i_itemNo && i_itemNo < 256); - + dComIfGp_event_setGtItm(i_itemNo); - + if (i_itemNo == NO_ITEM) { return -1; } - + return fopAcM_createDemoItem(pos, i_itemNo, roomNo, rot, param_5, scale, 0); } /* 800262B4-80026694 .text fopAcM_createItemFromTable__FP4cXyziiiiP5csXyziP4cXyz */ s32 fopAcM_createItemFromTable(cXyz* p_pos, int i_itemNo, int i_itemBitNo, int roomNo, int type, csXyz* p_angle, int action, cXyz* p_scale) { JUT_ASSERT(2514, 0 <= i_itemNo && i_itemNo < 64 && (-1 <= i_itemBitNo && i_itemBitNo <= 79) || i_itemBitNo == 127); - + static cXyz fairy_offset_tbl[3] = { cXyz(40.0f, 0.0f, 0.0f), cXyz(-40.0f, 0.0f, 0.0f), cXyz(0.0f, 0.0f, 40.0f), }; - + cXyz pos(0.0f, 0.0f, 0.0f); csXyz angle(0, 0, 0); - + if (i_itemNo >= 0x20 && i_itemNo <= 0x3E) { ItemTableList* itemTableList = dComIfGp_getItemTable(); int tableIdx = i_itemNo - 0x20; @@ -861,7 +861,7 @@ s32 fopAcM_createItemFromTable(cXyz* p_pos, int i_itemNo, int i_itemBitNo, int r if (p_angle) { angle = *p_angle; } - + if (tableIdx == RECOVER_FAIRY) { // Bug: This condition never gets triggered. They meant to check if (itemNo == RECOVER_FAIRY) so // that the 3x fairies drop table (table 0x14) spawns them in a triangle. But nstead they check if @@ -869,10 +869,10 @@ s32 fopAcM_createItemFromTable(cXyz* p_pos, int i_itemNo, int i_itemBitNo, int r pos += fairy_offset_tbl[i]; angle.y = cM_rndF((f32)0x7FFE); } - + itemNo = getItemNoByLife((s8)itemNo); daItem_c* item = (daItem_c*)fopAcM_fastCreateItem2(&pos, itemNo, i_itemBitNo, roomNo, type, &angle, 8, NULL); - + lastItemPcId = fopAcM_GetID(item); if (lastItemPcId == -1) { break; @@ -880,11 +880,11 @@ s32 fopAcM_createItemFromTable(cXyz* p_pos, int i_itemNo, int i_itemBitNo, int r } return lastItemPcId; } - + int itemIdx = (int)cM_rndF(15.9999f); i_itemNo = itemTableList->mItemTables[tableIdx][itemIdx]; } - + if (i_itemNo == 0x3F || i_itemNo == 0xFF) { return -1; } else { @@ -906,7 +906,7 @@ s32 fopAcM_createShopItem(cXyz* pos, int i_itemNo, csXyz* rot, int roomNo, cXyz* if (i_itemNo == NO_ITEM) { return -1; } - + return fopAcM_create(PROC_ShopItem, i_itemNo, pos, roomNo, rot, scale, 0xFF, createFunc); } @@ -916,7 +916,7 @@ s32 fopAcM_createRaceItem(cXyz* pos, int i_itemNo, int i_itemBitNo, csXyz* rot, if (i_itemNo == NO_ITEM) { return -1; } - + i_itemNo = check_itemno(i_itemNo); u32 params = (i_itemBitNo & 0x7F) << 0x08 | i_itemNo & 0xFF | (param_7 & 0xF) << 0xF; fopAcM_create(PROC_RACEITEM, params, pos, roomNo, rot, scale, 0xFF, NULL); @@ -928,7 +928,7 @@ s32 fopAcM_createDemoItem(cXyz* pos, int i_itemNo, int i_itemBitNo, csXyz* rot, if (i_itemNo == NO_ITEM) { return -1; } - + u32 params = i_itemNo & 0xFF | (i_itemBitNo & 0x7F) << 0x08 | (param_7 & 0xFF) << 0x10; fopAcM_create(PROC_Demo_Item, params, pos, roomNo, rot, scale, 0xFF, NULL); } @@ -945,8 +945,7 @@ s32 fopAcM_createItemForBoss(cXyz* pos, int, int roomNo, csXyz* rot, cXyz* scale } /* 80026ADC-80026C90 .text fopAcM_createItem__FP4cXyziiiiP5csXyziP4cXyz */ -s32 fopAcM_createItem(cXyz* pos, int i_itemNo, int i_itemBitNo, int roomNo, int type, csXyz* rot, - int action, cXyz* scale) { +s32 fopAcM_createItem(cXyz* pos, int i_itemNo, int i_itemBitNo, int roomNo, int type, csXyz* rot, int action, cXyz* scale) { /* Nonmatching */ } @@ -955,21 +954,21 @@ void* fopAcM_fastCreateItem2(cXyz* pos, int i_itemNo, int i_itemBitNo, int roomN csXyz* rot, int action, cXyz* scale) { /* Nonmatching (regswap) */ JUT_ASSERT(2995, 0 <= i_itemNo && i_itemNo < 256 && (-1 <= i_itemBitNo && i_itemBitNo <= 79) || i_itemBitNo == 127); - + csXyz prmRot = csXyz::Zero; - + if (i_itemNo == NO_ITEM) { return NULL; } - + if (rot) { prmRot = *rot; } prmRot.z = 0xFF; - + u32 params = check_itemno(i_itemNo); - params = (i_itemBitNo & 0xFF) << 0x08 | params & 0xFF | 0x00FF0000 | (type & 3) << 0x18 | action << 0x1A; - + params = (i_itemBitNo & 0xFF) << 0x08 | params & 0xFF | 0x00FF0000 | (type & 3) << 24 | action << 26; + daItem_c* item; switch (i_itemNo) { case RECOVER_FAIRY: @@ -986,13 +985,26 @@ void* fopAcM_fastCreateItem2(cXyz* pos, int i_itemNo, int i_itemBitNo, int roomN } /* 80026E5C-80026F5C .text fopAcM_createItemForKP2__FP4cXyziiP5csXyzP4cXyzfffUs */ -void fopAcM_createItemForKP2(cXyz*, int, int, csXyz*, cXyz*, float, float, float, u16) { - /* Nonmatching */ +fopAc_ac_c* fopAcM_createItemForKP2(cXyz* pos, int i_itemNo, int roomNo, csXyz* rot, cXyz* scale, f32 speedF, f32 speedY, f32 gravity, u16 i_itemBitNo) { + JUT_ASSERT(0xc25, 0 <= i_itemNo && i_itemNo < 256); + if (i_itemNo == NO_ITEM) + return NULL; + + fopAc_ac_c* ac = (fopAc_ac_c*)fopAcM_fastCreate(PROC_SPC_ITEM01, i_itemNo | (i_itemBitNo & 0xFFFF) << 8, pos, roomNo, rot, scale, 0xFF, NULL, NULL); + if (ac != NULL) { + fopAcM_SetSpeedF(ac, speedF); + ac->speed.y = speedY; + fopAcM_SetGravity(ac, gravity); + } + return ac; } /* 80026F5C-80026F98 .text fopAcM_createItemForSimpleDemo__FP4cXyziiP5csXyzP4cXyzff */ -void* fopAcM_createItemForSimpleDemo(cXyz*, int, int, csXyz*, cXyz*, float, float) { - /* Nonmatching */ +daItem_c* fopAcM_createItemForSimpleDemo(cXyz* pos, int i_itemNo, int roomNo, csXyz* rot, cXyz* scale, f32 speedF, f32 speedY) { + daItem_c* item = (daItem_c*)fopAcM_fastCreateItem(pos, i_itemNo, roomNo, rot, scale, speedF, speedY, -7.0f, 0xFFFFFFFF, NULL); + if (item != NULL) + item->mCurState = 5; + return item; } /* 80026F98-80027254 .text fopAcM_fastCreateItem__FP4cXyziiP5csXyzP4cXyzfffiPFPv_i */ @@ -1003,13 +1015,13 @@ void* fopAcM_fastCreateItem(cXyz* pos, int i_itemNo, int roomNo, csXyz* rot, cXy if (i_itemNo == NO_ITEM) { return NULL; } - + u32 params = (u8)check_itemno(i_itemNo) & 0xFF | (i_itemBitNo & 0xFF) << 0x08 | 0x28FF0000; - + if (isHeart(i_itemNo)) { speedF = 2.0f * speedF; } - + daItem_c* item; csXyz prmRot; switch (i_itemNo) { @@ -1026,7 +1038,7 @@ void* fopAcM_fastCreateItem(cXyz* pos, int i_itemNo, int roomNo, csXyz* rot, cXy } prmRot.z = 0xFF; prmRot.y += (int)cM_rndFX(0x2000); - + item = (daItem_c*)fopAcM_fastCreate(PROC_ITEM, params, pos, roomNo, &prmRot, scale, 0xFF, createFunc, NULL); if (item) { item->speedF = speedF * (1.0f + cM_rndFX(0.3f)); @@ -1042,7 +1054,7 @@ void* fopAcM_fastCreateItem(cXyz* pos, int i_itemNo, int roomNo, csXyz* rot, cXy prmRot = csXyz::Zero; } prmRot.z = 0xFF; - + item = (daItem_c*)fopAcM_fastCreate(PROC_ITEM, params, pos, roomNo, &prmRot, scale, 0xFF, createFunc, NULL); if (item) { item->speedF = speedF; @@ -1064,7 +1076,7 @@ BOOL stealItem_CB(void* actor) { } /* 80027280-800273D4 .text fopAcM_createStealItem__FP4cXyziiP5csXyzi */ -void fopAcM_createStealItem(cXyz*, int, int, csXyz*, int) { +void fopAcM_createStealItem(cXyz* p_pos, int i_tblNo, int, csXyz*, int) { /* Nonmatching */ } @@ -1138,7 +1150,7 @@ void fopAcM_cancelCarryNow(fopAc_ac_c* i_this) { fopAcM_OffStatus(i_this, fopAcStts_CARRY_e); fopAcM_setRoomLayer(i_this, fopAcM_GetRoomNo(i_this)); i_this->shape_angle.z = 0; - + if (dComIfGp_event_runCheck() && i_this->mGroup != fopAc_ENEMY_e) { fopAcM_OnStatus(i_this, fopAcStts_UNK800_e); }