a few more JPAResource functions

This commit is contained in:
Jasper St. Pierre 2021-12-23 21:02:42 -08:00
parent 32d021a889
commit f7eed3278f
6 changed files with 146 additions and 203 deletions

View File

@ -1,29 +0,0 @@
lbl_80274010:
/* 80274010 38 00 00 00 */ li r0, 0
/* 80274014 90 03 00 08 */ stw r0, 8(r3)
/* 80274018 90 03 00 04 */ stw r0, 4(r3)
/* 8027401C 90 03 00 00 */ stw r0, 0(r3)
/* 80274020 90 03 00 18 */ stw r0, 0x18(r3)
/* 80274024 90 03 00 14 */ stw r0, 0x14(r3)
/* 80274028 90 03 00 10 */ stw r0, 0x10(r3)
/* 8027402C 90 03 00 0C */ stw r0, 0xc(r3)
/* 80274030 90 03 00 1C */ stw r0, 0x1c(r3)
/* 80274034 90 03 00 20 */ stw r0, 0x20(r3)
/* 80274038 90 03 00 24 */ stw r0, 0x24(r3)
/* 8027403C 90 03 00 28 */ stw r0, 0x28(r3)
/* 80274040 90 03 00 2C */ stw r0, 0x2c(r3)
/* 80274044 90 03 00 30 */ stw r0, 0x30(r3)
/* 80274048 90 03 00 34 */ stw r0, 0x34(r3)
/* 8027404C 90 03 00 38 */ stw r0, 0x38(r3)
/* 80274050 98 03 00 47 */ stb r0, 0x47(r3)
/* 80274054 98 03 00 46 */ stb r0, 0x46(r3)
/* 80274058 98 03 00 45 */ stb r0, 0x45(r3)
/* 8027405C 98 03 00 44 */ stb r0, 0x44(r3)
/* 80274060 98 03 00 43 */ stb r0, 0x43(r3)
/* 80274064 98 03 00 42 */ stb r0, 0x42(r3)
/* 80274068 98 03 00 41 */ stb r0, 0x41(r3)
/* 8027406C 98 03 00 40 */ stb r0, 0x40(r3)
/* 80274070 98 03 00 3F */ stb r0, 0x3f(r3)
/* 80274074 98 03 00 3E */ stb r0, 0x3e(r3)
/* 80274078 B0 03 00 3C */ sth r0, 0x3c(r3)
/* 8027407C 4E 80 00 20 */ blr

View File

