From 2ada50bdf15d240217354a00f6df194fa417b065 Mon Sep 17 00:00:00 2001 From: Fexty12573 Date: Wed, 31 Jul 2024 13:52:28 +0200 Subject: [PATCH] Document the rest of spl_manager --- lib/spl/include/spl_emitter.h | 6 +- lib/spl/include/spl_manager.h | 22 ++--- lib/spl/include/spl_resource.h | 6 +- lib/spl/src/unk_0209C400.c | 114 ++++++++++----------- lib/spl/src/unk_0209CF00.c | 8 +- lib/spl/src/unk_0209DD54.c | 174 ++++++++++++++++----------------- src/unk_02014000.c | 11 ++- 7 files changed, 172 insertions(+), 169 deletions(-) diff --git a/lib/spl/include/spl_emitter.h b/lib/spl/include/spl_emitter.h index 942a91a0d6..d93625b883 100644 --- a/lib/spl/include/spl_emitter.h +++ b/lib/spl/include/spl_emitter.h @@ -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; diff --git a/lib/spl/include/spl_manager.h b/lib/spl/include/spl_manager.h index 51aee5b9fb..23d3bf6033 100644 --- a/lib/spl/include/spl_manager.h +++ b/lib/spl/include/spl_manager.h @@ -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); diff --git a/lib/spl/include/spl_resource.h b/lib/spl/include/spl_resource.h index a7c38eaaae..9498aaefb7 100644 --- a/lib/spl/include/spl_resource.h +++ b/lib/spl/include/spl_resource.h @@ -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; diff --git a/lib/spl/src/unk_0209C400.c b/lib/spl/src/unk_0209C400.c index 918f937478..6eb9863cd2 100644 --- a/lib/spl/src/unk_0209C400.c +++ b/lib/spl/src/unk_0209C400.c @@ -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; } } diff --git a/lib/spl/src/unk_0209CF00.c b/lib/spl/src/unk_0209CF00.c index dbdfbe2647..ec769d72c1 100644 --- a/lib/spl/src/unk_0209CF00.c +++ b/lib/spl/src/unk_0209CF00.c @@ -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); diff --git a/lib/spl/src/unk_0209DD54.c b/lib/spl/src/unk_0209DD54.c index 299439f257..a5e3233fde 100644 --- a/lib/spl/src/unk_0209DD54.c +++ b/lib/spl/src/unk_0209DD54.c @@ -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); } diff --git a/src/unk_02014000.c b/src/unk_02014000.c index 9bd55ac01f..c744aa8637 100644 --- a/src/unk_02014000.c +++ b/src/unk_02014000.c @@ -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)