diff --git a/include/JSystem/JMath/random.h b/include/JSystem/JMath/random.h index c8448ed51..3c24e7caf 100644 --- a/include/JSystem/JMath/random.h +++ b/include/JSystem/JMath/random.h @@ -18,8 +18,6 @@ struct TRandom_fast_ { // due to the float constant, having this function inlined adds that float to data, // making it not match float get_ufloat_1(void) { - // !@bug UB: in C++ it's not legal to read from an union member other - // than the last one that was written to. union { f32 f; u32 s; diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index ace11ffbd..c2f6cad2d 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -12,7 +12,42 @@ #include "dolphin/gx/GXStruct.h" #include "dolphin/mtx/mtx.h" -class JPADataBlockLinkInfo; +class JPADynamicsBlock; +class JPABaseShape; +class JPAExtraShape; +class JPASweepShape; +class JPAExTexShape; +class JPAKeyBlock; +class JPAFieldBlock; + +class JPADataBlockLinkInfo { +public: + JPAFieldBlock * getField() { return mpFieldBlock; } + u8 getFieldNum() { return mFieldNum; } + JPADynamicsBlock * getDynamics() { return mpDynamicsBlock; } + JPASweepShape * getSweepShape() { return mpSweepShape; } + u8 getKeyNum() { return mKeyNum; } + JPAKeyBlock * getKey() { return mpKeyBlock; } + JPAExtraShape * getExtraShape() { return mpExtraShape; } + u32 * getTextureDataBase() { return mpTextureDataBase; } + JPAExTexShape * getExTexShape() { return mpExTexShape; } + JPABaseShape * getBaseShape() { return mpBaseShape; } + u8 getTextureNum() { return mTextureNum; } + +public: + /* 0x00 */ JPADynamicsBlock * mpDynamicsBlock; + /* 0x04 */ JPABaseShape * mpBaseShape; + /* 0x08 */ JPAExtraShape * mpExtraShape; + /* 0x0C */ JPASweepShape * mpSweepShape; + /* 0x10 */ JPAExTexShape * mpExTexShape; + /* 0x14 */ JPAKeyBlock * mpKeyBlock; + /* 0x18 */ JPAFieldBlock * mpFieldBlock; + /* 0x1C */ u32 * mpTextureDataBase; + /* 0x20 */ u8 mFieldNum; + /* 0x21 */ u8 mTextureNum; + /* 0x22 */ u8 mKeyNum; + /* 0x23 */ u8 field_0x23; +}; enum { JPAEmtrStts_StopEmit = 0x01, @@ -48,6 +83,10 @@ public: }; struct JPAEmitterInfo { +public: + JPAEmitterInfo() : mRandom(0) {} + ~JPAEmitterInfo() {} + public: /* 0x000 */ JMath::TRandom_fast_ mRandom; /* 0x004 */ JPABaseEmitter * mpCurEmitter; @@ -59,7 +98,9 @@ public: /* 0x0D4 */ JGeometry::TVec3 mEmitterTranslation; /* 0x0E0 */ JGeometry::TVec3 mEmitterGlobalCenter; /* 0x0EC */ JGeometry::TVec3 mPublicScale; - /* 0x0F8 */ u8 field_0xf8[0x10c - 0xf8]; + /* 0x0F8 */ JGeometry::TVec3 mgReRDir; + /* 0x100 */ void* field_0x100; + /* 0x104 */ void* field_0x104; /* 0x10C */ JGeometry::TVec3 mVolumePos; /* 0x118 */ JGeometry::TVec3 mVelOmni; /* 0x124 */ JGeometry::TVec3 mVelAxis; @@ -94,13 +135,13 @@ public: void calcKey(); void deleteParticle(JPABaseParticle*, JSUList*); void deleteAllParticle(); - void getPtclFromVacList(); - void doStartFrameProcess(); - void doTerminationProcess(); + JPABaseParticle* getPtclFromVacList(); + bool doStartFrameProcess(); + bool doTerminationProcess(); void calcEmitterGlobalPosition(JGeometry::TVec3&); void calcgReRDirection(); - void getPivotX(); - void getPivotY(); + u32 getPivotX(); + u32 getPivotY(); void setStatus(u32 status) { mFlags |= status; } void clearStatus(u32 status) { mFlags &= ~status; } @@ -111,6 +152,7 @@ public: return mActiveParticles.getNumLinks() + mChildParticles.getNumLinks(); } + JPADataBlockLinkInfo * getEmitterDataBlockInfoPtr() const { return mpDataLinkInfo; } bool isEnableDeleteEmitter() { return checkStatus(JPAEmtrStts_EnableDeleteEmitter) && getParticleNumber() == 0; } u8 getGlobalAlpha() { return mGlobalPrmColor.a; } @@ -189,8 +231,8 @@ public: /* 0x060 */ s32 mMaxFrame; /* 0x064 */ s16 mLifeTime; /* 0x066 */ s16 mStartFrame; - /* 0x068 */ s16 mVolumeSize; - /* 0x06A */ s16 mDivNumber; + /* 0x068 */ u16 mVolumeSize; + /* 0x06A */ u16 mDivNumber; /* 0x06C */ f32 mInitialVelOmni; /* 0x070 */ f32 mInitialVelAxis; /* 0x074 */ f32 mInitialVelDir; @@ -205,8 +247,8 @@ public: /* 0x164 */ f32 mTick; /* 0x168 */ f32 mTime; /* 0x16C */ JPAFieldManager mFieldManager; - /* 0x17C */ JSUPtrList mActiveParticles; - /* 0x188 */ JSUPtrList mChildParticles; + /* 0x17C */ JSUList mActiveParticles; + /* 0x188 */ JSUList mChildParticles; /* 0x194 */ JSUPtrList* mpPtclVacList; /* 0x198 */ JPADataBlockLinkInfo* mpDataLinkInfo; /* 0x19C */ JPACallBackBase* mpEmitterCallBack; diff --git a/include/JSystem/JParticle/JPAExtraShape.h b/include/JSystem/JParticle/JPAExtraShape.h new file mode 100644 index 000000000..90348608e --- /dev/null +++ b/include/JSystem/JParticle/JPAExtraShape.h @@ -0,0 +1,51 @@ +#ifndef JPAEXTRASHAPE_H +#define JPAEXTRASHAPE_H + +#include "JSystem/JParticle/JPAParticle.h" + +class JPAExtraShape { +public: + virtual ~JPAExtraShape() {}; + virtual void isEnableScale() = 0; + virtual void isDiffXY() = 0; + virtual void isEnableScaleAnmX() = 0; + virtual void isEnableScaleAnmY() = 0; + virtual void isEnableScaleBySpeedX() = 0; + virtual void isEnableScaleBySpeedY() = 0; + virtual void getScaleInTiming() = 0; + virtual void getScaleOutTiming() = 0; + virtual void getScaleInValueX() = 0; + virtual void getScaleInValueY() = 0; + virtual void getAnmTypeX() = 0; + virtual void getAnmTypeY() = 0; + virtual void getAnmCycleX() = 0; + virtual void getAnmCycleY() = 0; + virtual void getIncreaseRateX() = 0; + virtual void getIncreaseRateY() = 0; + virtual void getDecreaseRateX() = 0; + virtual void getDecreaseRateY() = 0; + virtual u32 getPivotX() = 0; + virtual u32 getPivotY() = 0; + virtual void getRandomScale() = 0; + virtual void isEnableAlpha() = 0; + virtual void isEnableSinWave() = 0; + virtual void getAlphaInTiming() = 0; + virtual void getAlphaOutTiming() = 0; + virtual void getAlphaInValue() = 0; + virtual void getAlphaBaseValue() = 0; + virtual void getAlphaWaveType() = 0; + virtual void getAlphaWaveParam1() = 0; + virtual void getAlphaWaveParam2() = 0; + virtual void getAlphaWaveParam3() = 0; + virtual void getAlphaWaveRandom() = 0; + virtual void getAlphaIncreaseRate() = 0; + virtual void getAlphaDecreaseRate() = 0; + virtual void isEnableRotate() = 0; + virtual void getRotateAngle() = 0; + virtual void getRotateSpeed() = 0; + virtual void getRotateRandomAngle() = 0; + virtual void getRotateRandomSpeed() = 0; + virtual void getRotateDirection() = 0; +}; + +#endif /* JPAEXTRASHAPE_H */ diff --git a/include/JSystem/JParticle/JPAField.h b/include/JSystem/JParticle/JPAField.h index 12e5d612b..d7dbe9e52 100644 --- a/include/JSystem/JParticle/JPAField.h +++ b/include/JSystem/JParticle/JPAField.h @@ -1,11 +1,12 @@ #ifndef JPAFIELD_H #define JPAFIELD_H -#include "JSystem/JParticle/JPAParticle.h" +#include "JSystem/JSupport/JSUList.h" class JPADataBlockLinkInfo; class JPAEmitterInfo; class JPAFieldData; +class JPABaseParticle; class JPAFieldManager { public: diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index 40f4be2da..8e3e6d661 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -28,13 +28,13 @@ public: void incFrame(); void calcVelocity(); void calcPosition(); - void checkCreateChild(); + bool checkCreateChild(); ~JPABaseParticle(); JPABaseParticle(); public: - /* 0x00 */ JSUPtrLink mLink; + /* 0x00 */ JSULink mLink; /* 0x10 */ JGeometry::TVec3 mGlobalPosition; /* 0x1C */ JGeometry::TVec3 mLocalPosition; /* 0x28 */ JGeometry::TVec3 mPosition; diff --git a/include/JSystem/JParticle/JPASweepShape.h b/include/JSystem/JParticle/JPASweepShape.h new file mode 100644 index 000000000..8c0a90eb7 --- /dev/null +++ b/include/JSystem/JParticle/JPASweepShape.h @@ -0,0 +1,44 @@ +#ifndef JPASWEEPSHAPE_H +#define JPASWEEPSHAPE_H + +#include "JSystem/JParticle/JPAParticle.h" + +class JPASweepShape { +public: + virtual ~JPASweepShape() {}; + virtual void getType() = 0; + virtual void getDirType() = 0; + virtual void getRotType() = 0; + virtual void getBasePlaneType() = 0; + virtual void getLife() = 0; + virtual s16 getRate() = 0; + virtual void getTiming() = 0; + virtual void getStep() = 0; + virtual void getPosRndm() = 0; + virtual void getVelInfRate() = 0; + virtual void getBaseVel() = 0; + virtual void getBaseVelRndm() = 0; + virtual void getGravity() = 0; + virtual void isEnableField() = 0; + virtual void isEnableDrawParent() = 0; + virtual void isClipOn() = 0; + virtual void isEnableScaleOut() = 0; + virtual void isEnableAlphaOut() = 0; + virtual void isEnableRotate() = 0; + virtual void isInheritedScale() = 0; + virtual void isInheritedAlpha() = 0; + virtual void isInheritedRGB() = 0; + virtual void getTextureIndex() = 0; + virtual void getScaleX() = 0; + virtual void getScaleY() = 0; + virtual void getPrm() = 0; + virtual void getEnv() = 0; + virtual void getPrmAlpha() = 0; + virtual void getEnvAlpha() = 0; + virtual void getRotateSpeed() = 0; + virtual void getInheritScale() = 0; + virtual void getInheritAlpha() = 0; + virtual void getInheritRGB() = 0; +}; + +#endif /* JPASWEEPSHAPE_H */ diff --git a/src/JSystem/JParticle/JPAEmitter.cpp b/src/JSystem/JParticle/JPAEmitter.cpp index 40af37238..4c07cdfb2 100644 --- a/src/JSystem/JParticle/JPAEmitter.cpp +++ b/src/JSystem/JParticle/JPAEmitter.cpp @@ -4,11 +4,27 @@ // #include "JSystem/JParticle/JPAEmitter.h" -#include "dolphin/types.h" +#include "JSystem/JParticle/JPAExtraShape.h" +#include "JSystem/JParticle/JPASweepShape.h" +#include "dolphin/mtx/mtx.h" +#include "dolphin/mtx/mtxvec.h" + +JPAEmitterInfo JPABaseEmitter::emtrInfo; /* 8025C128-8025C254 .text calcVolumePoint__14JPABaseEmitterFv */ void JPABaseEmitter::calcVolumePoint() { /* Nonmatching */ + emtrInfo.mVolumePos.z = 0.0f; + emtrInfo.mVolumePos.y = 0.0f; + emtrInfo.mVolumePos.x = 0.0f; + + emtrInfo.mVelOmni.z = mRandomSeed.get_ufloat_1() - 0.5f; + emtrInfo.mVelOmni.y = mRandomSeed.get_ufloat_1() - 0.5f; + emtrInfo.mVelOmni.x = mRandomSeed.get_ufloat_1() - 0.5f; + + emtrInfo.mVelAxis.x = mRandomSeed.get_ufloat_1() - 0.5f; + emtrInfo.mVelAxis.y = 0.0f; + emtrInfo.mVelAxis.z = mRandomSeed.get_ufloat_1() - 0.5f; } /* 8025C254-8025C394 .text calcVolumeLine__14JPABaseEmitterFv */ @@ -49,11 +65,64 @@ void JPABaseEmitter::create(JPADataBlockLinkInfo*) { /* 8025D0B0-8025D294 .text calcEmitterInfo__14JPABaseEmitterFv */ void JPABaseEmitter::calcEmitterInfo() { /* Nonmatching */ + emtrInfo.mpCurEmitter = this; + emtrInfo.mVolumeEmitXCount = 0; + emtrInfo.mVolumeEmitAngleCount = 0; + emtrInfo.mVolumeEmitAngleMax = 1; + emtrInfo.mDivNumber = mDivNumber * 2 + 1; + emtrInfo.mVolumeSize = mVolumeSize; + + Mtx mtxScale, mtxRot, mtx; + MTXScale(mtxScale, mEmitterScale.x, mEmitterScale.y, mEmitterScale.z); + JPAGetXYZRotateMtx((mEmitterRot.x << 14) / 0x5a, (mEmitterRot.y << 14) / 0x5a, (mEmitterRot.z << 14) / 0x5a, mtxRot); + + MTXScale(mtx, mGlobalDynamicsScale.x, mGlobalDynamicsScale.y, mGlobalDynamicsScale.z); + MTXConcat(mGlobalRotation, mtx, mtx); + mtx[0][3] = mGlobalTranslation.x; + mtx[1][3] = mGlobalTranslation.y; + mtx[2][3] = mGlobalTranslation.z; + MTXCopy(mGlobalRotation, emtrInfo.mGlobalRot); + MTXConcat(mGlobalRotation, mtxRot, emtrInfo.mEmitterGlobalRot); + MTXConcat(emtrInfo.mEmitterGlobalRot, mtxScale, emtrInfo.mEmitterGlobalSR); + JPAGetDirMtx(mEmitterDir, emtrInfo.mEmitterDirMtx); + emtrInfo.mEmitterGlobalScale.x = mEmitterScale.x * mGlobalDynamicsScale.x; + emtrInfo.mEmitterGlobalScale.y = mEmitterScale.y * mGlobalDynamicsScale.y; + emtrInfo.mEmitterGlobalScale.z = mEmitterScale.z * mGlobalDynamicsScale.z; + emtrInfo.mEmitterTranslation.x = mEmitterTranslation.x; + emtrInfo.mEmitterTranslation.y = mEmitterTranslation.y; + emtrInfo.mEmitterTranslation.z = mEmitterTranslation.z; + emtrInfo.mPublicScale.x = mGlobalDynamicsScale.x * 1.0f; + emtrInfo.mPublicScale.y = mGlobalDynamicsScale.y * 1.0f; + emtrInfo.mPublicScale.z = mGlobalDynamicsScale.z * 1.0f; + MTXMultVec(mtx, &mEmitterTranslation, emtrInfo.mEmitterGlobalCenter); } /* 8025D294-8025D3C0 .text calc__14JPABaseEmitterFv */ void JPABaseEmitter::calc() { /* Nonmatching */ + emtrInfo.mVolumeEmitCount = 0; + if (!checkStatus(JPAEmtrStts_StopCalc)) { + calcKey(); + if (mpEmitterCallBack != NULL) + mpEmitterCallBack->execute(this); + calcEmitterInfo(); + mDraw.calc(); + mFieldManager.preCalc(); + if (!checkStatus(JPAEmtrStts_EnableDeleteEmitter)) + calcCreatePtcls(); + if (mpEmitterCallBack != NULL) + mpEmitterCallBack->executeAfter(this); + calcParticle(); + calcChild(); + mTick += 1.0f; + if (mTick < 0.0f) + mTick = 0.0f; + } else { + if (mpEmitterCallBack != NULL) + mpEmitterCallBack->execute(this); + if (mpEmitterCallBack != NULL) + mpEmitterCallBack->executeAfter(this); + } } /* 8025D3C0-8025D5D4 .text calcCreatePtcls__14JPABaseEmitterFv */ @@ -62,23 +131,81 @@ void JPABaseEmitter::calcCreatePtcls() { } /* 8025D5D4-8025D670 .text createChildren__14JPABaseEmitterFP15JPABaseParticle */ -void JPABaseEmitter::createChildren(JPABaseParticle*) { - /* Nonmatching */ +void JPABaseEmitter::createChildren(JPABaseParticle* ptcl) { + s32 num = getEmitterDataBlockInfoPtr()->getSweepShape()->getRate(); + for (s32 i = 0; i < num; i++) { + JPABaseParticle * chld = getPtclFromVacList(); + if (chld == NULL) + break; + mChildParticles.prepend(&chld->mLink); + chld->initChild(ptcl); + mDraw.initChild(ptcl, chld); + } } /* 8025D670-8025D6E0 .text createParticle__14JPABaseEmitterFv */ -void JPABaseEmitter::createParticle() { - /* Nonmatching */ +JPABaseParticle * JPABaseEmitter::createParticle() { + /* Nonmatching - PTMF */ + JPABaseParticle * ptcl = getPtclFromVacList(); + if (ptcl != NULL) { + mActiveParticles.prepend(&ptcl->mLink); + ptcl->initParticle(); + mDraw.initParticle(ptcl); + } + return ptcl; } /* 8025D6E0-8025D7E0 .text calcParticle__14JPABaseEmitterFv */ void JPABaseEmitter::calcParticle() { - /* Nonmatching */ + for (JSULink * link = mActiveParticles.getFirst(); link != NULL;) { + JSULink * next = link->getNext(); + JPABaseParticle * ptcl = (JPABaseParticle *) link->getObjectPtr(); + ptcl->incFrame(); + if (!(ptcl->mStatus & 0x80)) { + ptcl->calcVelocity(); + if (ptcl->mpCallBack2 != NULL) + ptcl->mpCallBack2->execute(this, ptcl); + if (!(ptcl->mStatus & 0x02)) { + mDraw.calcParticle(ptcl); + if (getEmitterDataBlockInfoPtr()->getSweepShape() != NULL && ptcl->checkCreateChild()) + createChildren(ptcl); + ptcl->calcPosition(); + } + } else { + ptcl->mStatus |= 0x02; + } + + if (ptcl->mStatus & 0x02) + deleteParticle(ptcl, &mActiveParticles); + + link = next; + } } /* 8025D7E0-8025D8CC .text calcChild__14JPABaseEmitterFv */ void JPABaseEmitter::calcChild() { - /* Nonmatching */ + for (JSULink * link = mChildParticles.getFirst(); link != NULL;) { + JSULink * next = link->getNext(); + JPABaseParticle * ptcl = (JPABaseParticle *) link->getObjectPtr(); + ptcl->incFrame(); + if (!(ptcl->mStatus & 0x80)) { + if ((s32)ptcl->mCurFrame != 0) + ptcl->calcVelocity(); + if (ptcl->mpCallBack2 != NULL) + ptcl->mpCallBack2->execute(this, ptcl); + if (!(ptcl->mStatus & 0x02)) { + mDraw.calcChild(ptcl); + ptcl->calcPosition(); + } + } else { + ptcl->mStatus |= 0x02; + } + + if (ptcl->mStatus & 0x02) + deleteParticle(ptcl, &mChildParticles); + + link = next; + } } /* 8025D8CC-8025DA90 .text calcKey__14JPABaseEmitterFv */ @@ -87,51 +214,103 @@ void JPABaseEmitter::calcKey() { } /* 8025DA90-8025DAD8 .text deleteParticle__14JPABaseEmitterFP15JPABaseParticleP26JSUList<15JPABaseParticle> */ -void JPABaseEmitter::deleteParticle(JPABaseParticle*, JSUList*) { - /* Nonmatching */ +void JPABaseEmitter::deleteParticle(JPABaseParticle* ptcl, JSUList* list) { + JSUPtrList * ptrlist = list; + ptrlist->remove(&ptcl->mLink); + mpPtclVacList->prepend(&ptcl->mLink); } /* 8025DAD8-8025DB68 .text deleteAllParticle__14JPABaseEmitterFv */ void JPABaseEmitter::deleteAllParticle() { - /* Nonmatching */ + for (JSULink* link = mActiveParticles.getFirst(); link != NULL;) { + JSULink* next = link->getNext(); + mActiveParticles.remove(link); + mpPtclVacList->prepend(link); + link = next; + } + + for (JSULink* link = mChildParticles.getFirst(); link != NULL;) { + JSULink* next = link->getNext(); + mChildParticles.remove(link); + mpPtclVacList->prepend(link); + link = next; + } } /* 8025DB68-8025DBB4 .text getPtclFromVacList__14JPABaseEmitterFv */ -void JPABaseEmitter::getPtclFromVacList() { - /* Nonmatching */ +JPABaseParticle * JPABaseEmitter::getPtclFromVacList() { + JPABaseParticle * ptcl = NULL; + if (mpPtclVacList->getNumLinks() != 0) { + ptcl = (JPABaseParticle*)mpPtclVacList->getFirstLink()->getObjectPtr(); + mpPtclVacList->remove(&ptcl->mLink); + } + return ptcl; } /* 8025DBB4-8025DC2C .text doStartFrameProcess__14JPABaseEmitterFv */ -void JPABaseEmitter::doStartFrameProcess() { +bool JPABaseEmitter::doStartFrameProcess() { /* Nonmatching */ + if (mTime >= mStartFrame) + return true; + + if (!checkStatus(JPAEmtrStts_StopCalc)) { + mTime++; + if (mTime < 0.0f) + mTime = 0.0f; + } + + return false; } /* 8025DC2C-8025DCDC .text doTerminationProcess__14JPABaseEmitterFv */ -void JPABaseEmitter::doTerminationProcess() { - /* Nonmatching */ +bool JPABaseEmitter::doTerminationProcess() { + if (mMaxFrame == 0) { + return false; + } else if (mMaxFrame < 0) { + mFlags |= JPAEmtrStts_EnableDeleteEmitter; + return getParticleNumber() == 0; + } else if (mTick >= mMaxFrame) { + mFlags |= JPAEmtrStts_EnableDeleteEmitter; + if (mFlags & JPAEmtrStts_Immortal) + return false; + return getParticleNumber() == 0; + } else { + return false; + } } /* 8025DCDC-8025DD5C .text calcEmitterGlobalPosition__14JPABaseEmitterFRQ29JGeometry8TVec3 */ -void JPABaseEmitter::calcEmitterGlobalPosition(JGeometry::TVec3&) { - /* Nonmatching */ +void JPABaseEmitter::calcEmitterGlobalPosition(JGeometry::TVec3& dst) { + Mtx mtx; + MTXScale(mtx, mGlobalDynamicsScale.x, mGlobalDynamicsScale.y, mGlobalDynamicsScale.z); + MTXConcat(mGlobalRotation, mtx, mtx); + mtx[0][3] = mGlobalTranslation.x; + mtx[1][3] = mGlobalTranslation.y; + mtx[2][3] = mGlobalTranslation.z; + MTXMultVec(mtx, &mEmitterTranslation, dst); } /* 8025DD5C-8025DDE8 .text calcgReRDirection__14JPABaseEmitterFv */ void JPABaseEmitter::calcgReRDirection() { - /* Nonmatching */ + // gReR = globalRotation emitterRotation + Mtx mtx; + JPAGetXYZRotateMtx((mEmitterRot.x << 14) / 0x5a, (mEmitterRot.y << 14) / 0x5a, (mEmitterRot.z << 14) / 0x5a, mtx); + MTXConcat(mGlobalRotation, mtx, mtx); + MTXMultVec(mtx, mEmitterDir, emtrInfo.mgReRDir); } /* 8025DDE8-8025DE2C .text getPivotX__14JPABaseEmitterFv */ -void JPABaseEmitter::getPivotX() { - /* Nonmatching */ +u32 JPABaseEmitter::getPivotX() { + if (getEmitterDataBlockInfoPtr()->getExtraShape() != NULL) + return getEmitterDataBlockInfoPtr()->getExtraShape()->getPivotX(); + else + return 1; } /* 8025DE2C-8025DE70 .text getPivotY__14JPABaseEmitterFv */ -void JPABaseEmitter::getPivotY() { - /* Nonmatching */ -} - -/* 8025DEB8-8025DEF4 .text __dt__14JPAEmitterInfoFv */ -JPAEmitterInfo::~JPAEmitterInfo() { - /* Nonmatching */ +u32 JPABaseEmitter::getPivotY() { + if (getEmitterDataBlockInfoPtr()->getExtraShape() != NULL) + return getEmitterDataBlockInfoPtr()->getExtraShape()->getPivotY(); + else + return 1; } diff --git a/src/JSystem/JParticle/JPAField.cpp b/src/JSystem/JParticle/JPAField.cpp index a52883458..39e68d2df 100644 --- a/src/JSystem/JParticle/JPAField.cpp +++ b/src/JSystem/JParticle/JPAField.cpp @@ -4,7 +4,6 @@ // #include "JSystem/JParticle/JPAField.h" -#include "dolphin/types.h" /* 80259EE8-8025A0D8 .text loadFieldData__12JPABaseFieldFP12JPAFieldDataP13JPAFieldBlock */ void JPABaseField::loadFieldData(JPAFieldData*, JPAFieldBlock*) { diff --git a/src/JSystem/JParticle/JPAParticle.cpp b/src/JSystem/JParticle/JPAParticle.cpp index eb63a5366..16a3575ca 100644 --- a/src/JSystem/JParticle/JPAParticle.cpp +++ b/src/JSystem/JParticle/JPAParticle.cpp @@ -78,6 +78,6 @@ void JPABaseParticle::calcPosition() { } /* 8025ED6C-8025EE44 .text checkCreateChild__15JPABaseParticleFv */ -void JPABaseParticle::checkCreateChild() { +bool JPABaseParticle::checkCreateChild() { /* Nonmatching */ }