summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2023-12-19 20:50:36 -0800
committerJasper St. Pierre <jstpierre@mecheye.net>2023-12-19 20:50:36 -0800
commit3b2fcca7d42e2f3f5f0b783bbda446c377055dbf (patch)
treea8d3e6fa39d5f61a2d2556bb2b180ebb265a7cfe
parent5a7da09265c99740a5f1a0b87f783d8a79ad9168 (diff)
JPADraw more work
-rw-r--r--include/JSystem/JParticle/JPADraw.h14
-rw-r--r--include/JSystem/JParticle/JPADrawVisitor.h16
-rw-r--r--include/JSystem/JParticle/JPAExtraShape.h8
-rw-r--r--include/JSystem/JParticle/JPAResourceManager.h4
-rw-r--r--include/JSystem/JParticle/JPASweepShape.h12
-rw-r--r--include/JSystem/JParticle/JPATexture.h15
-rw-r--r--src/JSystem/JParticle/JPADraw.cpp225
-rw-r--r--src/JSystem/JParticle/JPADrawVisitor.cpp25
8 files changed, 282 insertions, 37 deletions
diff --git a/include/JSystem/JParticle/JPADraw.h b/include/JSystem/JParticle/JPADraw.h
index bbf7b66f..c7319a53 100644
--- a/include/JSystem/JParticle/JPADraw.h
+++ b/include/JSystem/JParticle/JPADraw.h
@@ -14,13 +14,17 @@ public:
JPADrawClipBoard() {}
~JPADrawClipBoard() {}
+ typedef void(*DirTypeFunc)(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&);
+ typedef void(*RotTypeFunc)(f32, f32, Mtx&);
+ typedef void(*BasePlaneTypeFunc)(f32, f32, f32, f32, JGeometry::TVec3<f32>*);
+
/* 0x00 */ JPADrawSetupTev mSetupTev;
/* 0x04 */ f32 mGlobalScaleX;
/* 0x08 */ f32 mGlobalScaleY;
/* 0x0C */ f32 mPivotX;
/* 0x10 */ f32 mPivotY;
/* 0x14 */ JGeometry::TVec2<f32> field_0x14[4];
- /* 0x34 */ MtxP mDrawMtx;
+ /* 0x34 */ MtxP mDrawMtxPtr;
/* 0x38 */ f32 field_0x38;
/* 0x3C */ f32 field_0x3c;
/* 0x40 */ f32 field_0x40;
@@ -33,11 +37,13 @@ public:
/* 0x5C */ f32 field_0x5c;
/* 0x60 */ f32 field_0x60;
/* 0x64 */ f32 field_0x64;
- /* 0x68 */ Mtx field_0x68;
+ /* 0x68 */ Mtx mDrawMtx;
/* 0x98 */ GXColor mPrmColor;
/* 0x9C */ GXColor mEnvColor;
- /* 0xA0 */ void* field_0xa0;
- /* 0xA4 */ u8 field_0xa4[0xb4 - 0xa4];
+ /* 0xA0 */ DirTypeFunc mDirTypeFunc;
+ /* 0xA4 */ RotTypeFunc mRotTypeFunc;
+ /* 0xA8 */ BasePlaneTypeFunc mBasePlaneTypeFunc;
+ /* 0xAC */ u8 field_0xa4[0xb4 - 0xac];
};
class JPADraw {
diff --git a/include/JSystem/JParticle/JPADrawVisitor.h b/include/JSystem/JParticle/JPADrawVisitor.h
index 8ac0d733..aabb63d4 100644
--- a/include/JSystem/JParticle/JPADrawVisitor.h
+++ b/include/JSystem/JParticle/JPADrawVisitor.h
@@ -2,6 +2,7 @@
#define JPADRAWVISITOR_H
#include "JSystem/JSupport/JSUList.h"
+#include "dolphin/mtx/mtx.h"
#include "dolphin/types.h"
class JPABaseEmitter;
@@ -520,4 +521,19 @@ public:
/* 0x138 */ JPADrawCalcChildScaleOut mCalcChildScaleOut;
};
+void dirTypeVel(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&);
+void dirTypePos(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&);
+void dirTypePosInv(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&);
+void dirTypeEmtrDir(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&);
+void dirTypePrevPtcl(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&);
+
+void rotTypeY(f32, f32, Mtx&);
+void rotTypeX(f32, f32, Mtx&);
+void rotTypeZ(f32, f32, Mtx&);
+void rotTypeXYZ(f32, f32, Mtx&);
+void rotTypeYJiggle(f32, f32, Mtx&);
+
+void basePlaneTypeXY(f32, f32, f32, f32, JGeometry::TVec3<f32>*);
+void basePlaneTypeXZ(f32, f32, f32, f32, JGeometry::TVec3<f32>*);
+
#endif /* JPADRAWVISITOR_H */
diff --git a/include/JSystem/JParticle/JPAExtraShape.h b/include/JSystem/JParticle/JPAExtraShape.h
index 093a97c7..31d553ba 100644
--- a/include/JSystem/JParticle/JPAExtraShape.h
+++ b/include/JSystem/JParticle/JPAExtraShape.h
@@ -52,8 +52,8 @@ public:
virtual f32 getIncreaseRateY() = 0;
virtual f32 getDecreaseRateX() = 0;
virtual f32 getDecreaseRateY() = 0;
- virtual u32 getPivotX() = 0;
- virtual u32 getPivotY() = 0;
+ virtual u8 getPivotX() = 0;
+ virtual u8 getPivotY() = 0;
virtual f32 getRandomScale() = 0;
virtual BOOL isEnableAlpha() = 0;
virtual BOOL isEnableSinWave() = 0;
@@ -98,8 +98,8 @@ public:
virtual f32 getIncreaseRateY() { return mIncreaseRateY; }
virtual f32 getDecreaseRateX() { return mDecreaseRateX; }
virtual f32 getDecreaseRateY() { return mDecreaseRateY; }
- virtual u32 getPivotX() { return (mpData->mFlag >> 14) & 0x03; }
- virtual u32 getPivotY() { return (mpData->mFlag >> 16) & 0x03; }
+ virtual u8 getPivotX() { return (mpData->mFlag >> 14) & 0x03; }
+ virtual u8 getPivotY() { return (mpData->mFlag >> 16) & 0x03; }
virtual f32 getRandomScale() { return mpData->mRandomScale; }
virtual BOOL isEnableAlpha() { return (mpData->mFlag & 0x01); }
virtual BOOL isEnableSinWave() { return (mpData->mFlag & 0x02); }
diff --git a/include/JSystem/JParticle/JPAResourceManager.h b/include/JSystem/JParticle/JPAResourceManager.h
index 52091a00..74351251 100644
--- a/include/JSystem/JParticle/JPAResourceManager.h
+++ b/include/JSystem/JParticle/JPAResourceManager.h
@@ -18,6 +18,10 @@ public:
pTexResArray[id]->load(texMap);
}
+ inline void loadDefaultTexture(GXTexMapID texMap) {
+ defaultTex.load(texMap);
+ }
+
public:
/* 0x00 */ JPADefaultTexture defaultTex;
/* 0x24 */ u32 registNum;
diff --git a/include/JSystem/JParticle/JPASweepShape.h b/include/JSystem/JParticle/JPASweepShape.h
index 6d223a99..4b2de54e 100644
--- a/include/JSystem/JParticle/JPASweepShape.h
+++ b/include/JSystem/JParticle/JPASweepShape.h
@@ -30,9 +30,9 @@ class JPASweepShape {
public:
virtual ~JPASweepShape() {};
virtual u8 getType() = 0;
- virtual u32 getDirType() = 0;
- virtual u32 getRotType() = 0;
- virtual u32 getBasePlaneType() = 0;
+ virtual u8 getDirType() = 0;
+ virtual u8 getRotType() = 0;
+ virtual u8 getBasePlaneType() = 0;
virtual s16 getLife() = 0;
virtual s16 getRate() = 0;
virtual f32 getTiming() = 0;
@@ -69,9 +69,9 @@ public:
JPASweepShapeArc(const u8*);
virtual ~JPASweepShapeArc() {};
virtual u8 getType() { return (mpData->mFlag >> 0) & 0x0F; }
- virtual u32 getDirType() { return (mpData->mFlag >> 4) & 0x07; }
- virtual u32 getRotType() { return (mpData->mFlag >> 7) & 0x07; }
- virtual u32 getBasePlaneType() { return (mpData->mFlag >> 10) & 0x01; }
+ virtual u8 getDirType() { return (mpData->mFlag >> 4) & 0x07; }
+ virtual u8 getRotType() { return (mpData->mFlag >> 7) & 0x07; }
+ virtual u8 getBasePlaneType() { return (mpData->mFlag >> 10) & 0x01; }
virtual s16 getLife() { return mpData->mLife; }
virtual s16 getRate() { return mpData->mRate; }
virtual f32 getTiming() { return mpData->mTiming; }
diff --git a/include/JSystem/JParticle/JPATexture.h b/include/JSystem/JParticle/JPATexture.h
index 16719258..0e0d2874 100644
--- a/include/JSystem/JParticle/JPATexture.h
+++ b/include/JSystem/JParticle/JPATexture.h
@@ -32,15 +32,22 @@ public:
virtual JUTTexture* getJUTTexture() { return &mTexture; }
public:
- JUTTexture mTexture;
- const JPATextureData* mpData;
+ /* 0x00 */ JUTTexture mTexture;
+ /* 0x40 */ const JPATextureData* mpData;
};
struct JPADefaultTexture {
+public:
JPADefaultTexture() : imgBuf(NULL) {}
void initialize(JKRHeap *);
- u8 * imgBuf;
- GXTexObj mTexObj;
+
+ inline void load(GXTexMapID texMap) {
+ GXLoadTexObj(&mTexObj, texMap);
+ }
+
+public:
+ /* 0x00 */ u8 * imgBuf;
+ /* 0x04 */ GXTexObj mTexObj;
};
#endif /* JPATEXTURE_H */
diff --git a/src/JSystem/JParticle/JPADraw.cpp b/src/JSystem/JParticle/JPADraw.cpp
index b02a110c..247de55e 100644
--- a/src/JSystem/JParticle/JPADraw.cpp
+++ b/src/JSystem/JParticle/JPADraw.cpp
@@ -119,7 +119,7 @@ void JPADraw::draw(MtxP drawMtx) {
GXSetBlendMode(dc.pbsp->getBlendMode1(), dc.pbsp->getSrcBlendFactor1(), dc.pbsp->getDstBlendFactor1(), dc.pbsp->getBlendOp1());
cb.mPrmColor = dc.pbe->mGlobalPrmColor;
cb.mEnvColor = dc.pbe->mGlobalEnvColor;
- cb.mDrawMtx = drawMtx;
+ cb.mDrawMtxPtr = drawMtx;
cb.mSetupTev.setupTev(dc.pbsp, dc.petx);
for (int i = 0; i < execEmtrVisNum; i++) {
mpExecEmtrVis[i]->exec(&dc);
@@ -160,12 +160,47 @@ void JPADraw::calcChild(JPABaseParticle* ptcl) {
/* 80268A48-80268F28 .text initParticle__7JPADrawFP15JPABaseParticle */
void JPADraw::initParticle(JPABaseParticle* ptcl) {
- /* Nonmatching */
+ ptcl->mAxis.set(JPABaseEmitter::emtrInfo.mEmitterGlobalRot[0][1], JPABaseEmitter::emtrInfo.mEmitterGlobalRot[1][1], JPABaseEmitter::emtrInfo.mEmitterGlobalRot[2][1]);
+ ptcl->mPrmColor = mPrmColor;
+ ptcl->mEnvColor = mEnvColor;
+ ptcl->mAlphaOut = 1.0f;
+ ptcl->mLoopOffset = dc.pbe->getRandomF() * dc.pbsp->getLoopOffset();
+ if (dc.pesp != NULL) {
+ if (dc.pesp->isEnableRotate()) {
+ ptcl->mRotateAngle = (dc.pesp->getRotateAngle() * 32768.0f) + (dc.pbe->getRandomSF() * dc.pesp->getRotateRandomAngle() * 65536.0f);
+ s16 rotateSpeed;
+ if (dc.pbe->getRandomRF() < dc.pesp->getRotateDirection()) {
+ rotateSpeed = dc.pesp->getRotateSpeed() * (dc.pesp->getRotateRandomSpeed() * dc.pbe->getRandomRF() + 1.0f) * 32768.0f;
+ } else {
+ rotateSpeed = -dc.pesp->getRotateSpeed() * (dc.pesp->getRotateRandomSpeed() * dc.pbe->getRandomRF() + 1.0f) * 32768.0f;
+ }
+ ptcl->mRotateSpeed = rotateSpeed;
+ } else {
+ ptcl->mRotateAngle = 0;
+ ptcl->mRotateSpeed = 0;
+ }
+
+ if (dc.pesp->isEnableScale()) {
+ ptcl->mScaleX = ptcl->mScaleY = ptcl->mScaleOut = (dc.pbe->getRandomRF() * dc.pesp->getRandomScale() + 1.0f) * mScaleOut;
+ } else {
+ ptcl->mScaleX = ptcl->mScaleY = ptcl->mScaleOut = mScaleOut;
+ }
+
+ if (dc.pesp->isEnableAlpha()) {
+ ptcl->mAlphaWaveRandom = (dc.pbe->getRandomRF() * dc.pesp->getAlphaWaveRandom() + 1.0f);
+ } else {
+ ptcl->mAlphaWaveRandom = 1.0f;
+ }
+ } else {
+ ptcl->mRotateAngle = 0;
+ ptcl->mRotateSpeed = 0;
+ ptcl->mScaleOut = ptcl->mScaleX = ptcl->mScaleY = mScaleOut;
+ ptcl->mAlphaWaveRandom = 1.0f;
+ }
}
/* 80268F28-802692A4 .text initChild__7JPADrawFP15JPABaseParticleP15JPABaseParticle */
void JPADraw::initChild(JPABaseParticle* ptcl, JPABaseParticle* chld) {
- /* Nonmatching */
chld->mAxis.set(ptcl->mAxis);
chld->mAlphaOut = 1.0f;
if (dc.pssp->isInheritedRGB()) {
@@ -370,7 +405,7 @@ void JPADraw::setDrawExecVisitorsAfterCB(const JPADrawVisitorDefFlags& flags) {
case JPABaseShape::JPAType_RotationCross:
mpExecPtclVis[execPtclVisNum++] = &vc.mExecRotationCross;
break;
- case 9:
+ case JPABaseShape::JPAType_DirBillboard:
mpExecPtclVis[execPtclVisNum++] = &vc.mExecDirBillBoard;
break;
case JPABaseShape::JPAType_Stripe:
@@ -608,12 +643,188 @@ void JPADraw::setDrawCalcVisitors(const JPADraw::JPADrawVisitorDefFlags& flags)
/* 8026ADB0-8026B3DC .text setParticleClipBoard__7JPADrawFv */
void JPADraw::setParticleClipBoard() {
- /* Nonmatching */
+ /* Nonmatching - top switch */
+
+ switch (dc.pbsp->getType()) {
+ case JPABaseShape::JPAType_Billboard:
+ break;
+ case JPABaseShape::JPAType_DirBillboard:
+ PSMTXIdentity(cb.mDrawMtx);
+ break;
+ case JPABaseShape::JPAType_YBillboard:
+ loadYBBMtx(cb.mDrawMtxPtr);
+ break;
+ case JPABaseShape::JPAType_Point:
+ case JPABaseShape::JPAType_Line:
+ case JPABaseShape::JPAType_Direction:
+ case JPABaseShape::JPAType_DirectionCross:
+ case JPABaseShape::JPAType_Stripe:
+ case JPABaseShape::JPAType_StripeCross:
+ case JPABaseShape::JPAType_Rotation:
+ case JPABaseShape::JPAType_RotationCross:
+ MTXCopy(cb.mDrawMtxPtr, cb.mDrawMtx);
+ break;
+ }
+
+ GXLoadPosMtxImm(cb.mDrawMtx, GX_PNMTX0);
+
+ JPABaseEmitter* emtr = dc.pbe;
+ f32 scaleX = emtr->mGlobalParticleScale.x;
+ f32 scaleY = emtr->mGlobalParticleScale.y;
+
+ cb.mGlobalScaleX = 25.0f * dc.pbsp->getBaseSizeX() * scaleX;
+ cb.mGlobalScaleY = 25.0f * dc.pbsp->getBaseSizeY() * scaleY;
+
+ if (dc.pbsp->getType() == JPABaseShape::JPAType_Point) {
+ cb.mGlobalScaleX *= 1.02f;
+ cb.mGlobalScaleY *= 1.02f;
+ } else if (dc.pbsp->getType() == JPABaseShape::JPAType_Line) {
+ cb.mGlobalScaleX *= 1.02f;
+ cb.mGlobalScaleY *= 0.4f;
+ }
+
+ if (dc.pesp != NULL && dc.pesp->isEnableScale()) {
+ cb.mPivotX = cb.mGlobalScaleX * (dc.pesp->getPivotX() - 1.0f);
+ cb.mPivotY = cb.mGlobalScaleY * (dc.pesp->getPivotY() - 1.0f);
+ } else {
+ cb.mPivotX = cb.mPivotY = 0.0f;
+ }
+
+ f32 tilingX = dc.pbsp->getTilingX();
+ f32 tilingY = dc.pbsp->getTilingY();
+
+ cb.field_0x14[0].x = 0.0f;
+ cb.field_0x14[0].y = 0.0f;
+ cb.field_0x14[1].x = tilingX;
+ cb.field_0x14[1].y = 0.0f;
+ cb.field_0x14[2].x = tilingX;
+ cb.field_0x14[2].y = tilingY;
+ cb.field_0x14[3].x = 0.0f;
+ cb.field_0x14[3].y = tilingY;
+
+ if (!dc.pbsp->textureIsEmpty() && !dc.pbsp->isEnableTextureAnm())
+ mTexIdx = dc.pTexIdx[dc.pbsp->getTextureIndex()], GX_TEXMAP0;
+
+ cb.mDirTypeFunc = NULL;
+ cb.mRotTypeFunc = NULL;
+ cb.mBasePlaneTypeFunc = NULL;
+
+ if (dc.pbsp->getType() == JPABaseShape::JPAType_Direction || dc.pbsp->getType() == JPABaseShape::JPAType_DirectionCross || dc.pbsp->getType() == JPABaseShape::JPAType_DirBillboard || dc.pbsp->getType() == JPABaseShape::JPAType_Stripe || dc.pbsp->getType() == JPABaseShape::JPAType_StripeCross) {
+ switch (dc.pbsp->getDirType()) {
+ case 0: cb.mDirTypeFunc = dirTypeVel; break;
+ case 1: cb.mDirTypeFunc = dirTypePos; break;
+ case 2: cb.mDirTypeFunc = dirTypePosInv; break;
+ case 3: cb.mDirTypeFunc = dirTypeEmtrDir; break;
+ case 4: cb.mDirTypeFunc = dirTypePrevPtcl; break;
+ }
+ }
+
+ if (dc.pbsp->getType() == JPABaseShape::JPAType_Direction || dc.pbsp->getType() == JPABaseShape::JPAType_DirectionCross || dc.pbsp->getType() == JPABaseShape::JPAType_Rotation || dc.pbsp->getType() == JPABaseShape::JPAType_RotationCross) {
+ switch (dc.pbsp->getRotType()) {
+ case 0: cb.mRotTypeFunc = rotTypeY; break;
+ case 1: cb.mRotTypeFunc = rotTypeX; break;
+ case 2: cb.mRotTypeFunc = rotTypeZ; break;
+ case 3: cb.mRotTypeFunc = rotTypeXYZ; break;
+ case 4: cb.mRotTypeFunc = rotTypeYJiggle; break;
+ }
+ }
+
+ if (dc.pbsp->getType() == JPABaseShape::JPAType_Direction || dc.pbsp->getType() == JPABaseShape::JPAType_Rotation) {
+ switch (dc.pbsp->getBasePlaneType()) {
+ case 0: cb.mBasePlaneTypeFunc = basePlaneTypeXY; break;
+ case 1: cb.mBasePlaneTypeFunc = basePlaneTypeXZ; break;
+ }
+ }
}
/* 8026B3DC-8026B938 .text setChildClipBoard__7JPADrawFv */
void JPADraw::setChildClipBoard() {
- /* Nonmatching */
+ /* Nonmatching - top switch */
+
+ switch (dc.pssp->getType()) {
+ case JPABaseShape::JPAType_Billboard:
+ break;
+ case JPABaseShape::JPAType_DirBillboard:
+ PSMTXIdentity(cb.mDrawMtx);
+ break;
+ case JPABaseShape::JPAType_YBillboard:
+ loadYBBMtx(cb.mDrawMtxPtr);
+ break;
+ case JPABaseShape::JPAType_Point:
+ case JPABaseShape::JPAType_Line:
+ case JPABaseShape::JPAType_Direction:
+ case JPABaseShape::JPAType_DirectionCross:
+ case JPABaseShape::JPAType_Stripe:
+ case JPABaseShape::JPAType_StripeCross:
+ case JPABaseShape::JPAType_Rotation:
+ case JPABaseShape::JPAType_RotationCross:
+ MTXCopy(cb.mDrawMtxPtr, cb.mDrawMtx);
+ break;
+ }
+
+ GXLoadPosMtxImm(cb.mDrawMtx, GX_PNMTX0);
+
+ JPABaseEmitter* emtr = dc.pbe;
+ f32 scaleX = emtr->mGlobalParticleScale.x;
+ f32 scaleY = emtr->mGlobalParticleScale.y;
+
+ if (!dc.pssp->isInheritedScale()) {
+ cb.mGlobalScaleX = 25.0f * dc.pssp->getScaleX() * scaleX;
+ cb.mGlobalScaleY = 25.0f * dc.pssp->getScaleY() * scaleY;
+ } else {
+ cb.mGlobalScaleX = 25.0f * dc.pbsp->getBaseSizeX() * scaleX;
+ cb.mGlobalScaleY = 25.0f * dc.pbsp->getBaseSizeY() * scaleY;
+ }
+
+ if (dc.pssp->getType() == JPABaseShape::JPAType_Point) {
+ cb.mGlobalScaleX *= 1.02f;
+ cb.mGlobalScaleY *= 1.02f;
+ } else if (dc.pssp->getType() == JPABaseShape::JPAType_Line) {
+ cb.mGlobalScaleX *= 1.02f;
+ cb.mGlobalScaleY *= 0.4f;
+ }
+
+ cb.mPivotX = cb.mPivotY = 0.0f;
+
+ cb.field_0x14[1].y = 0.0f;
+ cb.field_0x14[0].y = 0.0f;
+ cb.field_0x14[3].x = 0.0f;
+ cb.field_0x14[0].x = 0.0f;
+ cb.field_0x14[3].y = 1.0f;
+ cb.field_0x14[2].y = 1.0f;
+ cb.field_0x14[2].x = 1.0f;
+ cb.field_0x14[1].x = 1.0f;
+
+ cb.mDirTypeFunc = NULL;
+ cb.mRotTypeFunc = NULL;
+ cb.mBasePlaneTypeFunc = NULL;
+
+ if (dc.pssp->getType() == JPABaseShape::JPAType_Direction || dc.pssp->getType() == JPABaseShape::JPAType_DirectionCross || dc.pssp->getType() == JPABaseShape::JPAType_DirBillboard || dc.pssp->getType() == JPABaseShape::JPAType_Stripe || dc.pssp->getType() == JPABaseShape::JPAType_StripeCross) {
+ switch (dc.pssp->getDirType()) {
+ case 0: cb.mDirTypeFunc = dirTypeVel; break;
+ case 1: cb.mDirTypeFunc = dirTypePos; break;
+ case 2: cb.mDirTypeFunc = dirTypePosInv; break;
+ case 3: cb.mDirTypeFunc = dirTypeEmtrDir; break;
+ case 4: cb.mDirTypeFunc = dirTypePrevPtcl; break;
+ }
+ }
+
+ if (dc.pssp->getType() == JPABaseShape::JPAType_Direction || dc.pssp->getType() == JPABaseShape::JPAType_DirectionCross || dc.pssp->getType() == JPABaseShape::JPAType_Rotation || dc.pssp->getType() == JPABaseShape::JPAType_RotationCross) {
+ switch (dc.pssp->getRotType()) {
+ case 0: cb.mRotTypeFunc = rotTypeY; break;
+ case 1: cb.mRotTypeFunc = rotTypeX; break;
+ case 2: cb.mRotTypeFunc = rotTypeZ; break;
+ case 3: cb.mRotTypeFunc = rotTypeXYZ; break;
+ case 4: cb.mRotTypeFunc = rotTypeYJiggle; break;
+ }
+ }
+
+ if (dc.pssp->getType() == JPABaseShape::JPAType_Direction || dc.pssp->getType() == JPABaseShape::JPAType_Rotation) {
+ switch (dc.pssp->getBasePlaneType()) {
+ case 0: cb.mBasePlaneTypeFunc = basePlaneTypeXY; break;
+ case 1: cb.mBasePlaneTypeFunc = basePlaneTypeXZ; break;
+ }
+ }
}
/* 8026B938-8026BC2C .text drawParticle__7JPADrawFv */
@@ -668,7 +879,7 @@ void JPADraw::drawChild() {
GXEnableTexOffsets(GX_TEXCOORD0, GX_TRUE, GX_TRUE);
if (dc.pbsp->textureIsEmpty()) {
- GXLoadTexObj(&dc.mpTextureResource->defaultTex.mTexObj, GX_TEXMAP0);
+ dc.mpTextureResource->loadDefaultTexture(GX_TEXMAP0);
} else {
dc.mpTextureResource->load(dc.pTexIdx[dc.pssp->getTextureIndex()], GX_TEXMAP0);
}
diff --git a/src/JSystem/JParticle/JPADrawVisitor.cpp b/src/JSystem/JParticle/JPADrawVisitor.cpp
index 6c379304..6333127a 100644
--- a/src/JSystem/JParticle/JPADrawVisitor.cpp
+++ b/src/JSystem/JParticle/JPADrawVisitor.cpp
@@ -5,6 +5,7 @@
#include "JSystem/JParticle/JPADrawVisitor.h"
#include "JSystem/JGeometry.h"
+#include "dolphin/mtx/mtx.h"
JPADrawClipBoard* JPADrawContext::pcb;
@@ -114,62 +115,62 @@ void JPADrawExecRotYBillBoard::exec(const JPADrawContext*, JPABaseParticle*) {
}
/* 8026134C-80261368 .text dirTypeVel__FP15JPABaseParticleP14JPABaseEmitterRQ29JGeometry8TVec3<f> */
-void dirTypeVel(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<float>&) {
+void dirTypeVel(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&) {
/* Nonmatching */
}
/* 80261368-80261384 .text dirTypePos__FP15JPABaseParticleP14JPABaseEmitterRQ29JGeometry8TVec3<f> */
-void dirTypePos(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<float>&) {
+void dirTypePos(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&) {
/* Nonmatching */
}
/* 80261384-802613C4 .text dirTypePosInv__FP15JPABaseParticleP14JPABaseEmitterRQ29JGeometry8TVec3<f> */
-void dirTypePosInv(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<float>&) {
+void dirTypePosInv(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&) {
/* Nonmatching */
}
/* 802613C4-802613E8 .text dirTypeEmtrDir__FP15JPABaseParticleP14JPABaseEmitterRQ29JGeometry8TVec3<f> */
-void dirTypeEmtrDir(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<float>&) {
+void dirTypeEmtrDir(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&) {
/* Nonmatching */
}
/* 802613E8-802614A8 .text dirTypePrevPtcl__FP15JPABaseParticleP14JPABaseEmitterRQ29JGeometry8TVec3<f> */
-void dirTypePrevPtcl(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<float>&) {
+void dirTypePrevPtcl(JPABaseParticle*, JPABaseEmitter*, JGeometry::TVec3<f32>&) {
/* Nonmatching */
}
/* 802614A8-802614E8 .text rotTypeY__FffRA3_A4_f */
-void rotTypeY(float, float, float(&)[3][4]) {
+void rotTypeY(f32, f32, Mtx&) {
/* Nonmatching */
}
/* 802614E8-80261528 .text rotTypeX__FffRA3_A4_f */
-void rotTypeX(float, float, float(&)[3][4]) {
+void rotTypeX(f32, f32, Mtx&) {
/* Nonmatching */
}
/* 80261528-80261568 .text rotTypeZ__FffRA3_A4_f */
-void rotTypeZ(float, float, float(&)[3][4]) {
+void rotTypeZ(f32, f32, Mtx&) {
/* Nonmatching */
}
/* 80261568-802615C4 .text rotTypeXYZ__FffRA3_A4_f */
-void rotTypeXYZ(float, float, float(&)[3][4]) {
+void rotTypeXYZ(f32, f32, Mtx&) {
/* Nonmatching */
}
/* 802615C4-8026161C .text rotTypeYJiggle__FffRA3_A4_f */
-void rotTypeYJiggle(float, float, float(&)[3][4]) {
+void rotTypeYJiggle(f32, f32, Mtx&) {
/* Nonmatching */
}
/* 8026161C-80261654 .text basePlaneTypeXY__FffffPQ29JGeometry8TVec3<f> */
-void basePlaneTypeXY(float, float, float, float, JGeometry::TVec3<float>*) {
+void basePlaneTypeXY(f32, f32, f32, f32, JGeometry::TVec3<f32>*) {
/* Nonmatching */
}
/* 80261654-8026168C .text basePlaneTypeXZ__FffffPQ29JGeometry8TVec3<f> */
-void basePlaneTypeXZ(float, float, float, float, JGeometry::TVec3<float>*) {
+void basePlaneTypeXZ(f32, f32, f32, f32, JGeometry::TVec3<f32>*) {
/* Nonmatching */
}