mirror of
https://github.com/encounter/tp.git
synced 2026-07-11 06:18:46 -07:00
JParticle mostly done (#2235)
This commit is contained in:
+3
-3
@@ -680,7 +680,7 @@ config.libs = [
|
||||
"JParticle",
|
||||
[
|
||||
Object(Matching, "JSystem/JParticle/JPAResourceManager.cpp"),
|
||||
Object(NonMatching, "JSystem/JParticle/JPAResource.cpp"),
|
||||
Object(Equivalent, "JSystem/JParticle/JPAResource.cpp"),
|
||||
Object(Matching, "JSystem/JParticle/JPABaseShape.cpp"),
|
||||
Object(Matching, "JSystem/JParticle/JPAExtraShape.cpp"),
|
||||
Object(Matching, "JSystem/JParticle/JPAChildShape.cpp"),
|
||||
@@ -689,8 +689,8 @@ config.libs = [
|
||||
Object(NonMatching, "JSystem/JParticle/JPAFieldBlock.cpp"),
|
||||
Object(Matching, "JSystem/JParticle/JPAKeyBlock.cpp"),
|
||||
Object(Matching, "JSystem/JParticle/JPATexture.cpp"),
|
||||
Object(NonMatching, "JSystem/JParticle/JPAResourceLoader.cpp"),
|
||||
Object(NonMatching, "JSystem/JParticle/JPAEmitterManager.cpp"),
|
||||
Object(Matching, "JSystem/JParticle/JPAResourceLoader.cpp"),
|
||||
Object(Equivalent, "JSystem/JParticle/JPAEmitterManager.cpp"),
|
||||
Object(Matching, "JSystem/JParticle/JPAEmitter.cpp"),
|
||||
Object(NonMatching, "JSystem/JParticle/JPAParticle.cpp"),
|
||||
Object(Matching, "JSystem/JParticle/JPAMath.cpp"),
|
||||
|
||||
+73
-46
@@ -3,9 +3,54 @@
|
||||
|
||||
#include "dolphin/mtx/vec.h"
|
||||
#include "math.h"
|
||||
#include "JSystem/JMath/JMath.h"
|
||||
|
||||
namespace JGeometry {
|
||||
|
||||
template<typename T>
|
||||
struct TUtil {
|
||||
static inline T clamp(T v, T min, T max) {
|
||||
if (v < min) {
|
||||
return min;
|
||||
}
|
||||
if (v > max) {
|
||||
return max;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TUtil<f32> {
|
||||
static inline f32 clamp(f32 v, f32 min, f32 max) {
|
||||
if (v < min) {
|
||||
return min;
|
||||
}
|
||||
if (v > max) {
|
||||
return max;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
static inline f32 epsilon() { return 32.0f * FLT_EPSILON; }
|
||||
static inline f32 PI() { return 3.1415927f; }
|
||||
static inline f32 inv_sqrt(f32 x) {
|
||||
if (x <= 0.0f) {
|
||||
return x;
|
||||
}
|
||||
f32 root = __frsqrte(x);
|
||||
return 0.5f * root * (3.0f - x * (root * root));
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TUtil<double> {
|
||||
static inline double epsilon() { return 32.0f * FLT_EPSILON; }
|
||||
static inline double one() { return 1.0; }
|
||||
static inline double atan2(double x, double y) { return atan2(x, y); }
|
||||
static inline double asin(double x) { return asin(x); }
|
||||
static inline double halfPI() { return 1.5707963267948966; }
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct TVec3 {
|
||||
T x;
|
||||
@@ -155,6 +200,10 @@ struct TVec3<f32> : public Vec {
|
||||
};
|
||||
}
|
||||
|
||||
inline void mul(const TVec3<f32>& a) {
|
||||
mul(*this, a);
|
||||
}
|
||||
|
||||
inline TVec3<f32>& operator=(const Vec& b) {
|
||||
setTVec3f(&b.x, &this->x);
|
||||
return *this;
|
||||
@@ -250,6 +299,10 @@ struct TVec3<f32> : public Vec {
|
||||
};
|
||||
}
|
||||
|
||||
void scaleAdd(register f32 sc, const TVec3<f32>& a, const TVec3<f32>& b) {
|
||||
JMAVECScaleAdd(&a, &b, this, sc);
|
||||
}
|
||||
|
||||
void negateInternal(TVec3<f32>* dst) {
|
||||
register f32* rdst = &dst->x;
|
||||
const register f32* src = &x;
|
||||
@@ -286,7 +339,7 @@ struct TVec3<f32> : public Vec {
|
||||
}
|
||||
|
||||
void setLength(f32 len) {
|
||||
f32 sq = squared();
|
||||
f32 sq = squared();
|
||||
if (sq <= FLT_EPSILON * 32.0f) {
|
||||
return;
|
||||
}
|
||||
@@ -299,21 +352,33 @@ struct TVec3<f32> : public Vec {
|
||||
scale(norm * len);
|
||||
}
|
||||
|
||||
f32 setLength(const TVec3<f32>& other, f32 len) {
|
||||
f32 sq = other.squared();
|
||||
if (sq <= TUtil<f32>::epsilon()) {
|
||||
zero();
|
||||
return 0.0f;
|
||||
}
|
||||
f32 inv_norm = TUtil<f32>::inv_sqrt(sq);
|
||||
scale(inv_norm * len, other);
|
||||
return inv_norm * sq;
|
||||
}
|
||||
|
||||
f32 dot(const TVec3<f32>& other) const {
|
||||
register const f32* pThis = &x;
|
||||
register const f32* pOther = &other.x;
|
||||
register f32 otherReg;
|
||||
register f32 thisyz;
|
||||
register f32 res;
|
||||
register f32 thisyz;
|
||||
register f32 otheryz;
|
||||
register f32 otherxy;
|
||||
register f32 thisxy;
|
||||
asm {
|
||||
psq_l thisyz, 4(pThis), 0, 0
|
||||
psq_l otherReg, 4(pOther), 0, 0
|
||||
ps_mul thisyz, thisyz, otherReg
|
||||
psq_l otheryz, 4(pOther), 0, 0
|
||||
ps_mul thisyz, thisyz, otheryz
|
||||
psq_l thisxy, 0(pThis), 0, 0
|
||||
psq_l otherReg, 0(pOther), 0, 0
|
||||
ps_madd res, thisxy, otherReg, thisyz
|
||||
ps_sum0 res, res, thisyz, thisyz
|
||||
psq_l otherxy, 0(pOther), 0, 0
|
||||
ps_madd otheryz, thisxy, otherxy, thisyz
|
||||
ps_sum0 res, otheryz, thisyz, thisyz
|
||||
};
|
||||
return res;
|
||||
}
|
||||
@@ -448,44 +513,6 @@ struct TBox2 : TBox<TVec2<T> > {
|
||||
void set(f32 x0, f32 y0, f32 x1, f32 y1) { i.set(x0, y0); f.set(x1, y1); }
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct TUtil {
|
||||
static inline T clamp(T v, T min, T max) {
|
||||
if (v < min) {
|
||||
return min;
|
||||
}
|
||||
if (v > max) {
|
||||
return max;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TUtil<f32> {
|
||||
static inline f32 epsilon() { return 32.0f * FLT_EPSILON; }
|
||||
static inline f32 PI() { return 3.1415927f; }
|
||||
|
||||
static inline f32 clamp(f32 v, f32 min, f32 max) {
|
||||
if (v < min) {
|
||||
return min;
|
||||
}
|
||||
if (v > max) {
|
||||
return max;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TUtil<double> {
|
||||
static inline double epsilon() { return 32.0f * FLT_EPSILON; }
|
||||
static inline double one() { return 1.0; }
|
||||
static inline double atan2(double x, double y) { return atan2(x, y); }
|
||||
static inline double asin(double x) { return asin(x); }
|
||||
static inline double halfPI() { return 1.5707963267948966; }
|
||||
};
|
||||
|
||||
// clang-format on
|
||||
|
||||
} // namespace JGeometry
|
||||
|
||||
@@ -6,7 +6,9 @@
|
||||
void JMAMTXApplyScale(const Mtx, Mtx, f32, f32, f32);
|
||||
void JMAEulerToQuat(s16 param_0, s16 param_1, s16 param_2, Quaternion* param_3);
|
||||
void JMAQuatLerp(const Quaternion*, const Quaternion*, f32, Quaternion*);
|
||||
void JMAFastVECNormalize(register const Vec* src, register Vec* dst);
|
||||
void JMAFastVECNormalize(register const Vec* src, register Vec* dst);
|
||||
void JMAVECScaleAdd(register const Vec* vec1, register const Vec* vec2, register Vec* dst,
|
||||
register f32 scale);
|
||||
|
||||
inline int JMAAbs(int value) {
|
||||
return (value >> 0x1f ^ value) - (value >> 0x1f);
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "dolphin/gx/GXStruct.h"
|
||||
|
||||
class JPAEmitterWorkData;
|
||||
class JPABaseParticle;
|
||||
class JKRHeap;
|
||||
|
||||
/**
|
||||
@@ -78,21 +79,21 @@ public:
|
||||
u32 getType() const { return (mpData->mFlags >> 0) & 0x0F; }
|
||||
u32 getDirType() const { return (mpData->mFlags >> 4) & 0x07; }
|
||||
u32 getRotType() const { return (mpData->mFlags >> 7) & 0x07; }
|
||||
u32 getBasePlaneType() const { return (mpData->mFlags >> 10) & 0x07; }
|
||||
u32 getBasePlaneType() const { return (mpData->mFlags >> 10) & 0x01; }
|
||||
u32 getTilingS() const { return (mpData->mFlags >> 25) & 0x01; }
|
||||
u32 getTilingT() const { return (mpData->mFlags >> 26) & 0x01; }
|
||||
bool isGlblClrAnm() const { return !!(mpData->mFlags & 0x00001000); }
|
||||
bool isGlblTexAnm() const { return !!(mpData->mFlags & 0x00004000); }
|
||||
bool isPrjTex() const { return !!(mpData->mFlags & 0x00100000); }
|
||||
BOOL isGlblClrAnm() const { return mpData->mFlags & 0x00001000; }
|
||||
BOOL isGlblTexAnm() const { return mpData->mFlags & 0x00004000; }
|
||||
BOOL isPrjTex() const { return mpData->mFlags & 0x00100000; }
|
||||
bool isDrawFwdAhead() const { return !!(mpData->mFlags & 0x00200000); }
|
||||
bool isDrawPrntAhead() const { return !!(mpData->mFlags & 0x00400000); }
|
||||
bool isClipOn() const { return !!(mpData->mFlags & 0x00800000); }
|
||||
bool isTexCrdAnm() const { return !!(mpData->mFlags & 0x01000000); }
|
||||
BOOL isTexCrdAnm() const { return mpData->mFlags & 0x01000000; }
|
||||
bool isNoDrawParent() const { return !!(mpData->mFlags & 0x08000000); }
|
||||
bool isNoDrawChild() const { return !!(mpData->mFlags & 0x10000000); }
|
||||
|
||||
bool isPrmAnm() const { return !!(mpData->mClrFlg & 0x02); }
|
||||
bool isEnvAnm() const { return !!(mpData->mClrFlg & 0x08); }
|
||||
BOOL isPrmAnm() const { return mpData->mClrFlg & 0x02; }
|
||||
BOOL isEnvAnm() const { return mpData->mClrFlg & 0x08; }
|
||||
u8 getClrAnmType() const { return (mpData->mClrFlg >> 4) & 0x07; }
|
||||
s16 getClrAnmMaxFrm() const { return mpData->mClrAnmFrmMax; }
|
||||
void getPrmClr(GXColor* dst) { *dst = mpData->mClrPrm; }
|
||||
@@ -100,7 +101,7 @@ public:
|
||||
void getEnvClr(GXColor* dst) { *dst = mpData->mClrEnv; }
|
||||
void getEnvClr(s16 idx, GXColor* dst) { *dst = mpEnvClrAnmTbl[idx]; }
|
||||
|
||||
bool isTexAnm() const { return !!(mpData->mTexFlg & 0x01); }
|
||||
BOOL isTexAnm() const { return mpData->mTexFlg & 0x01; }
|
||||
u8 getTexAnmType() const { return (mpData->mTexFlg >> 2) & 0x07; }
|
||||
u32 getTexIdx() const { return mpData->mTexIdx; }
|
||||
u8 getTexIdx(u8 idx) const { return mpTexIdxAnimTbl[idx]; }
|
||||
@@ -111,6 +112,7 @@ public:
|
||||
u32 getClrLoopOfst(u32 param_1) const { return getClrLoopOfstMask() & param_1; }
|
||||
u8 getTexLoopOfstMask() const { return mpData->mTexAnmRndmMask; }
|
||||
u32 getTexLoopOfst(u8 param_1) const { return getTexLoopOfstMask() & param_1; }
|
||||
u8 getLoopOfstValue() { return mpData->mAnmRndm; }
|
||||
|
||||
f32 getIncTransX() const { return ((f32*)mpTexCrdMtxAnmTbl)[5]; }
|
||||
f32 getInitTransX() const { return ((f32*)mpTexCrdMtxAnmTbl)[0]; }
|
||||
@@ -141,4 +143,68 @@ struct JPAClrAnmKeyData {
|
||||
/* 0x2 */ GXColor color;
|
||||
};
|
||||
|
||||
void JPACalcTexIdxNormal(JPAEmitterWorkData*);
|
||||
void JPACalcTexIdxRepeat(JPAEmitterWorkData*);
|
||||
void JPACalcTexIdxReverse(JPAEmitterWorkData*);
|
||||
void JPACalcTexIdxMerge(JPAEmitterWorkData*);
|
||||
void JPACalcTexIdxRandom(JPAEmitterWorkData*);
|
||||
void JPACalcPrm(JPAEmitterWorkData*);
|
||||
void JPACalcEnv(JPAEmitterWorkData*);
|
||||
void JPACalcClrIdxNormal(JPAEmitterWorkData*);
|
||||
void JPACalcClrIdxRepeat(JPAEmitterWorkData*);
|
||||
void JPACalcClrIdxReverse(JPAEmitterWorkData*);
|
||||
void JPACalcClrIdxMerge(JPAEmitterWorkData*);
|
||||
void JPACalcClrIdxRandom(JPAEmitterWorkData*);
|
||||
|
||||
void JPACalcTexIdxNormal(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcTexIdxRepeat(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcTexIdxReverse(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcTexIdxMerge(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcTexIdxRandom(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcPrm(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcClrIdxNormal(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcClrIdxRepeat(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcClrIdxReverse(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcClrIdxMerge(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcClrIdxRandom(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcColorCopy(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
|
||||
void JPADrawStripe(JPAEmitterWorkData*);
|
||||
void JPADrawStripeX(JPAEmitterWorkData*);
|
||||
void JPADrawEmitterCallBackB(JPAEmitterWorkData*);
|
||||
void JPALoadTex(JPAEmitterWorkData*);
|
||||
void JPALoadTexAnm(JPAEmitterWorkData*);
|
||||
void JPAGenTexCrdMtxIdt(JPAEmitterWorkData*);
|
||||
void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData*);
|
||||
void JPAGenTexCrdMtxAnm(JPAEmitterWorkData*);
|
||||
void JPAGenTexCrdMtxPrj(JPAEmitterWorkData*);
|
||||
void JPALoadPosMtxCam(JPAEmitterWorkData*);
|
||||
void JPASetLineWidth(JPAEmitterWorkData*);
|
||||
void JPASetPointSize(JPAEmitterWorkData*);
|
||||
void JPARegistPrm(JPAEmitterWorkData*);
|
||||
void JPARegistEnv(JPAEmitterWorkData*);
|
||||
void JPARegistPrmEnv(JPAEmitterWorkData*);
|
||||
|
||||
void JPADrawPoint(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawLine(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawRotBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawRotDirection(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawDirection(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawRotation(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawDBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawRotYBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawYBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawParticleCallBack(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPALoadTexAnm(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPASetPointSize(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPASetLineWidth(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistAlpha(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistPrmAlpha(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistPrmAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
|
||||
#endif /* JPABASESHAPE_H */
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
|
||||
#include "dolphin/gx/GXStruct.h"
|
||||
|
||||
class JPAEmitterWorkData;
|
||||
class JPABaseParticle;
|
||||
|
||||
/**
|
||||
* @ingroup jsystem-jparticle
|
||||
*
|
||||
@@ -41,11 +44,46 @@ class JPAChildShape {
|
||||
public:
|
||||
/* 8027B038 */ JPAChildShape(u8 const*);
|
||||
|
||||
void getPrmClr(GXColor* dst) { *dst = mpData->mPrmClr; }
|
||||
void getEnvClr(GXColor* dst) { *dst = mpData->mEnvClr; }
|
||||
f32 getPosRndm() const { return mpData->mPosRndm; }
|
||||
f32 getBaseVel() const { return mpData->mBaseVel; }
|
||||
f32 getBaseVelRndm() const { return mpData->mBaseVelRndm; }
|
||||
f32 getVelInhRate() const { return mpData->mVelInfRate; }
|
||||
f32 getGravity() const { return mpData->mGravity; }
|
||||
f32 getScaleX() const { return mpData->mScaleX; }
|
||||
f32 getScaleY() const { return mpData->mScaleY; }
|
||||
f32 getScaleInhRate() const { return mpData->mInheritScale; }
|
||||
f32 getAlphaInhRate() const { return mpData->mInheritAlpha; }
|
||||
f32 getColorInhRate() const { return mpData->mInheritRGB; }
|
||||
void getPrmClr(GXColor* dst) const { *dst = mpData->mPrmClr; }
|
||||
u8 getPrmAlpha() const { return mpData->mPrmClr.a; }
|
||||
void getEnvClr(GXColor* dst) const { *dst = mpData->mEnvClr; }
|
||||
f32 getTiming() const { return mpData->mTiming; }
|
||||
s16 getLife() const { return mpData->mLife; }
|
||||
s16 getRate() const { return mpData->mRate; }
|
||||
u8 getStep() const { return mpData->mStep; }
|
||||
u8 getTexIdx() const { return mpData->mTexIdx; }
|
||||
s16 getRotInitSpeed() const { return mpData->mRotSpeed; }
|
||||
u32 getType() const { return mpData->mFlags & 0xF; }
|
||||
u32 getDirType() const { return (mpData->mFlags >> 4) & 7; }
|
||||
u32 getRotType() const { return (mpData->mFlags >> 7) & 7; }
|
||||
u32 getBasePlaneType() const { return (mpData->mFlags >> 10) & 1; }
|
||||
|
||||
BOOL isScaleInherited() const { return mpData->mFlags & 0x10000; }
|
||||
BOOL isAlphaInherited() const { return mpData->mFlags & 0x20000; }
|
||||
BOOL isColorInherited() const { return mpData->mFlags & 0x40000; }
|
||||
BOOL isClipOn() const { return mpData->mFlags & 0x100000; }
|
||||
BOOL isFieldAffected() const { return mpData->mFlags & 0x200000; }
|
||||
BOOL isScaleOutOn() const { return mpData->mFlags & 0x400000; }
|
||||
BOOL isAlphaOutOn() const { return mpData->mFlags & 0x800000; }
|
||||
BOOL isRotateOn() const { return mpData->mFlags & 0x1000000; }
|
||||
|
||||
public:
|
||||
/* 0x00 */ const JPAChildShapeData* mpData;
|
||||
};
|
||||
|
||||
void JPARegistChildPrmEnv(JPAEmitterWorkData*);
|
||||
|
||||
void JPACalcChildAlphaOut(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcChildScaleOut(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
|
||||
#endif /* JPACHILDSHAPE_H */
|
||||
|
||||
@@ -96,7 +96,10 @@ public:
|
||||
f32 getInitVelDir() { return mpData->mInitialVelDir; }
|
||||
f32 getInitVelDirSp() { return mpData->mSpread; }
|
||||
f32 getInitVelRndm() { return mpData->mInitialVelRndm; }
|
||||
f32 getInitVelRatio() { return mpData->mInitialVelRatio; }
|
||||
f32 getAirRes() { return mpData->mAirResist; }
|
||||
f32 getLifeTimeRndm() { return mpData->mLifeTimeRndm; }
|
||||
f32 getMomentRndm() { return mpData->mMoment; }
|
||||
|
||||
public:
|
||||
/* 0x00 */ const JPADynamicsBlockData* mpData;
|
||||
|
||||
@@ -47,10 +47,10 @@ struct JPAEmitterWorkData {
|
||||
/* 0x1B4 */ Mtx mPrjMtx;
|
||||
/* 0x1E4 */ JPAList<JPABaseParticle>* mpAlivePtcl;
|
||||
/* 0x1E8 */ JPANode<JPABaseParticle>* mpCurNode;
|
||||
/* 0x1EC */ u32 mVolumeAngleNum;
|
||||
/* 0x1F0 */ u32 mVolumeAngleMax;
|
||||
/* 0x1F4 */ u32 mVolumeX;
|
||||
/* 0x1F8 */ u32 mDivNumber;
|
||||
/* 0x1EC */ s32 mVolumeAngleNum;
|
||||
/* 0x1F0 */ s32 mVolumeAngleMax;
|
||||
/* 0x1F4 */ s32 mVolumeX;
|
||||
/* 0x1F8 */ s32 mDivNumber;
|
||||
/* 0x1FC */ f32 mScaleAnm;
|
||||
/* 0x200 */ u32 mDirType;
|
||||
/* 0x204 */ u32 mRotType;
|
||||
@@ -93,8 +93,8 @@ enum {
|
||||
*/
|
||||
class JPABaseEmitter {
|
||||
public:
|
||||
/* 8027E5EC */ ~JPABaseEmitter();
|
||||
/* 8027E64C */ JPABaseEmitter();
|
||||
/* 8027E5EC */ ~JPABaseEmitter() {}
|
||||
/* 8027E64C */ JPABaseEmitter() : mLink(this) {}
|
||||
/* 8027E6EC */ void init(JPAEmitterManager*, JPAResource*);
|
||||
/* 8027EDD4 */ bool processTillStartFrame();
|
||||
/* 8027EE14 */ bool processTermination();
|
||||
@@ -223,7 +223,7 @@ public:
|
||||
/* 0x44 */ f32 mRndmDirSpeed;
|
||||
/* 0x48 */ f32 mAirResist;
|
||||
/* 0x4C */ JGeometry::TVec3<s16> mLocalRot;
|
||||
/* 0x52 */ u16 mLifeTime;
|
||||
/* 0x52 */ s16 mLifeTime;
|
||||
/* 0x54 */ u16 mVolumeSize;
|
||||
/* 0x56 */ u8 mRateStep;
|
||||
/* 0x58 */ JSULink<JPABaseEmitter> mLink;
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
#include "dolphin/types.h"
|
||||
|
||||
class JPAEmitterWorkData;
|
||||
|
||||
/**
|
||||
* @ingroup jsystem-jparticle
|
||||
*
|
||||
@@ -28,7 +30,7 @@ public:
|
||||
/* 8027B13C */ JPAExTexShape(u8 const*);
|
||||
|
||||
const f32* getIndTexMtx() const { return &mpData->mIndTexMtx[0][0]; }
|
||||
s32 getExpScale() const { return mpData->mExpScale; }
|
||||
s8 getExpScale() const { return mpData->mExpScale; }
|
||||
u8 getIndTexIdx() const { return mpData->mIndTexIdx; }
|
||||
u8 getSecTexIdx() const { return mpData->mSecTexIdx; }
|
||||
bool isUseIndirect() const { return !!(mpData->mFlags & 0x01); }
|
||||
@@ -38,4 +40,6 @@ public:
|
||||
const JPAExTexShapeData* mpData;
|
||||
};
|
||||
|
||||
void JPALoadExTex(JPAEmitterWorkData*);
|
||||
|
||||
#endif /* JPAEXTEXSHAPE_H */
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
|
||||
#include "dolphin/types.h"
|
||||
|
||||
class JPAEmitterWorkData;
|
||||
class JPABaseParticle;
|
||||
|
||||
/**
|
||||
* @ingroup jsystem-jparticle
|
||||
*
|
||||
@@ -52,6 +55,7 @@ public:
|
||||
f32 getScaleInValueY() const { return mpData->mScaleInValueY; }
|
||||
f32 getScaleOutValueX() const { return mpData->mScaleOutValueX; }
|
||||
f32 getScaleOutValueY() const { return mpData->mScaleOutValueY; }
|
||||
f32 getScaleRndm() const { return mpData->mScaleOutRandom; }
|
||||
s16 getScaleAnmCycleX() const { return mpData->mScaleAnmCycleX; }
|
||||
s16 getScaleAnmCycleY() const { return mpData->mScaleAnmCycleY; }
|
||||
f32 getAlphaInTiming() const { return mpData->mAlphaInTiming; }
|
||||
@@ -60,7 +64,13 @@ public:
|
||||
f32 getAlphaOutValue() const { return mpData->mAlphaOutValue; }
|
||||
f32 getAlphaBaseValue() const { return mpData->mAlphaBaseValue; }
|
||||
f32 getAlphaFreq() const { return mpData->mAlphaWaveFrequency; }
|
||||
f32 getAlphaFreqRndm() const { return mpData->mAlphaWaveRandom; }
|
||||
f32 getAlphaAmp() const { return mpData->mAlphaWaveAmplitude; }
|
||||
f32 getRotateInitAngle() const { return mpData->mRotateAngle; }
|
||||
f32 getRotateRndmAngle() const { return mpData->mRotateAngleRandom; }
|
||||
f32 getRotateInitSpeed() const { return mpData->mRotateSpeed; }
|
||||
f32 getRotateRndmSpeed() const { return mpData->mRotateSpeedRandom; }
|
||||
f32 getRotateDirection() const { return mpData->mRotateDirection; }
|
||||
f32 getScaleIncRateX() const { return mScaleIncRateX; }
|
||||
f32 getScaleDecRateX() const { return mScaleDecRateX; }
|
||||
f32 getScaleIncRateY() const { return mScaleIncRateY; }
|
||||
@@ -68,6 +78,16 @@ public:
|
||||
f32 getAlphaIncRate() const { return mAlphaIncRate; }
|
||||
f32 getAlphaDecRate() const { return mAlphaDecRate; }
|
||||
|
||||
BOOL isEnableScaleAnm() const { return mpData->mFlags & 1; }
|
||||
BOOL isScaleXYDiff() const { return mpData->mFlags & 2; }
|
||||
u32 getScaleAnmTypeX() const { return (mpData->mFlags >> 8) & 3; }
|
||||
u32 getScaleAnmTypeY() const { return (mpData->mFlags >> 10) & 3; }
|
||||
u32 getScaleCenterX() const { return (mpData->mFlags >> 12) & 3; }
|
||||
u32 getScaleCenterY() const { return (mpData->mFlags >> 14) & 3; }
|
||||
BOOL isEnableAlphaAnm() const { return mpData->mFlags & 0x10000; }
|
||||
BOOL isEnableAlphaFlick() const { return mpData->mFlags & 0x20000; }
|
||||
BOOL isEnableRotateAnm() const { return mpData->mFlags & 0x1000000; }
|
||||
|
||||
private:
|
||||
/* 0x00 */ const JPAExtraShapeData* mpData;
|
||||
/* 0x04 */ f32 mAlphaIncRate;
|
||||
@@ -78,4 +98,15 @@ private:
|
||||
/* 0x18 */ f32 mScaleDecRateY;
|
||||
};
|
||||
|
||||
void JPACalcAlphaFlickAnm(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcAlphaAnm(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcScaleX(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcScaleY(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcScaleCopy(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcScaleAnmNormal(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcScaleAnmRepeatX(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcScaleAnmReverseX(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcScaleAnmRepeatY(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPACalcScaleAnmReverseY(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
|
||||
#endif /* JPAEXTRASHAPE_H */
|
||||
|
||||
@@ -1,6 +1,174 @@
|
||||
#ifndef JPAFIELDBLOCK_H
|
||||
#define JPAFIELDBLOCK_H
|
||||
|
||||
#include "JSystem/JGeometry.h"
|
||||
#include "dolphin/types.h"
|
||||
|
||||
class JKRHeap;
|
||||
class JPAEmitterWorkData;
|
||||
class JPABaseParticle;
|
||||
class JPAFieldBlock;
|
||||
|
||||
class JPAFieldBase {
|
||||
public:
|
||||
/* 8027BDEC */ void calcAffect(JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027BF18 */ f32 calcFadeAffect(JPAFieldBlock*, f32) const;
|
||||
|
||||
/* 8027D3AC */ virtual ~JPAFieldBase() {}
|
||||
/* 80276A8C */ virtual void prepare(JPAEmitterWorkData*, JPAFieldBlock*) {}
|
||||
virtual void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*) = 0;
|
||||
|
||||
/* 0x04 */ JGeometry::TVec3<f32> mAccel;
|
||||
};
|
||||
|
||||
class JPAFieldVortex : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C56C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C674 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D564 */ ~JPAFieldVortex() {}
|
||||
|
||||
/* 0x10 */ JGeometry::TVec3<f32> field_0x10;
|
||||
/* 0x1C */ f32 field_0x1c;
|
||||
/* 0x20 */ f32 field_0x20;
|
||||
};
|
||||
|
||||
class JPAFieldSpin : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027CE64 */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027CFA8 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D3F4 */ ~JPAFieldSpin() {}
|
||||
|
||||
/* 0x10 */ JGeometry::TVec3<f32> field_0x10;
|
||||
/* 0x1C */ JGeometry::TVec3<f32> field_0x1c;
|
||||
/* 0x28 */ JGeometry::TVec3<f32> field_0x28;
|
||||
};
|
||||
|
||||
class JPAFieldRandom : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027CCCC */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D4AC */ ~JPAFieldRandom() {}
|
||||
};
|
||||
|
||||
class JPAFieldNewton : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C36C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C3E0 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D5C0 */ ~JPAFieldNewton() {}
|
||||
|
||||
/* 0x10 */ JGeometry::TVec3<f32> mDir;
|
||||
/* 0x1C */ f32 mCutoff;
|
||||
};
|
||||
|
||||
class JPAFieldMagnet : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C24C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C29C */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D61C */ ~JPAFieldMagnet() {}
|
||||
|
||||
/* 0x10 */ JGeometry::TVec3<f32> mDir;
|
||||
};
|
||||
|
||||
class JPAFieldGravity : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027BFB4 */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C054 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D6D4 */ ~JPAFieldGravity() {}
|
||||
};
|
||||
|
||||
class JPAFieldDrag : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027CDE4 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D450 */ ~JPAFieldDrag() {}
|
||||
};
|
||||
|
||||
class JPAFieldConvection : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C814 */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027CA94 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D508 */ ~JPAFieldConvection() {}
|
||||
|
||||
/* 0x10 */ JGeometry::TVec3<f32> field_0x10;
|
||||
/* 0x1C */ JGeometry::TVec3<f32> field_0x1c;
|
||||
/* 0x28 */ JGeometry::TVec3<f32> field_0x28;
|
||||
};
|
||||
|
||||
class JPAFieldAir : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C07C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C1B8 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D678 */ ~JPAFieldAir() {}
|
||||
};
|
||||
|
||||
// unknown name
|
||||
class JPAFieldBlockData {
|
||||
public:
|
||||
/* 0x00 */ u8 mMagic[4];
|
||||
/* 0x04 */ u32 mSize;
|
||||
/* 0x08 */ u32 mFlags;
|
||||
/* 0x0C */ JGeometry::TVec3<f32> mPos;
|
||||
/* 0x18 */ JGeometry::TVec3<f32> mDir;
|
||||
/* 0x24 */ f32 mMag;
|
||||
/* 0x28 */ f32 mMagRndm;
|
||||
/* 0x2C */ f32 mVal1;
|
||||
/* 0x30 */ f32 mFadeInTime;
|
||||
/* 0x34 */ f32 mFadeOutTime;
|
||||
/* 0x38 */ f32 mEnTime;
|
||||
/* 0x3C */ f32 mDisTime;
|
||||
/* 0x40 */ u8 mCycle;
|
||||
};
|
||||
|
||||
class JPAFieldBlock {
|
||||
public:
|
||||
/* 8027D088 */ JPAFieldBlock(u8 const*, JKRHeap*);
|
||||
/* 8027D0C0 */ void init(JKRHeap*);
|
||||
|
||||
u32 getType() { return mpData->mFlags & 0xF; }
|
||||
u32 getAddType() { return (mpData->mFlags >> 8) & 3; }
|
||||
u32 getSttFlag() { return mpData->mFlags >> 16; }
|
||||
bool checkStatus(u16 flag) { return flag & getSttFlag(); }
|
||||
f32 getMagRndm() { return mpData->mMagRndm; }
|
||||
f32 getVal1() { return mpData->mVal1; }
|
||||
f32 getFadeInTime() { return mpData->mFadeInTime; }
|
||||
f32 getFadeOutTime() { return mpData->mFadeOutTime; }
|
||||
f32 getEnTime() { return mpData->mEnTime; }
|
||||
f32 getDisTime() { return mpData->mDisTime; }
|
||||
u8 getCycle() { return mpData->mCycle; }
|
||||
f32 getFadeInRate() { return mFadeInRate; }
|
||||
f32 getFadeOutRate() { return mFadeOutRate; }
|
||||
JGeometry::TVec3<f32>& getPos() { return mPos; }
|
||||
JGeometry::TVec3<f32>& getDir() { return mDir; }
|
||||
f32 getMag() { return mMag; }
|
||||
void getPosOrig(JGeometry::TVec3<f32>* pos) { pos->set(mpData->mPos); }
|
||||
void getDirOrig(JGeometry::TVec3<f32>* dir) { dir->set(mpData->mDir); }
|
||||
f32 getMagOrig() { return mpData->mMag; }
|
||||
void initOpParam() {
|
||||
getPosOrig(&mPos);
|
||||
getDirOrig(&mDir);
|
||||
mMag = getMagOrig();
|
||||
}
|
||||
void prepare(JPAEmitterWorkData* work) { mpField->prepare(work, this); }
|
||||
void calc(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { mpField->calc(work, this, ptcl); }
|
||||
|
||||
private:
|
||||
/* 0x00 */ const JPAFieldBlockData* mpData;
|
||||
/* 0x04 */ JPAFieldBase* mpField;
|
||||
/* 0x08 */ f32 mFadeInRate;
|
||||
/* 0x0C */ f32 mFadeOutRate;
|
||||
/* 0x10 */ JGeometry::TVec3<f32> mPos;
|
||||
/* 0x1C */ JGeometry::TVec3<f32> mDir;
|
||||
/* 0x28 */ f32 mMag;
|
||||
|
||||
enum Type {
|
||||
/* 0x0 */ FIELD_GRAVITY,
|
||||
/* 0x1 */ FIELD_AIR,
|
||||
/* 0x2 */ FIELD_MAGNET,
|
||||
/* 0x3 */ FIELD_NEWTON,
|
||||
/* 0x4 */ FIELD_VORTEX,
|
||||
/* 0x5 */ FIELD_RANDOM,
|
||||
/* 0x6 */ FIELD_DRAG,
|
||||
/* 0x7 */ FIELD_CONVECTION,
|
||||
/* 0x8 */ FIELD_SPIN,
|
||||
};
|
||||
};
|
||||
|
||||
#endif /* JPAFIELDBLOCK_H */
|
||||
|
||||
@@ -9,7 +9,9 @@
|
||||
*/
|
||||
struct JPAKeyBlock {
|
||||
/* 8027D730 */ JPAKeyBlock(u8 const*);
|
||||
/* 8027D740 */ void calc(f32);
|
||||
/* 8027D740 */ f32 calc(f32);
|
||||
|
||||
u8 getID() { return mDataStart[8]; }
|
||||
|
||||
const u8* mDataStart;
|
||||
const f32* field_0x4;
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef JPALIST_H
|
||||
#define JPALIST_H
|
||||
|
||||
#include "dolphin/types.h"
|
||||
|
||||
/**
|
||||
* @ingroup jsystem-jparticle
|
||||
*
|
||||
@@ -15,9 +17,10 @@ struct JPANode {
|
||||
JPANode<T>* getPrev() { return mpPrev; }
|
||||
JPANode<T>* getNext() { return mpNext; }
|
||||
T* getObject() { return &mData; }
|
||||
JPANode<T>* mpPrev;
|
||||
JPANode<T>* mpNext;
|
||||
T mData;
|
||||
|
||||
/* 0x00 */ JPANode<T>* mpPrev;
|
||||
/* 0x04 */ JPANode<T>* mpNext;
|
||||
/* 0x08 */ T mData;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -26,9 +29,9 @@ struct JPANode {
|
||||
*/
|
||||
template <class T>
|
||||
struct JPAList {
|
||||
JPANode<T>* mpFirst;
|
||||
JPANode<T>* mpLast;
|
||||
u32 mNum;
|
||||
/* 0x00 */ JPANode<T>* mpFirst;
|
||||
/* 0x04 */ JPANode<T>* mpLast;
|
||||
/* 0x08 */ u32 mNum;
|
||||
|
||||
JPAList() : mpFirst(NULL), mpLast(NULL), mNum() {}
|
||||
|
||||
@@ -104,6 +107,27 @@ struct JPAList {
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
JPANode<T>* erase(JPANode<T>* node) {
|
||||
if (node->mpNext != NULL && node->mpPrev != NULL) {
|
||||
node->mpPrev->mpNext = node->mpNext;
|
||||
node->mpNext->mpPrev = node->mpPrev;
|
||||
mNum--;
|
||||
} else if (node->mpNext != NULL) {
|
||||
node->mpNext->mpPrev = NULL;
|
||||
mpFirst = node->mpNext;
|
||||
mNum--;
|
||||
} else if (node->mpPrev != NULL) {
|
||||
node->mpPrev->mpNext = NULL;
|
||||
mpLast = node->mpPrev;
|
||||
mNum--;
|
||||
} else {
|
||||
mpLast = NULL;
|
||||
mpFirst = NULL;
|
||||
mNum--;
|
||||
}
|
||||
return node;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -2,11 +2,8 @@
|
||||
#define JPAPARTICLE_H
|
||||
|
||||
#include "dolphin/gx/GXStruct.h"
|
||||
|
||||
#include "JSystem/JGeometry.h"
|
||||
|
||||
#include "JSystem/JParticle/JPAList.h"
|
||||
|
||||
class JKRHeap;
|
||||
class JPABaseEmitter;
|
||||
class JPABaseParticle;
|
||||
@@ -24,9 +21,9 @@ class JPABaseParticle {
|
||||
public:
|
||||
/* 8027EFEC */ void init_p(JPAEmitterWorkData*);
|
||||
/* 8027F8C8 */ void init_c(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
/* 8027FFD0 */ void calc_p(JPAEmitterWorkData*);
|
||||
/* 80280260 */ void calc_c(JPAEmitterWorkData*);
|
||||
/* 802804C8 */ void canCreateChild(JPAEmitterWorkData*);
|
||||
/* 8027FFD0 */ bool calc_p(JPAEmitterWorkData*);
|
||||
/* 80280260 */ bool calc_c(JPAEmitterWorkData*);
|
||||
/* 802804C8 */ bool canCreateChild(JPAEmitterWorkData*);
|
||||
/* 80280548 */ f32 getWidth(JPABaseEmitter const*) const;
|
||||
/* 80280568 */ f32 getHeight(JPABaseEmitter const*) const;
|
||||
int getAge() { return mAge; }
|
||||
@@ -39,6 +36,7 @@ public:
|
||||
f32 getParticleScaleY() const { return mParticleScaleY; }
|
||||
void setStatus(u32 flag) { mStatus |= flag; }
|
||||
u32 checkStatus(u32 flag) { return mStatus & flag; }
|
||||
void initStatus(u32 status) { mStatus = status; }
|
||||
void setInvisibleParticleFlag() { setStatus(8); }
|
||||
void setDeleteParticleFlag() { setStatus(2); }
|
||||
void getVelVec(JGeometry::TVec3<f32>& vec) const { vec.set(mVelocity); }
|
||||
@@ -50,9 +48,9 @@ public:
|
||||
/* 0x0C */ JGeometry::TVec3<f32> mLocalPosition;
|
||||
/* 0x18 */ JGeometry::TVec3<f32> mOffsetPosition;
|
||||
/* 0x24 */ JGeometry::TVec3<f32> mVelocity;
|
||||
/* 0x30 */ Vec mVelType1;
|
||||
/* 0x3C */ Vec mVelType0;
|
||||
/* 0x48 */ Vec mVelType2;
|
||||
/* 0x30 */ JGeometry::TVec3<f32> mVelType1;
|
||||
/* 0x3C */ JGeometry::TVec3<f32> mVelType0;
|
||||
/* 0x48 */ JGeometry::TVec3<f32> mVelType2;
|
||||
/* 0x54 */ JGeometry::TVec3<f32> mBaseAxis;
|
||||
/* 0x60 */ f32 mParticleScaleX;
|
||||
/* 0x64 */ f32 mParticleScaleY;
|
||||
@@ -63,10 +61,10 @@ public:
|
||||
/* 0x78 */ u32 field_0x78;
|
||||
/* 0x7C */ u32 mStatus;
|
||||
/* 0x80 */ s16 mAge;
|
||||
/* 0x82 */ u16 mLifeTime;
|
||||
/* 0x82 */ s16 mLifeTime;
|
||||
/* 0x84 */ f32 mTime;
|
||||
/* 0x88 */ u16 mRotateAngle;
|
||||
/* 0x8A */ u16 mRotateSpeed;
|
||||
/* 0x8A */ s16 mRotateSpeed;
|
||||
/* 0x8C */ GXColor mPrmClr;
|
||||
/* 0x90 */ GXColor mEnvClr;
|
||||
/* 0x94 */ u8 mTexAnmIdx;
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef JPARANDOM_H
|
||||
#define JPARANDOM_H
|
||||
|
||||
#include "dolphin/types.h"
|
||||
|
||||
/**
|
||||
* @ingroup jsystem-jparticle
|
||||
*
|
||||
@@ -27,8 +29,7 @@ public:
|
||||
}
|
||||
|
||||
f32 get_rndm_zh() {
|
||||
f32 f = get_rndm_f();
|
||||
return f - 0.5f;
|
||||
return get_rndm_f() - 0.5f;
|
||||
}
|
||||
|
||||
s16 get_rndm_ss() { return (s16)(get_rndm_u() >> 16); }
|
||||
@@ -37,4 +38,4 @@ public:
|
||||
u32 mSeed;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -47,13 +47,15 @@ public:
|
||||
u16 getUsrIdx() const { return mUsrIdx; }
|
||||
|
||||
public:
|
||||
/* 0x00 */ void** mpCalcEmitterFuncList;
|
||||
/* 0x04 */ void** mpDrawEmitterFuncList;
|
||||
/* 0x08 */ void** mpDrawEmitterChildFuncList;
|
||||
/* 0x0C */ void** mpCalcParticleFuncList;
|
||||
/* 0x10 */ void** mpDrawParticleFuncList;
|
||||
/* 0x14 */ void** mpCalcParticleChildFuncList;
|
||||
/* 0x18 */ void** mpDrawParticleChildFuncList;
|
||||
typedef void (*EmitterFunc)(JPAEmitterWorkData*);
|
||||
typedef void (*ParticleFunc)(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
/* 0x00 */ EmitterFunc* mpCalcEmitterFuncList;
|
||||
/* 0x04 */ EmitterFunc* mpDrawEmitterFuncList;
|
||||
/* 0x08 */ EmitterFunc* mpDrawEmitterChildFuncList;
|
||||
/* 0x0C */ ParticleFunc* mpCalcParticleFuncList;
|
||||
/* 0x10 */ ParticleFunc* mpDrawParticleFuncList;
|
||||
/* 0x14 */ ParticleFunc* mpCalcParticleChildFuncList;
|
||||
/* 0x18 */ ParticleFunc* mpDrawParticleChildFuncList;
|
||||
|
||||
/* 0x1C */ JPABaseShape* mpBaseShape;
|
||||
/* 0x20 */ JPAExtraShape* mpExtraShape;
|
||||
|
||||
@@ -1,4 +1,14 @@
|
||||
#ifndef JPARESOURCELOADER_H
|
||||
#define JPARESOURCELOADER_H
|
||||
|
||||
#include "dolphin/types.h"
|
||||
|
||||
class JPAResourceManager;
|
||||
|
||||
class JPAResourceLoader {
|
||||
public:
|
||||
/* 8027D8A0 */ JPAResourceLoader(u8 const*, JPAResourceManager*);
|
||||
/* 8027D8E0 */ void load_jpc(u8 const*, JPAResourceManager*);
|
||||
};
|
||||
|
||||
#endif /* JPARESOURCELOADER_H */
|
||||
|
||||
@@ -42,8 +42,8 @@ inline void C_VECAdd(register const Vec* a, register const Vec* b, register Vec*
|
||||
asm {
|
||||
psq_l axy, 0(a), 0, 0
|
||||
psq_l bxy, 0(b), 0, 0
|
||||
ps_add axy, axy, bxy
|
||||
psq_st axy, 0(ab), 0, 0
|
||||
ps_add bxy, axy, bxy
|
||||
psq_st bxy, 0(ab), 0, 0
|
||||
psq_l az, 8(a), 1, 0
|
||||
psq_l bz, 8(b), 1, 0
|
||||
ps_add sumz, az, bz
|
||||
|
||||
@@ -148,7 +148,6 @@ void JPARegistEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
*/
|
||||
void JPACalcClrIdxNormal(JPAEmitterWorkData* work) {
|
||||
JPABaseShape* bsp = work->mpRes->getBsp();
|
||||
// can't get the extsh to appear in the right spot...
|
||||
s16 keyFrame;
|
||||
if (work->mpEmtr->mTick < bsp->getClrAnmMaxFrm()) {
|
||||
keyFrame = work->mpEmtr->mTick;
|
||||
@@ -1447,4 +1446,4 @@ void JPABaseShape::setGX(JPAEmitterWorkData* work) const {
|
||||
GXSetTevDirect(GX_TEVSTAGE0);
|
||||
GXSetTevDirect(GX_TEVSTAGE1);
|
||||
GXSetZCompLoc(getZCompLoc());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,18 +9,6 @@
|
||||
#include "dolphin/gx.h"
|
||||
#include "dolphin/os.h"
|
||||
|
||||
//
|
||||
// Types:
|
||||
//
|
||||
|
||||
//
|
||||
// Forward References:
|
||||
//
|
||||
|
||||
//
|
||||
// Declarations:
|
||||
//
|
||||
|
||||
/* 8027AEBC-8027AFDC 2757FC 0120+00 0/0 1/1 0/0 .text JPARegistChildPrmEnv__FP18JPAEmitterWorkData
|
||||
*/
|
||||
void JPARegistChildPrmEnv(JPAEmitterWorkData* work) {
|
||||
@@ -50,7 +38,6 @@ void JPACalcChildAlphaOut(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
/* 8027B008-8027B038 275948 0030+00 0/0 1/1 0/0 .text
|
||||
* JPACalcChildScaleOut__FP18JPAEmitterWorkDataP15JPABaseParticle */
|
||||
void JPACalcChildScaleOut(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
// literal
|
||||
ptcl->mParticleScaleX = ptcl->mScaleOut * (1.0f - ptcl->mTime);
|
||||
ptcl->mParticleScaleY = ptcl->mAlphaWaveRandom * (1.0f - ptcl->mTime);
|
||||
}
|
||||
@@ -58,4 +45,4 @@ void JPACalcChildScaleOut(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
/* 8027B038-8027B040 -00001 0008+00 0/0 0/0 0/0 .text __ct__13JPAChildShapeFPCUc */
|
||||
JPAChildShape::JPAChildShape(u8 const* pData) {
|
||||
mpData = (JPAChildShapeData*)pData;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,57 +4,8 @@
|
||||
//
|
||||
|
||||
#include "JSystem/JParticle/JPADynamicsBlock.h"
|
||||
#include "JSystem/JMath/JMATrigonometric.h"
|
||||
#include "JSystem/JParticle/JPAEmitter.h"
|
||||
#include "dol2asm.h"
|
||||
|
||||
//
|
||||
// Types:
|
||||
//
|
||||
|
||||
//
|
||||
// Forward References:
|
||||
//
|
||||
|
||||
extern "C" static void JPAVolumePoint(JPAEmitterWorkData*);
|
||||
extern "C" static void JPAVolumeLine(JPAEmitterWorkData*);
|
||||
extern "C" static void JPAVolumeCircle(JPAEmitterWorkData*);
|
||||
extern "C" static void JPAVolumeCube(JPAEmitterWorkData*);
|
||||
extern "C" static void JPAVolumeSphere(JPAEmitterWorkData*);
|
||||
extern "C" static void JPAVolumeCylinder(JPAEmitterWorkData*);
|
||||
extern "C" static void JPAVolumeTorus(JPAEmitterWorkData*);
|
||||
extern "C" void __ct__16JPADynamicsBlockFPCUc();
|
||||
extern "C" void init__16JPADynamicsBlockFv();
|
||||
extern "C" void create__16JPADynamicsBlockFP18JPAEmitterWorkData();
|
||||
|
||||
//
|
||||
// External References:
|
||||
//
|
||||
|
||||
extern "C" void createParticle__14JPABaseEmitterFv();
|
||||
extern "C" u8 sincosTable___5JMath[65536];
|
||||
|
||||
//
|
||||
// Declarations:
|
||||
//
|
||||
|
||||
/* ############################################################################################## */
|
||||
/* 80455310-80455314 003910 0004+00 7/7 0/0 0/0 .sdata2 @2287 */
|
||||
SECTION_SDATA2 static u8 lit_2287[4] = {
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
};
|
||||
|
||||
/* 80455314-80455318 003914 0004+00 7/7 0/0 0/0 .sdata2 @2288 */
|
||||
SECTION_SDATA2 static f32 lit_2288 = 1.0f;
|
||||
|
||||
/* 80455318-80455320 003918 0004+04 3/3 0/0 0/0 .sdata2 @2289 */
|
||||
SECTION_SDATA2 static f32 lit_2289[1 + 1 /* padding */] = {
|
||||
0.5f,
|
||||
/* padding */
|
||||
0.0f,
|
||||
};
|
||||
|
||||
/* 8027B144-8027B220 275A84 00DC+00 1/1 0/0 0/0 .text JPAVolumePoint__FP18JPAEmitterWorkData */
|
||||
void JPAVolumePoint(JPAEmitterWorkData* work) {
|
||||
@@ -64,12 +15,6 @@ void JPAVolumePoint(JPAEmitterWorkData* work) {
|
||||
work->mVelAxis.set(work->mVelOmni.x, 0.0f, work->mVelOmni.z);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ############################################################################################## */
|
||||
/* 80455320-80455328 003920 0008+00 6/6 0/0 0/0 .sdata2 @2321 */
|
||||
SECTION_SDATA2 static f64 lit_2321 = 4503601774854144.0 /* cast s32 to float */;
|
||||
|
||||
/* 8027B220-8027B33C 275B60 011C+00 1/1 0/0 0/0 .text JPAVolumeLine */
|
||||
void JPAVolumeLine(JPAEmitterWorkData* work) {
|
||||
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
|
||||
@@ -85,17 +30,13 @@ void JPAVolumeLine(JPAEmitterWorkData* work) {
|
||||
work->mVelAxis.set(0.0f, 0.0f, work->mVolumePos.z);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* 8027B33C-8027B4E8 275C7C 01AC+00 1/1 0/0 0/0 .text JPAVolumeCircle */
|
||||
// regalloc. Could be issue with mul asm implementations
|
||||
#ifdef NONMATCHING
|
||||
// NONMATCHING regalloc. Could be issue with mul asm implementations
|
||||
void JPAVolumeCircle(JPAEmitterWorkData* work) {
|
||||
s16 thetai;
|
||||
f32 theta;
|
||||
f32 distance;
|
||||
f32 sizeXZ;
|
||||
f32 temp;
|
||||
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
|
||||
theta = (s16)((work->mVolumeEmitIdx << 16) / work->mEmitCount);
|
||||
thetai = theta * work->mVolumeSweep;
|
||||
@@ -116,14 +57,6 @@ void JPAVolumeCircle(JPAEmitterWorkData* work) {
|
||||
work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void JPAVolumeCircle(JPAEmitterWorkData* param_0) {
|
||||
// NONMATCHING
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* 8027B4E8-8027B5F0 275E28 0108+00 1/1 0/0 0/0 .text JPAVolumeCube */
|
||||
void JPAVolumeCube(JPAEmitterWorkData* work) {
|
||||
work->mVolumePos.set(work->mpEmtr->get_r_zh() * work->mVolumeSize,
|
||||
@@ -133,32 +66,64 @@ void JPAVolumeCube(JPAEmitterWorkData* work) {
|
||||
work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ############################################################################################## */
|
||||
/* 80455328-80455330 003928 0004+04 1/1 0/0 0/0 .sdata2 @2501 */
|
||||
SECTION_SDATA2 static f32 lit_2501[1 + 1 /* padding */] = {
|
||||
32768.0f,
|
||||
/* padding */
|
||||
0.0f,
|
||||
};
|
||||
|
||||
/* 80455330-80455338 003930 0008+00 1/1 0/0 0/0 .sdata2 @2503 */
|
||||
SECTION_SDATA2 static f64 lit_2503 = 4503599627370496.0 /* cast u32 to float */;
|
||||
|
||||
/* 8027B5F0-8027B87C 275F30 028C+00 1/1 0/0 0/0 .text JPAVolumeSphere__FP18JPAEmitterWorkData */
|
||||
static void JPAVolumeSphere(JPAEmitterWorkData* param_0) {
|
||||
// NONMATCHING
|
||||
static void JPAVolumeSphere(JPAEmitterWorkData* work) {
|
||||
s16 phi, theta;
|
||||
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
|
||||
phi = (u16)(work->mVolumeX * 0x8000 / (work->mDivNumber - 1) + 0x4000);
|
||||
f32 tmp = (u16)(work->mVolumeAngleNum * 0x10000 / (work->mVolumeAngleMax - 1));
|
||||
theta = tmp * work->mVolumeSweep + 0x8000;
|
||||
work->mVolumeAngleNum++;
|
||||
if (work->mVolumeAngleNum == work->mVolumeAngleMax) {
|
||||
work->mVolumeAngleNum = 0;
|
||||
work->mVolumeX++;
|
||||
if (work->mVolumeX * 2 < work->mDivNumber) {
|
||||
work->mVolumeAngleMax = work->mVolumeAngleMax != 1 ?
|
||||
work->mVolumeAngleMax + 4 : work->mVolumeAngleMax + 3;
|
||||
} else {
|
||||
work->mVolumeAngleMax = work->mVolumeAngleMax != 4 ? work->mVolumeAngleMax - 4 : 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
phi = work->mpEmtr->get_r_ss() >> 1;
|
||||
theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
|
||||
}
|
||||
|
||||
f32 rnd = work->mpEmtr->get_r_f();
|
||||
if (work->mpEmtr->checkFlag(JPADynFlag_FixedDensity)) {
|
||||
rnd = 1.0f - rnd * rnd * rnd;
|
||||
}
|
||||
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
|
||||
work->mVolumePos.set(rad * JMASCos(phi) * JMASSin(theta), -rad * JMASSin(phi),
|
||||
rad * JMASCos(phi) * JMASCos(theta));
|
||||
work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
|
||||
work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
|
||||
}
|
||||
|
||||
/* 8027B87C-8027B9F8 2761BC 017C+00 1/1 0/0 0/0 .text JPAVolumeCylinder__FP18JPAEmitterWorkData */
|
||||
static void JPAVolumeCylinder(JPAEmitterWorkData* param_0) {
|
||||
// NONMATCHING
|
||||
static void JPAVolumeCylinder(JPAEmitterWorkData* work) {
|
||||
s16 theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
|
||||
f32 rnd = work->mpEmtr->get_r_f();
|
||||
if (work->mpEmtr->checkFlag(JPADynFlag_FixedDensity)) {
|
||||
rnd = 1.0f - rnd * rnd;
|
||||
}
|
||||
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
|
||||
work->mVolumePos.set(rad * JMASSin(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(),
|
||||
rad * JMASCos(theta));
|
||||
work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
|
||||
work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
|
||||
}
|
||||
|
||||
/* 8027B9F8-8027BB18 276338 0120+00 1/1 0/0 0/0 .text JPAVolumeTorus__FP18JPAEmitterWorkData */
|
||||
static void JPAVolumeTorus(JPAEmitterWorkData* param_0) {
|
||||
// NONMATCHING
|
||||
static void JPAVolumeTorus(JPAEmitterWorkData* work) {
|
||||
s16 theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
|
||||
s16 phi = work->mpEmtr->get_r_ss();
|
||||
f32 rad = work->mVolumeSize * work->mVolumeMinRad;
|
||||
work->mVelAxis.set(rad * JMASSin(theta) * JMASCos(phi), rad * JMASSin(phi),
|
||||
rad * JMASCos(theta) * JMASCos(phi));
|
||||
work->mVolumePos.set(work->mVelAxis.x + work->mVolumeSize * JMASSin(theta), work->mVelAxis.y,
|
||||
work->mVelAxis.z + work->mVolumeSize * JMASCos(theta));
|
||||
work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
|
||||
}
|
||||
|
||||
/* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */
|
||||
@@ -206,10 +171,6 @@ void JPADynamicsBlock::init() {
|
||||
|
||||
/* 8027BBE8-8027BDEC 276528 0204+00 0/0 1/1 0/0 .text
|
||||
* create__16JPADynamicsBlockFP18JPAEmitterWorkData */
|
||||
|
||||
#ifdef NONMATCHING
|
||||
|
||||
// literal only
|
||||
void JPADynamicsBlock::create(JPAEmitterWorkData* work) {
|
||||
if (work->mpEmtr->checkStatus(JPAEmtrStts_RateStepEmit)) {
|
||||
s32 emitCount;
|
||||
@@ -263,11 +224,3 @@ void JPADynamicsBlock::create(JPAEmitterWorkData* work) {
|
||||
|
||||
work->mpEmtr->clearStatus(JPAEmtrStts_FirstEmit);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void JPADynamicsBlock::create(JPAEmitterWorkData* param_0) {
|
||||
// NONMATCHING
|
||||
}
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user