@ -1,61 +0,0 @@
lbl_80275A94:
/* 80275A94 94 21 FF E0 */ stwu r1, -0x20(r1)
/* 80275A98 7C 08 02 A6 */ mflr r0
/* 80275A9C 90 01 00 24 */ stw r0, 0x24(r1)
/* 80275AA0 39 61 00 20 */ addi r11, r1, 0x20
/* 80275AA4 48 0E C7 35 */ bl _savegpr_28
/* 80275AA8 7C 7C 1B 78 */ mr r28, r3
/* 80275AAC 7C 9D 23 78 */ mr r29, r4
/* 80275AB0 7C BE 2B 78 */ mr r30, r5
/* 80275AB4 93 C4 00 00 */ stw r30, 0(r4)
/* 80275AB8 93 84 00 04 */ stw r28, 4(r4)
/* 80275ABC 38 00 00 00 */ li r0, 0
/* 80275AC0 98 04 02 16 */ stb r0, 0x216(r4)
/* 80275AC4 48 00 0F 49 */ bl calcWorkData_d__11JPAResourceFP18JPAEmitterWorkData
/* 80275AC8 80 7C 00 1C */ lwz r3, 0x1c(r28)
/* 80275ACC 7F A4 EB 78 */ mr r4, r29
/* 80275AD0 48 00 4D 19 */ bl setGX__12JPABaseShapeCFP18JPAEmitterWorkData
/* 80275AD4 3B E0 00 01 */ li r31, 1
/* 80275AD8 48 00 00 78 */ b lbl_80275B50
lbl_80275ADC:
/* 80275ADC 88 7D 02 16 */ lbz r3, 0x216(r29)
/* 80275AE0 38 03 00 01 */ addi r0, r3, 1
/* 80275AE4 98 1D 02 16 */ stb r0, 0x216(r29)
/* 80275AE8 80 7C 00 1C */ lwz r3, 0x1c(r28)
/* 80275AEC 80 63 00 00 */ lwz r3, 0(r3)
/* 80275AF0 80 03 00 08 */ lwz r0, 8(r3)
/* 80275AF4 54 00 02 53 */ rlwinm. r0, r0, 0, 9, 9
/* 80275AF8 41 82 00 1C */ beq lbl_80275B14
/* 80275AFC 80 1C 00 24 */ lwz r0, 0x24(r28)
/* 80275B00 28 00 00 00 */ cmplwi r0, 0
/* 80275B04 41 82 00 10 */ beq lbl_80275B14
/* 80275B08 7F 83 E3 78 */ mr r3, r28
/* 80275B0C 7F A4 EB 78 */ mr r4, r29
/* 80275B10 48 00 03 A1 */ bl drawC__11JPAResourceFP18JPAEmitterWorkData
lbl_80275B14:
/* 80275B14 7F 83 E3 78 */ mr r3, r28
/* 80275B18 7F A4 EB 78 */ mr r4, r29
/* 80275B1C 48 00 00 59 */ bl drawP__11JPAResourceFP18JPAEmitterWorkData
/* 80275B20 80 7C 00 1C */ lwz r3, 0x1c(r28)
/* 80275B24 80 63 00 00 */ lwz r3, 0(r3)
/* 80275B28 80 03 00 08 */ lwz r0, 8(r3)
/* 80275B2C 54 00 02 53 */ rlwinm. r0, r0, 0, 9, 9
/* 80275B30 40 82 00 1C */ bne lbl_80275B4C
/* 80275B34 80 1C 00 24 */ lwz r0, 0x24(r28)
/* 80275B38 28 00 00 00 */ cmplwi r0, 0
/* 80275B3C 41 82 00 10 */ beq lbl_80275B4C
/* 80275B40 7F 83 E3 78 */ mr r3, r28
/* 80275B44 7F A4 EB 78 */ mr r4, r29
/* 80275B48 48 00 03 69 */ bl drawC__11JPAResourceFP18JPAEmitterWorkData
lbl_80275B4C:
/* 80275B4C 3B FF 00 01 */ addi r31, r31, 1
lbl_80275B50:
/* 80275B50 88 1E 01 10 */ lbz r0, 0x110(r30)
/* 80275B54 7C 1F 00 00 */ cmpw r31, r0
/* 80275B58 40 81 FF 84 */ ble lbl_80275ADC
/* 80275B5C 39 61 00 20 */ addi r11, r1, 0x20
/* 80275B60 48 0E C6 C5 */ bl _restgpr_28
/* 80275B64 80 01 00 24 */ lwz r0, 0x24(r1)
/* 80275B68 7C 08 03 A6 */ mtlr r0
/* 80275B6C 38 21 00 20 */ addi r1, r1, 0x20
/* 80275B70 4E 80 00 20 */ blr

View File

