Document the rest of spl_manager

This commit is contained in:
Fexty12573 2024-07-31 13:52:28 +02:00
parent 0ea26be145
commit 2ada50bdf1
7 changed files with 172 additions and 169 deletions

View File

@ -16,7 +16,7 @@ typedef struct UnkSPLStruct7 {
u32 terminate:1;
u32 stop_generate:1;
u32 paused:1;
u32 stop_draw:1;
u32 renderingDisabled:1;
u32 started: 1 ;
u32 reserved0:27;
};
@ -24,8 +24,8 @@ typedef struct UnkSPLStruct7 {
} UnkSPLStruct7;
typedef struct SPLEmitter {
struct SPLEmitter * unk_00;
struct SPLEmitter * unk_04;
struct SPLEmitter *next;
struct SPLEmitter *prev;
SPLParticleList particles;
SPLParticleList childParticles;
SPLResource *resource;

View File

@ -35,26 +35,26 @@ typedef struct SPLManager {
} polygonID;
s32 unk_3C;
struct {
SPLEmitter * unk_00;
const MtxFx43 * unk_04;
} unk_40;
SPLEmitter *emitter; // current emitter being processed
const MtxFx43 *viewMatrix; // current view matrix
} renderState;
u16 currentCycle;
u16 unk_4A;
} SPLManager; // size=0x4c
typedef void(* EmitterCallback)(SPLEmitter *);
typedef void(* EmitterCallbackEx)(SPLEmitter *, void *);
typedef void(* SPLEmitterCallback)(SPLEmitter *);
typedef void(* SPLEmitterCallbackEx)(SPLEmitter *, void *);
typedef u32(* SPLTexVRAMAllocFunc)(u32 size, BOOL is4x4comp);
typedef u32(* SPLPalVRAMAllocFunc)(u32 size, BOOL is4pal);
SPLManager *SPLManager_New(SPLAllocFunc alloc, u16 maxEmitters, u16 maxParticles, u16 fixPolyID, u16 minPolyID, u16 maxPolyID);
void SPL_0209C400(SPLManager * param0);
void SPL_0209C444(SPLManager * param0, SPLEmitter * param1);
SPLEmitter * SPL_0209C4D8(SPLManager * param0, int param1, EmitterCallback cb);
SPLEmitter *SPL_CreateWithInitializeEx(SPLManager *mgr, int resNo, VecFx32 *pos, void *pvoid, EmitterCallbackEx cb);
void SPL_0209C5E0(SPLManager * param0, const MtxFx43 * param1);
SPLEmitter * SPL_0209C56C(SPLManager * param0, int param1, const VecFx32 * param2);
void SPLManager_DeleteAllEmitters(SPLManager * param0);
void SPLManager_DeleteEmitter(SPLManager * param0, SPLEmitter * param1);
SPLEmitter * SPLManager_CreateEmitterWithCallback(SPLManager * param0, int param1, SPLEmitterCallback cb);
SPLEmitter *SPLManager_CreateEmitterWithCallbackEx(SPLManager *mgr, int resNo, VecFx32 *pos, void *pvoid, SPLEmitterCallbackEx cb);
void SPLManager_Draw(SPLManager * param0, const MtxFx43 * param1);
SPLEmitter * SPLManager_CreateEmitter(SPLManager * param0, int param1, const VecFx32 * param2);
void SPLManager_Update(SPLManager * param0);
BOOL SPLManager_UploadPalettes(SPLManager * param0);
BOOL SPLManager_UploadTextures(SPLManager * param0);

View File

