Files
tww/include/JSystem/JParticle/JPAEmitter.h
T
2023-09-22 00:53:29 -04:00

143 lines
4.3 KiB
C++

#ifndef JPAEMITTER_H
#define JPAEMITTER_H
#include "JSystem/JParticle/JPADraw.h"
#include "JSystem/JParticle/JPAField.h"
#include "JSystem/JParticle/JPAMath.h"
#include "JSystem/JSupport/JSUList.h"
#include "JSystem/JMath/random.h"
#include "JSystem/JGeometry.h"
#include "SSystem/SComponent/c_xyz.h"
#include "SSystem/SComponent/c_sxyz.h"
#include "dolphin/gx/GXStruct.h"
#include "dolphin/mtx/mtx.h"
class JPADataBlockLinkInfo;
enum {
JPAEmtrStts_StopEmit = 0x01,
JPAEmtrStts_StopCalc = 0x02,
JPAEmtrStts_StopDraw = 0x04,
JPAEmtrStts_EnableDeleteEmitter = 0x08,
JPAEmtrStts_FirstEmit = 0x10,
JPAEmtrStts_RateStepEmit = 0x20,
JPAEmtrStts_Immortal = 0x40,
};
template<typename T>
class JPACallBackBase {
public:
JPACallBackBase() {}
virtual ~JPACallBackBase();
virtual void init(JPABaseEmitter*);
virtual void execute(JPABaseEmitter*);
virtual void executeAfter(JPABaseEmitter*);
virtual void draw(JPABaseEmitter*);
};
class JPABaseEmitter {
public:
typedef void (JPABaseEmitter::*VolumeFunc)();
void calcVolumePoint();
void calcVolumeLine();
void calcVolumeCircle();
void calcVolumeCube();
void calcVolumeSphere();
void calcVolumeCylinder();
void calcVolumeTorus();
void create(JPADataBlockLinkInfo*);
void calcEmitterInfo();
void calc();
void calcCreatePtcls();
void createChildren(JPABaseParticle*);
void createParticle();
void calcParticle();
void calcChild();
void calcKey();
void deleteParticle(JPABaseParticle*, JSUList<JPABaseParticle>*);
void deleteAllParticle();
void getPtclFromVacList();
void doStartFrameProcess();
void doTerminationProcess();
void calcEmitterGlobalPosition(JGeometry::TVec3<float>&);
void calcgReRDirection();
void getPivotX();
void getPivotY();
void setStatus(u32 status) { mFlags |= status; }
u8 getGlobalAlpha() { return mGlobalPrmColor.a; }
void setGlobalAlpha(u8 alpha) { mGlobalPrmColor.a = alpha; }
void setGlobalRTMatrix(MtxP mtx) {
JPASetRMtxTVecfromMtx(mtx, mGlobalRotation, mGlobalTranslation);
}
void stopCreateParticle() { setStatus(JPAEmtrStts_StopEmit); }
void becomeInvalidEmitter() {
mMaxFrame = -1;
stopCreateParticle();
}
/* 0x000 */ VolumeFunc mVolumeFunc;
/* 0x00C */ cXyz mEmitterScale;
/* 0x018 */ cXyz mEmitterTranslation;
/* 0x024 */ csXyz mEmitterRot;
/* 0x02A */ u8 mVolumeType;
/* 0x02B */ u8 mRateStep;
/* 0x02C */ cXyz mEmitterDir;
/* 0x038 */ f32 mRate;
/* 0x03C */ f32 mRateRndm;
/* 0x040 */ f32 mAccel;
/* 0x044 */ f32 mAccelRndm;
/* 0x048 */ f32 mAirResist;
/* 0x04C */ f32 mAirResistRndm;
/* 0x050 */ f32 mMoment;
/* 0x054 */ f32 mMomentRndm;
/* 0x058 */ f32 mLifeTimeRndm;
/* 0x05C */ f32 mSpread;
/* 0x060 */ s32 mMaxFrame;
/* 0x064 */ s16 mLifeTime;
/* 0x066 */ s16 mStartFrame;
/* 0x068 */ s16 mVolumeSize;
/* 0x06A */ s16 mDivNumber;
/* 0x06C */ f32 mInitialVelOmni;
/* 0x070 */ f32 mInitialVelAxis;
/* 0x074 */ f32 mInitialVelDir;
/* 0x078 */ f32 mInitialVelRndm;
/* 0x07C */ f32 mInitialVelRatio;
/* 0x080 */ f32 mVolumeSweep;
/* 0x084 */ f32 mVolumeMinRad;
/* 0x088 */ s32 mDataFlag;
/* 0x08C */ s32 mUseKeyFlag;
/* 0x090 */ JSUPtrLink mLink;
/* 0x0A0 */ JPADraw mDraw;
/* 0x164 */ f32 mTick;
/* 0x168 */ f32 mTime;
/* 0x16C */ JPAFieldManager mFieldManager;
/* 0x17C */ JSUPtrList mActiveParticles;
/* 0x188 */ JSUPtrList mChildParticles;
/* 0x194 */ JSUPtrList* mpPtclVacList;
/* 0x198 */ JPADataBlockLinkInfo* mpDataLinkInfo;
/* 0x19C */ JPACallBackBase<JPABaseEmitter>* mpEmitterCallBack;
/* 0x1A0 */ JPACallBackBase2* mpParticleCallBack;
/* 0x1A4 */ JMath::TRandom_fast_ mRandomSeed;
/* 0x1A8 */ Mtx mGlobalRotation;
/* 0x1D8 */ JGeometry::TVec3<f32> mGlobalScale;
/* 0x1E4 */ JGeometry::TVec3<f32> mGlobalTranslation;
/* 0x1F0 */ JGeometry::TVec3<f32> mGlobalScale2D;
/* 0x1FC */ _GXColor mGlobalPrmColor;
/* 0x200 */ _GXColor mGlobalEnvColor;
/* 0x204 */ f32 mEmitCount;
/* 0x208 */ f32 mRateStepTimer;
/* 0x20C */ u32 mFlags;
/* 0x210 */ u32 mUserData;
/* 0x214 */ u8 mGroupID;
/* 0x215 */ u8 mResMgrID;
/* 0x216 */ u8 field_0x216[0x218 - 0x216];
};
#endif /* JPAEMITTER_H */