@ -2,5 +2,108 @@
#define JPABASESHAPE_H
#include "dolphin/types.h"
#include "dolphin/gx/GX.h"
class JPAEmitterWorkData;
class JKRHeap;
struct JPABaseShapeData {
// Common header.
/* 0x00 */ u8 mMagic[4];
/* 0x04 */ u32 mSize;
/* 0x08 */ u32 mFlags;
/* 0x0C */ s16 mClrPrmAnmOffset;
/* 0x0E */ s16 mClrEnvAnmOffset;
/* 0x10 */ f32 mBaseSizeX;
/* 0x14 */ f32 mBaseSizeY;
/* 0x18 */ u16 mBlendModeCfg;
/* 0x1A */ u8 mAlphaCompareCfg;
/* 0x1B */ u8 mAlphaRef0;
/* 0x1C */ u8 mAlphaRef1;
/* 0x1D */ u8 mZModeCfg;
/* 0x1E */ u8 mTexFlg;
/* 0x1F */ u8 mTexAnmNum;
/* 0x20 */ u8 mTexIdx;
/* 0x21 */ u8 mClrFlg;
/* 0x22 */ u8 mClrPrmKeyNum;
/* 0x23 */ u8 mClrEnvKeyNum;
/* 0x24 */ s16 mClrAnmFrmMax;
/* 0x26 */ GXColor mClrPrm;
/* 0x2A */ GXColor mClrEnv;
/* 0x2E */ u8 mAnmRndm;
/* 0x2F */ u8 mClrAnmRndmMask;
/* 0x30 */ u8 mTexAnmRndmMask;
};
struct JPABaseShape {
public:
/* 8027A6DC */ JPABaseShape(u8 const*, JKRHeap*);
/* 8027A7E8 */ void setGX(JPAEmitterWorkData*) const;
static GXBlendMode st_bm[3];
static GXBlendFactor st_bf[10];
static GXLogicOp st_lo[16];
static GXCompare st_c[8];
static GXAlphaOp st_ao[4];
static GXTevColorArg st_ca[6][4];
static GXTevAlphaArg st_aa[2][4];
GXBlendMode getBlendMode() const { return st_bm[mpData->mBlendModeCfg & 0x03]; }
GXBlendFactor getBlendSrc() const { return st_bf[(mpData->mBlendModeCfg >> 2) & 0x0F]; }
GXBlendFactor getBlendDst() const { return st_bf[(mpData->mBlendModeCfg >> 6) & 0x0F]; }
GXLogicOp getLogicOp() const { return st_lo[(mpData->mBlendModeCfg >> 10) & 0x0F]; }
GXBool getZCompLoc() const { return (GXBool)((mpData->mZModeCfg >> 5) & 0x01); }
GXBool getZEnable() const { return (GXBool)(mpData->mZModeCfg & 0x01); }
GXCompare getZCmp() const { return st_c[(mpData->mZModeCfg >> 1) & 0x07]; }
GXBool getZUpd() const { return (GXBool)((mpData->mZModeCfg >> 4) & 0x01); }
GXCompare getAlphaCmp0() const { return st_c[mpData->mAlphaCompareCfg & 0x07]; }
u8 getAlphaRef0() const { return mpData->mAlphaRef0; }
GXAlphaOp getAlphaOp() const { return st_ao[(mpData->mAlphaCompareCfg >> 3) & 0x03]; }
GXCompare getAlphaCmp1() const { return st_c[(mpData->mAlphaCompareCfg >> 5) & 0x07]; }
u8 getAlphaRef1() const { return mpData->mAlphaRef1; }
const GXTevColorArg* getTevColorArg() const { return st_ca[(mpData->mFlags >> 0x0F) & 0x07]; }
const GXTevAlphaArg* getTevAlphaArg() const { return st_aa[(mpData->mFlags >> 0x12) & 0x01]; }
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 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 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 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); }
u8 getClrAnmType() const { return (mpData->mClrFlg >> 4) & 0x07; }
s16 getClrAnmMaxFrm() const { return mpData->mClrAnmFrmMax; }
void getPrmClr(s16 idx, GXColor* dst) { *dst = mpPrmClrAnmTbl[idx]; }
void getEnvClr(s16 idx, GXColor* dst) { *dst = mpEnvClrAnmTbl[idx]; }
bool isTexAnm() const { return !!(mpData->mTexFlg & 0x01); }
u8 getTexAnmType() const { return (mpData->mTexFlg >> 2) & 0x07; }
u32 getTexIdx() const { return mpData->mTexIdx; }
f32 getBaseSizeX() const { return mpData->mBaseSizeX; }
f32 getBaseSizeY() const { return mpData->mBaseSizeY; }
public:
const JPABaseShapeData* mpData;
const void* mpTexCrdMtxAnmTbl;
const u8* mpTexIdxAnimTbl;
GXColor* mpPrmClrAnmTbl;
GXColor* mpEnvClrAnmTbl;
};
#endif /* JPABASESHAPE_H */

View File

@ -194,6 +194,7 @@ public:
bool checkStatus(u32 status) { return !!(mStatus & status); }
u8 getResourceManagerID() const { return mResMgrID; }
u8 getGroupID() const { return mGroupID; }
u8 getDrawTimes() const { return mDrawTimes; }
public:
/* 0x00 */ Vec mLocalScl;