@ -30,8 +30,10 @@ typedef union {
u32 hasTexAnim : 1;
u32 unk_05_4 : 1;
u32 unk_05_5 : 1;
// If set, the emitter will terminate when it reaches the end of its life and all of its particles have died
u32 selfTerminate : 1;
// Whether the emitter manages itself or not.
// If set, the emitter will automatically terminate when it reaches the end of its life
// and all of its particles have died
u32 selfMaintaining : 1;
u32 unk_05_7 : 1;
u32 hasChildResource : 1;
u32 unk_06_1 : 2;

View File

@ -12,7 +12,7 @@
#define DECODE_WH(X) ((u16)(1 << ((X) + 3)))
#define EMITTER_SHOULD_TERMINATE(emtr, header) \
((\
(header->flags.selfTerminate && header->emitterLifeTime != 0 && emtr->state.started && emtr->age > header->emitterLifeTime) \
(header->flags.selfMaintaining && header->emitterLifeTime != 0 && emtr->state.started && emtr->age > header->emitterLifeTime) \
|| emtr->state.terminate \
) && emtr->particles.count == 0 && emtr->childParticles.count == 0)
@ -279,7 +279,7 @@ void SPLManager_Update(SPLManager *mgr)
emtr = mgr->activeEmitters.first;
while (emtr != NULL) {
SPLResourceHeader *header = emtr->resource->header;
next = emtr->unk_00;
next = emtr->next;
if (!emtr->state.started && emtr->age >= header->startDelay) {
emtr->state.started = TRUE;
@ -306,43 +306,46 @@ void SPLManager_Update(SPLManager *mgr)
}
}
void SPL_0209C5E0(SPLManager *mgr, const MtxFx43 *cmr)
void SPLManager_Draw(SPLManager *mgr, const MtxFx43 *viewMatrix)
{
G3X_AlphaBlend(TRUE);
mgr->unk_40.unk_04 = cmr;
mgr->renderState.viewMatrix = viewMatrix;
if (mgr->polygonID.drawOrder == SPL_DRAW_ORDER_REVERSE) {
SPLEmitter *emtr = mgr->activeEmitters.first;
while (emtr != NULL) {
mgr->unk_40.unk_00 = emtr;
if (!emtr->state.stop_draw) {
mgr->renderState.emitter = emtr;
if (!emtr->state.renderingDisabled) {
sub_0209CF00(mgr);
}
emtr = emtr->unk_00;
emtr = emtr->next;
}
} else {
SPLEmitter *emtr = mgr->activeEmitters.last;
while (emtr != NULL) {
mgr->unk_40.unk_00 = emtr;
if (!emtr->state.stop_draw) {
mgr->renderState.emitter = emtr;
if (!emtr->state.renderingDisabled) {
sub_0209CF00(mgr);
}
emtr = emtr->unk_04;
emtr = emtr->prev;
}
}
}
SPLEmitter *SPL_0209C56C(SPLManager *mgr, int resno, const VecFx32 *pos)
SPLEmitter *SPLManager_CreateEmitter(SPLManager *mgr, int resourceID, const VecFx32 *pos)
{
SPLEmitter *emtr = NULL;
if (mgr->inactiveEmitters.first != NULL) {
emtr = (SPLEmitter *)SPLList_PopFront((SPLList *)&mgr->inactiveEmitters);
sub_0209D998(emtr, mgr->resources + resno, pos);
SPLList_PushFront((SPLList *)&mgr->activeEmitters, (SPLNode *)emtr);
if (emtr->resource->header->flags.selfTerminate) {
emtr = SPLEmitterList_PopFront(&mgr->inactiveEmitters);
sub_0209D998(emtr, mgr->resources + resourceID, pos);
SPLEmitterList_PushFront(&mgr->activeEmitters, emtr);
if (emtr->resource->header->flags.selfMaintaining) { // Self-maintaining emitters are not returned to the user
emtr = NULL;
}
}
@ -350,20 +353,21 @@ SPLEmitter *SPL_0209C56C(SPLManager *mgr, int resno, const VecFx32 *pos)
return emtr;
}
SPLEmitter *SPL_0209C4D8(SPLManager *mgr, int resno, EmitterCallback fpcb)
SPLEmitter *SPLManager_CreateEmitterWithCallback(SPLManager *mgr, int resourceID, SPLEmitterCallback initCallback)
{
SPLEmitter *emtr;
emtr = NULL;
SPLEmitter *emtr = NULL;
if (mgr->inactiveEmitters.first != NULL) {
VecFx32 v0 = { 0, 0, 0 };
emtr = (SPLEmitter *)SPLList_PopFront((SPLList *)&mgr->inactiveEmitters);
sub_0209D998(emtr, mgr->resources + resno, &v0);
if (fpcb != NULL) {
fpcb(emtr);
VecFx32 pos = { 0, 0, 0 };
emtr = SPLEmitterList_PopFront(&mgr->inactiveEmitters);
sub_0209D998(emtr, mgr->resources + resourceID, &pos);
if (initCallback != NULL) {
initCallback(emtr);
}
SPLList_PushFront((SPLList *)&mgr->activeEmitters, (SPLNode *)emtr);
if (emtr->resource->header->flags.selfTerminate) {
SPLEmitterList_PushFront(&mgr->activeEmitters, emtr);
if (emtr->resource->header->flags.selfMaintaining) { // Self-maintaining emitters are not returned to the user
emtr = NULL;
}
}
@ -371,20 +375,20 @@ SPLEmitter *SPL_0209C4D8(SPLManager *mgr, int resno, EmitterCallback fpcb)
return emtr;
}
SPLEmitter *SPL_CreateWithInitializeEx(SPLManager *mgr, int resNo, VecFx32 *pos, void *pvoid, EmitterCallbackEx cb)
SPLEmitter *SPLManager_CreateEmitterWithCallbackEx(SPLManager *mgr, int resourceID, VecFx32 *pos, void *param, SPLEmitterCallbackEx initCallback)
{
SPLEmitter *emtr;
emtr = NULL;
SPLEmitter *emtr = NULL;
if (mgr->inactiveEmitters.first != NULL) {
emtr = (SPLEmitter *)SPLList_PopFront((SPLList *)&mgr->inactiveEmitters);
sub_0209D998(emtr, mgr->resources + resNo, pos);
if (cb != NULL) {
cb(emtr, pvoid);
emtr = SPLEmitterList_PopFront(&mgr->inactiveEmitters);
sub_0209D998(emtr, mgr->resources + resourceID, pos);
if (initCallback != NULL) {
initCallback(emtr, param);
}
SPLList_PushFront((SPLList *)&mgr->activeEmitters, (SPLNode *)emtr);
if (emtr->resource->header->flags.selfTerminate) {
SPLEmitterList_PushFront(&mgr->activeEmitters, emtr);
if (emtr->resource->header->flags.selfMaintaining) { // Self-maintaining emitters are not returned to the user
emtr = NULL;
}
}
@ -392,34 +396,30 @@ SPLEmitter *SPL_CreateWithInitializeEx(SPLManager *mgr, int resNo, VecFx32 *pos,
return emtr;
}
void SPL_0209C444(SPLManager *p0, SPLEmitter *p1)
void SPLManager_DeleteEmitter(SPLManager *mgr, SPLEmitter *emtr)
{
SPLEmitter *v0 = (SPLEmitter *)SPLList_PopFront((SPLList *)&p1->particles);
if (v0 != NULL) {
do {
SPLList_PushFront((SPLList *)&p0->inactiveParticles, (SPLNode *)v0);
v0 = (SPLEmitter *)SPLList_PopFront((SPLList *)&p1->particles);
} while (v0 != NULL);
SPLParticle *ptcl = SPLParticleList_PopFront(&emtr->particles);
while (ptcl != NULL) {
SPLParticleList_PushFront(&mgr->inactiveParticles, ptcl);
ptcl = SPLParticleList_PopFront(&emtr->particles);
}
v0 = (SPLEmitter *)SPLList_PopFront((SPLList *)&p1->childParticles);
if (v0 != NULL) {
do {
SPLList_PushFront((SPLList *)&p0->inactiveParticles, (SPLNode *)v0);
v0 = (SPLEmitter *)SPLList_PopFront((SPLList *)&p1->childParticles);
} while (v0 != NULL);
ptcl = SPLParticleList_PopFront(&emtr->childParticles);
while (ptcl != NULL) {
SPLParticleList_PushFront(&mgr->inactiveParticles, ptcl);
ptcl = SPLParticleList_PopFront(&emtr->childParticles);
}
SPLList_Erase((SPLList *)&p0->activeEmitters, (SPLNode *)p1);
SPLList_PushFront((SPLList *)&p0->inactiveEmitters, (SPLNode *)p1);
SPLEmitterList_Erase(&mgr->activeEmitters, emtr);
SPLEmitterList_PushFront(&mgr->inactiveEmitters, emtr);
}
void SPL_0209C400(SPLManager *p0)
void SPLManager_DeleteAllEmitters(SPLManager *mgr)
{
SPLEmitter *next;
SPLEmitter *emtr = p0->activeEmitters.first;
SPLEmitter *emtr = mgr->activeEmitters.first;
while (emtr != NULL) {
next = emtr->unk_00;
SPL_0209C444(p0, emtr);
SPLEmitter *next = emtr->next;
SPLManager_DeleteEmitter(mgr, emtr);
emtr = next;
}
}

View File

@ -114,7 +114,7 @@ void sub_0209D998(SPLEmitter *emtr, SPLResource *res, const VecFx32 *pos)
}
}
emtr->unk_00 = emtr->unk_04 = NULL;
emtr->next = emtr->prev = NULL;
emtr->particles.first = emtr->childParticles.first = NULL;
emtr->particles.count = emtr->childParticles.count = 0;
emtr->unk_100 = NULL;
@ -324,7 +324,7 @@ static void sub_0209D064(SPLManager *mgr)
DrawFunc drawFunc;
SetTexFunc setTexFunc;
emtr = mgr->unk_40.unk_00;
emtr = mgr->renderState.emitter;
resBase = emtr->resource->header;
drawFunc = NULL;
@ -365,7 +365,7 @@ static void sub_0209CF7C(SPLManager *mgr)
DrawFunc drawFunc;
SPLParticle *ptcl;
emtr = mgr->unk_40.unk_00;
emtr = mgr->renderState.emitter;
drawFunc = NULL;
res = emtr->resource;
@ -404,7 +404,7 @@ void sub_0209CF00(SPLManager *mgr)
{
SPLResourceHeader *resBase;
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
if (resBase->flags.unk_06_5) {
sub_0209CF7C(mgr);

View File

@ -128,11 +128,11 @@ void sub_0209FF0C(SPLManager *mgr, SPLParticle *ptcl)
GXRgb ptclCol, emtrCol;
u8 scaleAnimDirect;
SPLEmitter *emtr = mgr->unk_40.unk_00;
SPLEmitter *emtr = mgr->renderState.emitter;
SPLResourceHeader *resBase = emtr->resource->header;
cmr = mgr->unk_40.unk_04;
aspect = mgr->unk_40.unk_00->resource->header->unk_30;
cmr = mgr->renderState.viewMatrix;
aspect = mgr->renderState.emitter->resource->header->unk_30;
animScale = ptcl->unk_34;
ptclCol = ptcl->unk_36;
@ -168,7 +168,7 @@ void sub_0209FF0C(SPLManager *mgr, SPLParticle *ptcl)
sclY = FX_MUL(sclY, animScale);
}
if (!mgr->unk_40.unk_00->resource->header->flags.unk_06_7) {
if (!mgr->renderState.emitter->resource->header->flags.unk_06_7) {
trs.x = ptcl->position.x + ptcl->emitterPos.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z;
@ -192,9 +192,9 @@ void sub_0209FF0C(SPLManager *mgr, SPLParticle *ptcl)
G3_Identity();
G3_MultMtx43(&load);
} else {
trs.x = ptcl->position.x + ptcl->emitterPos.x - mgr->unk_40.unk_00->resource->header->unk_04.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y - mgr->unk_40.unk_00->resource->header->unk_04.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z - mgr->unk_40.unk_00->resource->header->unk_04.z;
trs.x = ptcl->position.x + ptcl->emitterPos.x - mgr->renderState.emitter->resource->header->unk_04.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y - mgr->renderState.emitter->resource->header->unk_04.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z - mgr->renderState.emitter->resource->header->unk_04.z;
MTX_MultVec43(&trs, cmr, &trs);
sin = FX_SinIdx(ptcl->unk_20);
@ -214,7 +214,7 @@ void sub_0209FF0C(SPLManager *mgr, SPLParticle *ptcl)
G3_Identity();
SPLResourceHeader *resBase = mgr->unk_40.unk_00->resource->header;
SPLResourceHeader *resBase = mgr->renderState.emitter->resource->header;
G3_Translate(resBase->unk_04.x, resBase->unk_04.y, resBase->unk_04.z);
G3_MultMtx43(&load);
}
@ -224,7 +224,7 @@ void sub_0209FF0C(SPLManager *mgr, SPLParticle *ptcl)
GX_RGB_G_(ptclCol) * GX_RGB_G_(emtrCol) >> 15,
GX_RGB_B_(ptclCol) * GX_RGB_B_(emtrCol) >> 25));
emtr = mgr->unk_40.unk_00;
emtr = mgr->renderState.emitter;
sub_020A0500(emtr->unk_E8, emtr->unk_EA, emtr->resource->header->unk_54, emtr->resource->header->unk_56);
}
@ -237,8 +237,8 @@ void sub_0209FAB8(SPLManager *mgr, SPLParticle *ptcl)
MtxFx43 load;
fx32 sin;
cmr = mgr->unk_40.unk_04;
aspect = mgr->unk_40.unk_00->resource->header->unk_30;
cmr = mgr->renderState.viewMatrix;
aspect = mgr->renderState.emitter->resource->header->unk_30;
fx32 alpha = (fx32)(ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1)) >> 5;
@ -259,7 +259,7 @@ void sub_0209FAB8(SPLManager *mgr, SPLParticle *ptcl)
sclY = ptcl->unk_30;
sclX = FX_MUL(sclY, aspect);
switch (mgr->unk_40.unk_00->resource->header->unk_48.unk_07_4) {
switch (mgr->renderState.emitter->resource->header->unk_48.unk_07_4) {
case 0:
sclX = FX_MUL(sclX, ptcl->unk_34);
sclY = FX_MUL(sclY, ptcl->unk_34);
@ -274,7 +274,7 @@ void sub_0209FAB8(SPLManager *mgr, SPLParticle *ptcl)
break;
}
if (!mgr->unk_40.unk_00->resource->header->flags.unk_06_7) {
if (!mgr->renderState.emitter->resource->header->flags.unk_06_7) {
trs.x = ptcl->position.x + ptcl->emitterPos.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z;
@ -298,9 +298,9 @@ void sub_0209FAB8(SPLManager *mgr, SPLParticle *ptcl)
G3_Identity();
G3_MultMtx43(&load);
} else {
trs.x = ptcl->position.x + ptcl->emitterPos.x - mgr->unk_40.unk_00->resource->header->unk_04.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y - mgr->unk_40.unk_00->resource->header->unk_04.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z - mgr->unk_40.unk_00->resource->header->unk_04.z;
trs.x = ptcl->position.x + ptcl->emitterPos.x - mgr->renderState.emitter->resource->header->unk_04.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y - mgr->renderState.emitter->resource->header->unk_04.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z - mgr->renderState.emitter->resource->header->unk_04.z;
MTX_MultVec43(&trs, cmr, &trs);
sin = FX_SinIdx(ptcl->unk_20);
@ -320,19 +320,19 @@ void sub_0209FAB8(SPLManager *mgr, SPLParticle *ptcl)
G3_Identity();
SPLResourceHeader *resBase = mgr->unk_40.unk_00->resource->header;
SPLResourceHeader *resBase = mgr->renderState.emitter->resource->header;
G3_Translate(resBase->unk_04.x, resBase->unk_04.y, resBase->unk_04.z);
G3_MultMtx43(&load);
}
GXRgb colA = ptcl->unk_36;
GXRgb colB = mgr->unk_40.unk_00->unk_E2;
GXRgb colB = mgr->renderState.emitter->unk_E2;
G3_Color(GX_RGB(
GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5,
GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15,
GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25));
SPLEmitter *emtr = mgr->unk_40.unk_00;
SPLEmitter *emtr = mgr->renderState.emitter;
sub_020A0500(emtr->unk_EC, emtr->unk_EE, 0, 0);
}
@ -348,8 +348,8 @@ void sub_0209F3D0(SPLManager *mgr, SPLParticle *ptcl)
MtxFx33 mtx;
MtxFx43 load;
cmr = mgr->unk_40.unk_04;
aspect = mgr->unk_40.unk_00->resource->header->unk_30;
cmr = mgr->renderState.viewMatrix;
aspect = mgr->renderState.emitter->resource->header->unk_30;
fx32 alpha = (fx32)(ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1)) >> 5;
@ -370,7 +370,7 @@ void sub_0209F3D0(SPLManager *mgr, SPLParticle *ptcl)
sclY = ptcl->unk_30;
sclX = FX_MUL(sclY, aspect);
switch (mgr->unk_40.unk_00->resource->header->unk_48.unk_07_4) {
switch (mgr->renderState.emitter->resource->header->unk_48.unk_07_4) {
case 0:
sclX = FX_MUL(sclX, ptcl->unk_34);
sclY = FX_MUL(sclY, ptcl->unk_34);
@ -385,7 +385,7 @@ void sub_0209F3D0(SPLManager *mgr, SPLParticle *ptcl)
break;
}
if (!mgr->unk_40.unk_00->resource->header->flags.unk_06_7) {
if (!mgr->renderState.emitter->resource->header->flags.unk_06_7) {
trs.x = ptcl->position.x + ptcl->emitterPos.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z;
@ -414,7 +414,7 @@ void sub_0209F3D0(SPLManager *mgr, SPLParticle *ptcl)
dot = -dot;
}
dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->unk_40.unk_00->resource->header->unk_48.unk_05_0) + FX32_ONE);
dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->renderState.emitter->resource->header->unk_48.unk_05_0) + FX32_ONE);
load.m[0][0] = FX_MUL(dir.x, sclX);
load.m[1][0] = FX_MUL(-dir.y, dot);
load.m[3][0] = trs.x;
@ -431,9 +431,9 @@ void sub_0209F3D0(SPLManager *mgr, SPLParticle *ptcl)
G3_Identity();
G3_MultMtx43(&load);
} else {
trs.x = ptcl->position.x + ptcl->emitterPos.x - mgr->unk_40.unk_00->resource->header->unk_04.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y - mgr->unk_40.unk_00->resource->header->unk_04.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z - mgr->unk_40.unk_00->resource->header->unk_04.z;
trs.x = ptcl->position.x + ptcl->emitterPos.x - mgr->renderState.emitter->resource->header->unk_04.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y - mgr->renderState.emitter->resource->header->unk_04.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z - mgr->renderState.emitter->resource->header->unk_04.z;
dir = ptcl->velocity;
@ -459,7 +459,7 @@ void sub_0209F3D0(SPLManager *mgr, SPLParticle *ptcl)
dot = -dot;
}
dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->unk_40.unk_00->resource->header->unk_48.unk_05_0) + FX32_ONE);
dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->renderState.emitter->resource->header->unk_48.unk_05_0) + FX32_ONE);
load.m[0][0] = FX_MUL(dir.x, sclX);
load.m[1][0] = FX_MUL(-dir.y, dot);
load.m[2][0] = 0;
@ -475,19 +475,19 @@ void sub_0209F3D0(SPLManager *mgr, SPLParticle *ptcl)
G3_Identity();
SPLResourceHeader *resBase = mgr->unk_40.unk_00->resource->header;
SPLResourceHeader *resBase = mgr->renderState.emitter->resource->header;
G3_Translate(resBase->unk_04.x, resBase->unk_04.y, resBase->unk_04.z);
G3_MultMtx43(&load);
}
GXRgb colA = ptcl->unk_36;
GXRgb colB = mgr->unk_40.unk_00->unk_E2;
GXRgb colB = mgr->renderState.emitter->unk_E2;
G3_Color(GX_RGB(
GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5,
GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15,
GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25));
SPLEmitter *emtr = mgr->unk_40.unk_00;
SPLEmitter *emtr = mgr->renderState.emitter;
sub_020A0500(emtr->unk_E8, emtr->unk_EA, emtr->resource->header->unk_54, emtr->resource->header->unk_56);
}
@ -503,8 +503,8 @@ void sub_0209ECF0(SPLManager *mgr, SPLParticle *ptcl)
MtxFx33 mtx;
MtxFx43 load;
cmr = mgr->unk_40.unk_04;
aspect = mgr->unk_40.unk_00->resource->header->unk_30;
cmr = mgr->renderState.viewMatrix;
aspect = mgr->renderState.emitter->resource->header->unk_30;
fx32 alpha = (fx32)(ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1)) >> 5;
@ -525,7 +525,7 @@ void sub_0209ECF0(SPLManager *mgr, SPLParticle *ptcl)
sclY = ptcl->unk_30;
sclX = FX_MUL(sclY, aspect);
switch (mgr->unk_40.unk_00->resource->header->unk_48.unk_07_4) {
switch (mgr->renderState.emitter->resource->header->unk_48.unk_07_4) {
case 0:
sclX = FX_MUL(sclX, ptcl->unk_34);
sclY = FX_MUL(sclY, ptcl->unk_34);
@ -540,7 +540,7 @@ void sub_0209ECF0(SPLManager *mgr, SPLParticle *ptcl)
break;
}
if (!mgr->unk_40.unk_00->resource->header->flags.unk_06_7) {
if (!mgr->renderState.emitter->resource->header->flags.unk_06_7) {
trs.x = ptcl->position.x + ptcl->emitterPos.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z;
@ -569,7 +569,7 @@ void sub_0209ECF0(SPLManager *mgr, SPLParticle *ptcl)
dot = -dot;
}
dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->unk_40.unk_00->resource->header->unk_48.unk_05_0) + FX32_ONE);
dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->renderState.emitter->resource->header->unk_48.unk_05_0) + FX32_ONE);
load.m[0][0] = FX_MUL(dir.x, sclX);
load.m[1][0] = FX_MUL(-dir.y, dot);
load.m[3][0] = trs.x;
@ -586,9 +586,9 @@ void sub_0209ECF0(SPLManager *mgr, SPLParticle *ptcl)
G3_Identity();
G3_MultMtx43(&load);
} else {
trs.x = ptcl->position.x + ptcl->emitterPos.x - mgr->unk_40.unk_00->resource->header->unk_04.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y - mgr->unk_40.unk_00->resource->header->unk_04.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z - mgr->unk_40.unk_00->resource->header->unk_04.z;
trs.x = ptcl->position.x + ptcl->emitterPos.x - mgr->renderState.emitter->resource->header->unk_04.x;
trs.y = ptcl->position.y + ptcl->emitterPos.y - mgr->renderState.emitter->resource->header->unk_04.y;
trs.z = ptcl->position.z + ptcl->emitterPos.z - mgr->renderState.emitter->resource->header->unk_04.z;
dir = ptcl->velocity;
@ -614,7 +614,7 @@ void sub_0209ECF0(SPLManager *mgr, SPLParticle *ptcl)
dot = -dot;
}
dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->unk_40.unk_00->resource->header->unk_48.unk_05_0) + FX32_ONE);
dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->renderState.emitter->resource->header->unk_48.unk_05_0) + FX32_ONE);
load.m[0][0] = FX_MUL(dir.x, sclX);
load.m[1][0] = FX_MUL(-dir.y, dot);
load.m[2][0] = 0;
@ -630,19 +630,19 @@ void sub_0209ECF0(SPLManager *mgr, SPLParticle *ptcl)
G3_Identity();
SPLResourceHeader *resBase = mgr->unk_40.unk_00->resource->header;
SPLResourceHeader *resBase = mgr->renderState.emitter->resource->header;
G3_Translate(resBase->unk_04.x, resBase->unk_04.y, resBase->unk_04.z);
G3_MultMtx43(&load);
}
GXRgb colA = ptcl->unk_36;
GXRgb colB = mgr->unk_40.unk_00->unk_E2;
GXRgb colB = mgr->renderState.emitter->unk_E2;
G3_Color(GX_RGB(
GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5,
GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15,
GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25));
SPLEmitter *emtr = mgr->unk_40.unk_00;
SPLEmitter *emtr = mgr->renderState.emitter;
sub_020A0500(emtr->unk_EC, emtr->unk_EE, 0, 0);
}
@ -672,10 +672,10 @@ void sub_0209E9A0(SPLManager *mgr, SPLParticle *ptcl)
return;
}
Unk_02100DA8[mgr->unk_40.unk_00->resource->header->flags.unk_06_1](FX_SinIdx(ptcl->unk_20), FX_CosIdx(ptcl->unk_20), &rotMtx);
Unk_02100DA8[mgr->renderState.emitter->resource->header->flags.unk_06_1](FX_SinIdx(ptcl->unk_20), FX_CosIdx(ptcl->unk_20), &rotMtx);
sclY = ptcl->unk_30;
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
sclX = FX_MUL(sclY, resBase->unk_30);
switch (resBase->unk_48.unk_07_4) {
@ -697,34 +697,34 @@ void sub_0209E9A0(SPLManager *mgr, SPLParticle *ptcl)
MTX_Concat43(&sclMtx, &rotMtx, &load);
// resBase = mgr->unk_40.unk_00->p_res->header;
if (!mgr->unk_40.unk_00->resource->header->flags.unk_06_7) {
if (!mgr->renderState.emitter->resource->header->flags.unk_06_7) {
load.m[3][0] = ptcl->position.x + ptcl->emitterPos.x;
load.m[3][1] = ptcl->position.y + ptcl->emitterPos.y;
load.m[3][2] = ptcl->position.z + ptcl->emitterPos.z;
G3_LoadMtx43(mgr->unk_40.unk_04);
G3_LoadMtx43(mgr->renderState.viewMatrix);
G3_MultMtx43(&load);
} else {
load.m[3][0] = ptcl->position.x + ptcl->emitterPos.x - mgr->unk_40.unk_00->resource->header->unk_04.x;
load.m[3][1] = ptcl->position.y + ptcl->emitterPos.y - mgr->unk_40.unk_00->resource->header->unk_04.y;
load.m[3][2] = ptcl->position.z + ptcl->emitterPos.z - mgr->unk_40.unk_00->resource->header->unk_04.z;
load.m[3][0] = ptcl->position.x + ptcl->emitterPos.x - mgr->renderState.emitter->resource->header->unk_04.x;
load.m[3][1] = ptcl->position.y + ptcl->emitterPos.y - mgr->renderState.emitter->resource->header->unk_04.y;
load.m[3][2] = ptcl->position.z + ptcl->emitterPos.z - mgr->renderState.emitter->resource->header->unk_04.z;
G3_Identity();
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
G3_Translate(resBase->unk_04.x, resBase->unk_04.y, resBase->unk_04.z);
G3_MultMtx43(mgr->unk_40.unk_04);
G3_MultMtx43(mgr->renderState.viewMatrix);
G3_MultMtx43(&load);
}
GXRgb colA = ptcl->unk_36;
GXRgb colB = mgr->unk_40.unk_00->unk_E2;
GXRgb colB = mgr->renderState.emitter->unk_E2;
G3_Color(GX_RGB(
GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5,
GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15,
GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25));
SPLEmitter *emtr = mgr->unk_40.unk_00;
SPLEmitter *emtr = mgr->renderState.emitter;
resBase = emtr->resource->header;
Unk_02100DA0[resBase->flags.unk_06_3](emtr->unk_E8, emtr->unk_EA, resBase->unk_54, resBase->unk_56);
}
@ -755,10 +755,10 @@ void sub_0209E650(SPLManager *mgr, SPLParticle *ptcl)
return;
}
Unk_02100DA8[mgr->unk_40.unk_00->resource->childResource->unk_00.unk_03_1](FX_SinIdx(ptcl->unk_20), FX_CosIdx(ptcl->unk_20), &rotMtx);
Unk_02100DA8[mgr->renderState.emitter->resource->childResource->unk_00.unk_03_1](FX_SinIdx(ptcl->unk_20), FX_CosIdx(ptcl->unk_20), &rotMtx);
sclY = ptcl->unk_30;
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
sclX = FX_MUL(sclY, resBase->unk_30);
switch (resBase->unk_48.unk_07_4) {
@ -779,33 +779,33 @@ void sub_0209E650(SPLManager *mgr, SPLParticle *ptcl)
MTX_Scale43(&sclMtx, sclX, sclY, sclY);
MTX_Concat43(&rotMtx, &sclMtx, &load);
if (!mgr->unk_40.unk_00->resource->header->flags.unk_06_7) {
if (!mgr->renderState.emitter->resource->header->flags.unk_06_7) {
load.m[3][0] = ptcl->position.x + ptcl->emitterPos.x;
load.m[3][1] = ptcl->position.y + ptcl->emitterPos.y;
load.m[3][2] = ptcl->position.z + ptcl->emitterPos.z;
G3_LoadMtx43(mgr->unk_40.unk_04);
G3_LoadMtx43(mgr->renderState.viewMatrix);
G3_MultMtx43(&load);
} else {
load.m[3][0] = ptcl->position.x + ptcl->emitterPos.x - mgr->unk_40.unk_00->resource->header->unk_04.x;
load.m[3][1] = ptcl->position.y + ptcl->emitterPos.y - mgr->unk_40.unk_00->resource->header->unk_04.y;
load.m[3][2] = ptcl->position.z + ptcl->emitterPos.z - mgr->unk_40.unk_00->resource->header->unk_04.z;
load.m[3][0] = ptcl->position.x + ptcl->emitterPos.x - mgr->renderState.emitter->resource->header->unk_04.x;
load.m[3][1] = ptcl->position.y + ptcl->emitterPos.y - mgr->renderState.emitter->resource->header->unk_04.y;
load.m[3][2] = ptcl->position.z + ptcl->emitterPos.z - mgr->renderState.emitter->resource->header->unk_04.z;
G3_Identity();
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
G3_Translate(resBase->unk_04.x, resBase->unk_04.y, resBase->unk_04.z);
G3_MultMtx43(mgr->unk_40.unk_04);
G3_MultMtx43(mgr->renderState.viewMatrix);
G3_MultMtx43(&load);
}
GXRgb colA = ptcl->unk_36;
GXRgb colB = mgr->unk_40.unk_00->unk_E2;
GXRgb colB = mgr->renderState.emitter->unk_E2;
G3_Color(GX_RGB(
GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5,
GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15,
GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25));
SPLEmitter *emtr = mgr->unk_40.unk_00;
SPLEmitter *emtr = mgr->renderState.emitter;
Unk_02100DA0[emtr->resource->childResource->unk_00.unk_03_3](emtr->unk_EC, emtr->unk_EE, 0, 0);
}
@ -837,11 +837,11 @@ void sub_0209E1D4(SPLManager *mgr, SPLParticle *ptcl)
return;
}
Unk_02100DA8[mgr->unk_40.unk_00->resource->header->flags.unk_06_1](FX_SinIdx(ptcl->unk_20), FX_CosIdx(ptcl->unk_20), &rotMat);
Unk_02100DA8[mgr->renderState.emitter->resource->header->flags.unk_06_1](FX_SinIdx(ptcl->unk_20), FX_CosIdx(ptcl->unk_20), &rotMat);
MTX_Identity43(&mat);
if (!mgr->unk_40.unk_00->resource->header->unk_48.unk_07_7) {
if (!mgr->renderState.emitter->resource->header->unk_48.unk_07_7) {
VEC_Normalize(&ptcl->velocity, &vec1);
} else {
VEC_Normalize(&ptcl->position, &vec1);
@ -875,7 +875,7 @@ void sub_0209E1D4(SPLManager *mgr, SPLParticle *ptcl)
mat.m[2][2] = vec3.z;
MTX_Concat43(&rotMat, &mat, &rotMat);
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
scaleY = ptcl->unk_30;
scaleX = FX_MUL(scaleY, resBase->unk_30);
@ -897,34 +897,34 @@ void sub_0209E1D4(SPLManager *mgr, SPLParticle *ptcl)
MTX_Scale43(&sclMat, scaleX, scaleY, scaleY);
MTX_Concat43(&sclMat, &rotMat, &transform);
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
if (!resBase->flags.unk_06_7) {
transform.m[3][0] = ptcl->position.x + ptcl->emitterPos.x;
transform.m[3][1] = ptcl->position.y + ptcl->emitterPos.y;
transform.m[3][2] = ptcl->position.z + ptcl->emitterPos.z;
G3_LoadMtx43(mgr->unk_40.unk_04);
G3_LoadMtx43(mgr->renderState.viewMatrix);
G3_MultMtx43(&transform);
} else {
transform.m[3][0] = ptcl->position.x + ptcl->emitterPos.x - resBase->unk_04.x;
transform.m[3][1] = ptcl->position.y + ptcl->emitterPos.y - mgr->unk_40.unk_00->resource->header->unk_04.y;
transform.m[3][2] = ptcl->position.z + ptcl->emitterPos.z - mgr->unk_40.unk_00->resource->header->unk_04.z;
transform.m[3][1] = ptcl->position.y + ptcl->emitterPos.y - mgr->renderState.emitter->resource->header->unk_04.y;
transform.m[3][2] = ptcl->position.z + ptcl->emitterPos.z - mgr->renderState.emitter->resource->header->unk_04.z;
G3_Identity();
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
G3_Translate(resBase->unk_04.x, resBase->unk_04.y, resBase->unk_04.z);
G3_MultMtx43(mgr->unk_40.unk_04);
G3_MultMtx43(mgr->renderState.viewMatrix);
G3_MultMtx43(&transform);
}
colA = ptcl->unk_36;
colB = mgr->unk_40.unk_00->unk_E2;
colB = mgr->renderState.emitter->unk_E2;
G3_Color(GX_RGB(
GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5,
GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15,
GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25));
emtr = mgr->unk_40.unk_00;
emtr = mgr->renderState.emitter;
resBase = emtr->resource->header;
Unk_02100DA0[resBase->flags.unk_06_3](emtr->unk_E8, emtr->unk_EA, resBase->unk_54, resBase->unk_56);
}
@ -955,11 +955,11 @@ void sub_0209DD54(SPLManager *mgr, SPLParticle *ptcl)
return;
}
Unk_02100DA8[mgr->unk_40.unk_00->resource->childResource->unk_00.unk_03_1](FX_SinIdx(ptcl->unk_20), FX_CosIdx(ptcl->unk_20), &rotMtx);
Unk_02100DA8[mgr->renderState.emitter->resource->childResource->unk_00.unk_03_1](FX_SinIdx(ptcl->unk_20), FX_CosIdx(ptcl->unk_20), &rotMtx);
MTX_Identity43(&mat);
if (!mgr->unk_40.unk_00->resource->childResource->unk_0C.unk_04_6) {
if (!mgr->renderState.emitter->resource->childResource->unk_0C.unk_04_6) {
VEC_Normalize(&ptcl->velocity, &vec1);
} else {
VEC_Normalize(&ptcl->position, &vec1);
@ -993,7 +993,7 @@ void sub_0209DD54(SPLManager *mgr, SPLParticle *ptcl)
mat.m[2][2] = vec3.z;
MTX_Concat43(&rotMtx, &mat, &rotMtx);
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
scaleY = ptcl->unk_30;
scaleX = FX_MUL(scaleY, resBase->unk_30);
@ -1015,33 +1015,33 @@ void sub_0209DD54(SPLManager *mgr, SPLParticle *ptcl)
MTX_Scale43(&sclMat, scaleX, scaleY, scaleY);
MTX_Concat43(&rotMtx, &sclMat, &transform);
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
if (!resBase->flags.unk_06_7) {
transform.m[3][0] = ptcl->position.x + ptcl->emitterPos.x;
transform.m[3][1] = ptcl->position.y + ptcl->emitterPos.y;
transform.m[3][2] = ptcl->position.z + ptcl->emitterPos.z;
G3_LoadMtx43(mgr->unk_40.unk_04);
G3_LoadMtx43(mgr->renderState.viewMatrix);
G3_MultMtx43(&transform);
} else {
transform.m[3][0] = ptcl->position.x + ptcl->emitterPos.x - resBase->unk_04.x;
transform.m[3][1] = ptcl->position.y + ptcl->emitterPos.y - mgr->unk_40.unk_00->resource->header->unk_04.y;
transform.m[3][2] = ptcl->position.z + ptcl->emitterPos.z - mgr->unk_40.unk_00->resource->header->unk_04.z;
transform.m[3][1] = ptcl->position.y + ptcl->emitterPos.y - mgr->renderState.emitter->resource->header->unk_04.y;
transform.m[3][2] = ptcl->position.z + ptcl->emitterPos.z - mgr->renderState.emitter->resource->header->unk_04.z;
G3_Identity();
resBase = mgr->unk_40.unk_00->resource->header;
resBase = mgr->renderState.emitter->resource->header;
G3_Translate(resBase->unk_04.x, resBase->unk_04.y, resBase->unk_04.z);
G3_MultMtx43(mgr->unk_40.unk_04);
G3_MultMtx43(mgr->renderState.viewMatrix);
G3_MultMtx43(&transform);
}
GXRgb colA = ptcl->unk_36;
GXRgb colB = mgr->unk_40.unk_00->unk_E2;
GXRgb colB = mgr->renderState.emitter->unk_E2;
G3_Color(GX_RGB(
GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5,
GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15,
GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25));
SPLEmitter *emtr = mgr->unk_40.unk_00;
SPLEmitter *emtr = mgr->renderState.emitter;
Unk_02100DA0[emtr->resource->childResource->unk_00.unk_03_3](emtr->unk_EC, emtr->unk_EE, 0, 0);
}

View File

@ -17,6 +17,7 @@
#include "heap.h"
#include "narc.h"
#include "spl_behavior.h"
#include "spl_manager.h"
#include "sys_task.h"
#include "sys_task_manager.h"
@ -511,7 +512,7 @@ void sub_02014638(UnkStruct_02014014 *param0)
NNS_G3dGlbFlush();
v0 = NNS_G3dGlbGetCameraMtx();
SPL_0209C5E0(param0->unk_00, v0);
SPLManager_Draw(param0->unk_00, v0);
if (param0->camera != NULL) {
Camera_ClearActive();
@ -570,7 +571,7 @@ SPLEmitter *sub_020146E4(UnkStruct_02014014 *param0, int param1, const VecFx32 *
{
SPLEmitter *v0;
v0 = SPL_0209C56C(param0->unk_00, param1, param2);
v0 = SPLManager_CreateEmitter(param0->unk_00, param1, param2);
param0->unk_08 = v0;
return v0;
@ -581,7 +582,7 @@ SPLEmitter *sub_020146F4(UnkStruct_02014014 *param0, int param1, UnkFuncPtr_0201
SPLEmitter *v0;
Unk_021BF614 = param3;
v0 = SPL_0209C4D8(param0->unk_00, param1, param2);
v0 = SPLManager_CreateEmitterWithCallback(param0->unk_00, param1, param2);
Unk_021BF614 = NULL;
param0->unk_08 = v0;
@ -595,12 +596,12 @@ s32 sub_02014710(UnkStruct_02014014 *param0)
void sub_02014718(UnkStruct_02014014 *param0)
{
SPL_0209C400(param0->unk_00);
SPLManager_DeleteAllEmitters(param0->unk_00);
}
void sub_02014724(UnkStruct_02014014 *param0, SPLEmitter *param1)
{
SPL_0209C444(param0->unk_00, param1);
SPLManager_DeleteEmitter(param0->unk_00, param1);
}
void *sub_02014730(UnkStruct_02014014 *param0)