mirror of https://github.com/zeldaret/tp.git
110 lines
3.7 KiB
C++
110 lines
3.7 KiB
C++
#ifndef JPADYNAMICSBLOCK_H
|
|
#define JPADYNAMICSBLOCK_H
|
|
|
|
#include "JSystem/JGeometry.h"
|
|
|
|
#include "dolphin/types.h"
|
|
|
|
class JPAEmitterWorkData;
|
|
|
|
/**
|
|
* @ingroup jsystem-jparticle
|
|
*
|
|
*/
|
|
struct JPADynamicsBlockData {
|
|
// Common header.
|
|
/* 0x00 */ u8 mMagic[4];
|
|
/* 0x04 */ u32 mSize;
|
|
|
|
/* 0x08 */ u32 mFlags;
|
|
/* 0x0C */ u32 mResUserWork;
|
|
/* 0x10 */ JGeometry::TVec3<f32> mEmitterScl;
|
|
/* 0x1C */ JGeometry::TVec3<f32> mEmitterTrs;
|
|
/* 0x28 */ JGeometry::TVec3<f32> mEmitterDir;
|
|
/* 0x34 */ f32 mInitialVelOmni;
|
|
/* 0x38 */ f32 mInitialVelAxis;
|
|
/* 0x3C */ f32 mInitialVelRndm;
|
|
/* 0x40 */ f32 mInitialVelDir;
|
|
/* 0x44 */ f32 mSpread;
|
|
/* 0x48 */ f32 mInitialVelRatio;
|
|
/* 0x4C */ f32 mRate;
|
|
/* 0x50 */ f32 mRateRndm;
|
|
/* 0x54 */ f32 mLifeTimeRndm;
|
|
/* 0x58 */ f32 mVolumeSweep;
|
|
/* 0x5C */ f32 mVolumeMinRad;
|
|
/* 0x60 */ f32 mAirResist;
|
|
/* 0x64 */ f32 mMoment;
|
|
/* 0x68 */ JGeometry::TVec3<s16> mEmitterRot;
|
|
/* 0x6E */ s16 mMaxFrame;
|
|
/* 0x70 */ s16 mStartFrame;
|
|
/* 0x72 */ s16 mLifeTime;
|
|
/* 0x74 */ u16 mVolumeSize;
|
|
/* 0x76 */ u16 mDivNumber;
|
|
/* 0x78 */ u8 mRateStep;
|
|
/* 0x7C */ u32 field_0x7c;
|
|
};
|
|
|
|
typedef void (*JPADynamicsCalcVolumeFunc)(JPAEmitterWorkData*);
|
|
|
|
enum {
|
|
JPADynFlag_FixedDensity = 0x01,
|
|
JPADynFlag_FixedInterval = 0x02,
|
|
JPADynFlag_InheritScale = 0x04,
|
|
JPADynFlag_FollowEmtr = 0x08,
|
|
JPADynFlag_FollowEmtrChld = 0x10,
|
|
};
|
|
|
|
/**
|
|
* @ingroup jsystem-jparticle
|
|
*
|
|
*/
|
|
class JPADynamicsBlock {
|
|
public:
|
|
/* 8027BB18 */ JPADynamicsBlock(u8 const*);
|
|
/* 8027BB4C */ void init();
|
|
/* 8027BBE8 */ void create(JPAEmitterWorkData*);
|
|
|
|
void calc(JPAEmitterWorkData* work) { mpCalcVolumeFunc(work); }
|
|
|
|
s16 getStartFrame() const { return mpData->mStartFrame; }
|
|
u32 getResUserWork() const { return mpData->mResUserWork; }
|
|
u32 getFlag() const { return mpData->mFlags; }
|
|
u32 getVolumeType() const { return (mpData->mFlags >> 8) & 0x07; }
|
|
u16 getDivNumber() const { return mpData->mDivNumber; }
|
|
f32 getRateRndm() const { return mpData->mRateRndm; }
|
|
void getEmitterScl(JGeometry::TVec3<f32>* vec) const {
|
|
vec->set(mpData->mEmitterScl.x, mpData->mEmitterScl.y, mpData->mEmitterScl.z);
|
|
}
|
|
void getEmitterTrs(JGeometry::TVec3<f32>* vec) const {
|
|
vec->set(mpData->mEmitterTrs.x, mpData->mEmitterTrs.y, mpData->mEmitterTrs.z);
|
|
}
|
|
void getEmitterDir(JGeometry::TVec3<f32>* vec) const {
|
|
vec->set(mpData->mEmitterDir.x, mpData->mEmitterDir.y, mpData->mEmitterDir.z);
|
|
}
|
|
void getEmitterRot(JGeometry::TVec3<s16>* vec) const {
|
|
vec->set(mpData->mEmitterRot.x, mpData->mEmitterRot.y, mpData->mEmitterRot.z);
|
|
}
|
|
s16 getMaxFrame() { return mpData->mMaxFrame; }
|
|
s16 getLifetime() { return mpData->mLifeTime; }
|
|
u16 getVolumeSize() { return mpData->mVolumeSize; }
|
|
f32 getRate() { return mpData->mRate; }
|
|
u8 getRateStep() { return mpData->mRateStep; }
|
|
f32 getVolumeSweep() { return mpData->mVolumeSweep; }
|
|
f32 getVolumeMinRad() { return mpData->mVolumeMinRad; }
|
|
f32 getInitVelOmni() { return mpData->mInitialVelOmni; }
|
|
f32 getInitVelAxis() { return mpData->mInitialVelAxis; }
|
|
f32 getInitVelDir() { return mpData->mInitialVelDir; }
|
|
f32 getInitVelDirSp() { return mpData->mSpread; }
|
|
f32 getInitVelRndm() { return mpData->mInitialVelRndm; }
|
|
f32 getInitVelRatio() const { return mpData->mInitialVelRatio; }
|
|
f32 getAirRes() { return mpData->mAirResist; }
|
|
f32 getLifetimeRndm() const { return mpData->mLifeTimeRndm; }
|
|
f32 getMomentRndm() const { return mpData->mMoment; }
|
|
|
|
public:
|
|
/* 0x00 */ const JPADynamicsBlockData* mpData;
|
|
/* 0x04 */ JPADynamicsCalcVolumeFunc mpCalcVolumeFunc;
|
|
};
|
|
|
|
#endif /* JPADYNAMICSBLOCK_H */
|