View File

@ -20,105 +20,6 @@ struct JKRHeap {
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
};
struct JPABaseShapeData {
// Common header.
/* 0x00 */ u8 mMagic[4];
/* 0x04 */ u32 mSize;
/* 0x08 */ u32 mFlags;
/* 0x0C */ s16 mClrPrmAnmOffset;
/* 0x0E */ s16 mClrEnvAnmOffset;
/* 0x10 */ f32 mBaseSizeX;
/* 0x14 */ f32 mBaseSizeY;
/* 0x18 */ u16 mBlendModeCfg;
/* 0x1A */ u8 mAlphaCompareCfg;
/* 0x1B */ u8 mAlphaRef0;
/* 0x1C */ u8 mAlphaRef1;
/* 0x1D */ u8 mZModeCfg;
/* 0x1E */ u8 mTexFlg;
/* 0x1F */ u8 mTexAnmNum;
/* 0x20 */ u8 mTexIdx;
/* 0x21 */ u8 mClrFlg;
/* 0x22 */ u8 mClrPrmKeyNum;
/* 0x23 */ u8 mClrEnvKeyNum;
/* 0x24 */ s16 mClrAnmFrmMax;
/* 0x26 */ GXColor mClrPrm;
/* 0x2A */ GXColor mClrEnv;
/* 0x2E */ u8 mAnmRndm;
/* 0x2F */ u8 mClrAnmRndmMask;
/* 0x30 */ u8 mTexAnmRndmMask;
};
struct JPABaseShape {
public:
/* 8027A6DC */ JPABaseShape(u8 const*, JKRHeap*);
/* 8027A7E8 */ void setGX(JPAEmitterWorkData*) const;
static GXBlendMode st_bm[3];
static GXBlendFactor st_bf[10];
static GXLogicOp st_lo[16];
static GXCompare st_c[8];
static GXAlphaOp st_ao[4];
static GXTevColorArg st_ca[6][4];
static GXTevAlphaArg st_aa[2][4];
GXBlendMode getBlendMode() const { return st_bm[mpData->mBlendModeCfg & 0x03]; }
GXBlendFactor getBlendSrc() const { return st_bf[(mpData->mBlendModeCfg >> 2) & 0x0F]; }
GXBlendFactor getBlendDst() const { return st_bf[(mpData->mBlendModeCfg >> 6) & 0x0F]; }
GXLogicOp getLogicOp() const { return st_lo[(mpData->mBlendModeCfg >> 10) & 0x0F]; }
GXBool getZCompLoc() const { return (GXBool)((mpData->mZModeCfg >> 5) & 0x01); }
GXBool getZEnable() const { return (GXBool)(mpData->mZModeCfg & 0x01); }
GXCompare getZCmp() const { return st_c[(mpData->mZModeCfg >> 1) & 0x07]; }
GXBool getZUpd() const { return (GXBool)((mpData->mZModeCfg >> 4) & 0x01); }
GXCompare getAlphaCmp0() const { return st_c[mpData->mAlphaCompareCfg & 0x07]; }
u8 getAlphaRef0() const { return mpData->mAlphaRef0; }
GXAlphaOp getAlphaOp() const { return st_ao[(mpData->mAlphaCompareCfg >> 3) & 0x03]; }
GXCompare getAlphaCmp1() const { return st_c[(mpData->mAlphaCompareCfg >> 5) & 0x07]; }
u8 getAlphaRef1() const { return mpData->mAlphaRef1; }
const GXTevColorArg* getTevColorArg() const { return st_ca[(mpData->mFlags >> 0x0F) & 0x07]; }
const GXTevAlphaArg* getTevAlphaArg() const { return st_aa[(mpData->mFlags >> 0x12) & 0x01]; }
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 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 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 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); }
u8 getClrAnmType() const { return (mpData->mClrFlg >> 4) & 0x07; }
s16 getClrAnmMaxFrm() const { return mpData->mClrAnmFrmMax; }
void getPrmClr(s16 idx, GXColor* dst) { *dst = mpPrmClrAnmTbl[idx]; }
void getEnvClr(s16 idx, GXColor* dst) { *dst = mpEnvClrAnmTbl[idx]; }
bool isTexAnm() const { return !!(mpData->mTexFlg & 0x01); }
u8 getTexAnmType() const { return (mpData->mTexFlg >> 2) & 0x07; }
u32 getTexIdx() const { return mpData->mTexIdx; }
f32 getBaseSizeX() const { return mpData->mBaseSizeX; }
f32 getBaseSizeY() const { return mpData->mBaseSizeY; }
public:
const JPABaseShapeData* mpData;
const void* mpTexCrdMtxAnmTbl;
const u8* mpTexIdxAnimTbl;
GXColor* mpPrmClrAnmTbl;
GXColor* mpEnvClrAnmTbl;
};
struct JMath {
static u8 sincosTable_[65536];
};

View File

@ -5,6 +5,7 @@
#include "JSystem/JParticle/JPAResource.h"
#include "JSystem/JParticle/JPAMath.h"
#include "JSystem/JParticle/JPABaseShape.h"
#include "JSystem/JParticle/JPAParticle.h"
#include "dol2asm.h"
#include "dolphin/mtx/mtx.h"
@ -148,14 +149,34 @@ extern "C" void _restgpr_28();
//
/* 80274010-80274080 26E950 0070+00 0/0 1/1 0/0 .text __ct__11JPAResourceFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JPAResource::JPAResource() {
nofralloc
#include "asm/JSystem/JParticle/JPAResource/__ct__11JPAResourceFv.s"
JPAResource::JPAResource() {
mpDrawEmitterChildFuncList = NULL;
mpDrawEmitterFuncList = NULL;
mpCalcEmitterFuncList = NULL;
mpDrawParticleChildFuncList = NULL;
mpCalcParticleChildFuncList = NULL;
mpDrawParticleFuncList = NULL;
mpCalcParticleFuncList = NULL;
mpBaseShape = NULL;
mpExtraShape = NULL;
mpChildShape = NULL;
mpExTexShape = NULL;
mpDynamicsBlock = NULL;
mpFieldBlocks = NULL;
mpKeyBlocks = NULL;
mpTDB1 = NULL;
mpDrawParticleChildFuncListNum = 0;
mpCalcParticleChildFuncListNum = 0;
mpDrawParticleFuncListNum = 0;
mpCalcParticleFuncListNum = 0;
mpDrawEmitterChildFuncListNum = 0;
mpDrawEmitterFuncListNum = 0;
mpCalcEmitterFuncListNum = 0;
mTDB1Num = 0;
mKeyBlockNum = 0;
mFieldBlockNum = 0;
mUsrIdx = 0;
}
#pragma pop
/* ############################################################################################## */
/* 803C40C0-803C4220 0211E0 0144+1C 2/2 0/0 0/0 .data jpa_pos */
@ -574,14 +595,21 @@ asm void JPAResource::calc(JPAEmitterWorkData* param_0, JPABaseEmitter* param_1)
/* 80275A94-80275B74 2703D4 00E0+00 0/0 1/1 0/0 .text
* draw__11JPAResourceFP18JPAEmitterWorkDataP14JPABaseEmitter */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JPAResource::draw(JPAEmitterWorkData* param_0, JPABaseEmitter* param_1) {
nofralloc
#include "asm/JSystem/JParticle/JPAResource/draw__11JPAResourceFP18JPAEmitterWorkDataP14JPABaseEmitter.s"
void JPAResource::draw(JPAEmitterWorkData* work, JPABaseEmitter* emtr) {
work->mpEmtr = emtr;
work->mpRes = this;
work->mDrawCount = 0;
calcWorkData_d(work);
mpBaseShape->setGX(work);
for (s32 i = 1; i <= emtr->getDrawTimes(); i++) {
work->mDrawCount++;
if (mpBaseShape->isDrawPrntAhead() && mpChildShape != NULL)
drawC(work);
drawP(work);
if (!mpBaseShape->isDrawPrntAhead() && mpChildShape != NULL)
drawC(work);
}
}
#pragma pop
/* ############################################################################################## */
/* 80455290-80455294 003890 0004+00 2/2 0/0 0/0 .sdata2 @3189 */