diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 347de295..8ff37c4d 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -91,6 +91,10 @@ toBeSorted/blur_and_palette_manager.cpp: toBeSorted/d_effects_1.cpp: .text start:0x800268B0 end:0x8002B99C align:16 .ctors start:0x804DB660 end:0x804DB664 + .data start:0x80500E98 end:0x80501500 + .sdata start:0x805718A8 end:0x80571920 + .sdata2 start:0x80576C18 end:0x80576C68 + .bss start:0x80594FA0 end:0x80597020 toBeSorted/d_effects_2.cpp: .text start:0x8002B9A0 end:0x8002C128 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index d97c4c5d..f17d5b3c 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -693,19 +693,19 @@ fn_8001D950 = .text:0x8001D950; // type:function size:0x22C fn_8001DB80 = .text:0x8001DB80; // type:function size:0x74 fn_8001DC00 = .text:0x8001DC00; // type:function size:0x764 fn_8001E370 = .text:0x8001E370; // type:function size:0xD4 -fn_8001E450 = .text:0x8001E450; // type:function size:0xE0 -fn_8001E530 = .text:0x8001E530; // type:function size:0xA0 -fn_8001E5D0 = .text:0x8001E5D0; // type:function size:0x110 -fn_8001E6E0 = .text:0x8001E6E0; // type:function size:0xC -fn_8001E6F0 = .text:0x8001E6F0; // type:function size:0x2C -fn_8001E720 = .text:0x8001E720; // type:function size:0x14 +init__14dShpProcBase_cFQ34nw4r3g3d6ResMatQ34nw4r3g3d6ResShplbPUl = .text:0x8001E450; // type:function size:0xE0 +setupLight__14dShpProcBase_cFv = .text:0x8001E530; // type:function size:0xA0 +draw__14dShpProcBase_cFP7mVec3_c = .text:0x8001E5D0; // type:function size:0x110 +setResMat__14dShpProcBase_cFQ34nw4r3g3d6ResMat = .text:0x8001E6E0; // type:function size:0xC +setAllFlags__14dShpProcBase_cFv = .text:0x8001E6F0; // type:function size:0x2C +doEntry__14dShpProcBase_cFl = .text:0x8001E720; // type:function size:0x14 fn_8001E740 = .text:0x8001E740; // type:function size:0x54 fn_8001E7A0 = .text:0x8001E7A0; // type:function size:0x2C8 fn_8001EA70 = .text:0x8001EA70; // type:function size:0x4 fn_8001EA80 = .text:0x8001EA80; // type:function size:0x1DC -fn_8001EC60 = .text:0x8001EC60; // type:function size:0x4 -fn_8001EC70 = .text:0x8001EC70; // type:function size:0x118 -fn_8001ED90 = .text:0x8001ED90; // type:function size:0x1F0 +__ct__6mMtx_cFv = .text:0x8001EC60; // type:function size:0x4 +create__11dShpProc1_cFQ34nw4r3g3d6ResMatQ34nw4r3g3d6ResShplP16mHeapAllocator_cbPUl = .text:0x8001EC70; // type:function size:0x118 +draw__11dShpProc1_cFv = .text:0x8001ED90; // type:function size:0x1F0 fn_8001EF80 = .text:0x8001EF80; // type:function size:0x124 fn_8001F0B0 = .text:0x8001F0B0; // type:function size:0x88 fn_8001F140 = .text:0x8001F140; // type:function size:0x1C4 @@ -886,78 +886,78 @@ fn_80026540 = .text:0x80026540; // type:function size:0x40 fn_80026580 = .text:0x80026580; // type:function size:0x188 fn_80026710 = .text:0x80026710; // type:function size:0x4C fn_80026760 = .text:0x80026760; // type:function size:0x4C -fn_800267B0 = .text:0x800267B0; // type:function size:0x4C -fn_80026800 = .text:0x80026800; // type:function size:0x4C +getLightColor1__21BlurAndPaletteManagerFv = .text:0x800267B0; // type:function size:0x4C +getLightColor2__21BlurAndPaletteManagerFv = .text:0x80026800; // type:function size:0x4C __sinit_\blur_and_palette_manager_cpp = .text:0x80026850; // type:function size:0x5C scope:local -fn_800268B0 = .text:0x800268B0; // type:function size:0xB4 -fn_80026970 = .text:0x80026970; // type:function size:0x88 -fn_80026A00 = .text:0x80026A00; // type:function size:0xB4 -fn_80026AC0 = .text:0x80026AC0; // type:function size:0x88 -fn_80026B50 = .text:0x80026B50; // type:function size:0x98 -fn_80026BF0 = .text:0x80026BF0; // type:function size:0x8 -fn_80026C00 = .text:0x80026C00; // type:function size:0x144 -fn_80026D50 = .text:0x80026D50; // type:function size:0x4 -fn_80026D60 = .text:0x80026D60; // type:function size:0x4 -fn_80026D70 = .text:0x80026D70; // type:function size:0x3C -fn_80026DB0 = .text:0x80026DB0; // type:function size:0xA0 -fn_80026E50 = .text:0x80026E50; // type:function size:0x3C -fn_80026E90 = .text:0x80026E90; // type:function size:0x3C -fn_80026ED0__13EffectsStructFv = .text:0x80026ED0; // type:function size:0x3C -fn_80026F10__13EffectsStructFv = .text:0x80026F10; // type:function size:0x3C -fn_80026F50 = .text:0x80026F50; // type:function size:0xD8 -fn_80027030 = .text:0x80027030; // type:function size:0xD8 -fn_80027110 = .text:0x80027110; // type:function size:0xC8 -fn_800271E0__13EffectsStructFP7mVec3_cP7mAng3_cP7mVec3_c = .text:0x800271E0; // type:function size:0x44 -setMtx__13EffectsStructFRC6mMtx_c = .text:0x80027230; // type:function size:0x78 -fn_800272B0 = .text:0x800272B0; // type:function size:0x70 -fn_80027320__13EffectsStructFUc = .text:0x80027320; // type:function size:0x40 -fn_80027360 = .text:0x80027360; // type:function size:0x40 -fn_800273A0 = .text:0x800273A0; // type:function size:0x54 -fn_80027400 = .text:0x80027400; // type:function size:0x4C -fn_80027450 = .text:0x80027450; // type:function size:0x40 -fn_80027490 = .text:0x80027490; // type:function size:0x40 -fn_800274D0 = .text:0x800274D0; // type:function size:0x40 -fn_80027510 = .text:0x80027510; // type:function size:0x4C -fn_80027560 = .text:0x80027560; // type:function size:0x5C +__dt__18dEmitterCallback_cFv = .text:0x800268B0; // type:function size:0xB4 +remove__18dEmitterCallback_cFP14dEmitterBase_c = .text:0x80026970; // type:function size:0x88 +__dt__19dParticleCallback_cFv = .text:0x80026A00; // type:function size:0xB4 +remove__19dParticleCallback_cFP14dEmitterBase_c = .text:0x80026AC0; // type:function size:0x88 +__dt__14dEmitterBase_cFv = .text:0x80026B50; // type:function size:0x98 +GetNextEmitter__14dEmitterBase_cFP14JPABaseEmitter = .text:0x80026BF0; // type:function size:0x8 +createEmitters__14dEmitterBase_cFUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColorll = .text:0x80026C00; // type:function size:0x144 +create__18dEmitterCallback_cFP14JPABaseEmitter = .text:0x80026D50; // type:function size:0x4 +create__19dParticleCallback_cFP14JPABaseEmitter = .text:0x80026D60; // type:function size:0x4 +setImmortal__14dEmitterBase_cFv = .text:0x80026D70; // type:function size:0x3C +deactivateEmitters__14dEmitterBase_cFv = .text:0x80026DB0; // type:function size:0xA0 +stopCalcEmitters__14dEmitterBase_cFv = .text:0x80026E50; // type:function size:0x3C +playCalcEmitters__14dEmitterBase_cFv = .text:0x80026E90; // type:function size:0x3C +stopDrawParticles__14dEmitterBase_cFv = .text:0x80026ED0; // type:function size:0x3C +playDrawParticles__14dEmitterBase_cFv = .text:0x80026F10; // type:function size:0x3C +setEmitterCallback__14dEmitterBase_cFP18dEmitterCallback_c = .text:0x80026F50; // type:function size:0xD8 +setParticleCallback__14dEmitterBase_cFP19dParticleCallback_c = .text:0x80027030; // type:function size:0xD8 +setPosRotScale__14dEmitterBase_cFRC7mVec3_cPC7mAng3_cPC7mVec3_c = .text:0x80027110; // type:function size:0xC8 +setPosRotScaleWithScreenScale__14dEmitterBase_cFRC7mVec3_cPC7mAng3_cPC7mVec3_c = .text:0x800271E0; // type:function size:0x44 +setTransform__14dEmitterBase_cFRC6mMtx_c = .text:0x80027230; // type:function size:0x78 +loadColors__14dEmitterBase_cFPC8_GXColorPC8_GXColorll = .text:0x800272B0; // type:function size:0x70 +setGlobalAlpha__14dEmitterBase_cFUc = .text:0x80027320; // type:function size:0x40 +setRate__14dEmitterBase_cFf = .text:0x80027360; // type:function size:0x40 +setDynamicsScale__14dEmitterBase_cFRC7mVec3_c = .text:0x800273A0; // type:function size:0x54 +setParticleScale__14dEmitterBase_cFRC7mVec3_c = .text:0x80027400; // type:function size:0x4C +setAwayFromCenterSpeed__14dEmitterBase_cFf = .text:0x80027450; // type:function size:0x40 +setVolumeSize__14dEmitterBase_cFUs = .text:0x80027490; // type:function size:0x40 +setLifeTime__14dEmitterBase_cFs = .text:0x800274D0; // type:function size:0x40 +attachEmitterCallbackId__14dEmitterBase_cFl = .text:0x80027510; // type:function size:0x4C +bindShpEmitter__14dEmitterBase_cFlb = .text:0x80027560; // type:function size:0x5C __ct__13EffectsStructFv = .text:0x800275C0; // type:function size:0x44 __ct__13EffectsStructFP7dBase_c = .text:0x80027610; // type:function size:0x44 __dt__13EffectsStructFv = .text:0x80027660; // type:function size:0x78 remove__13EffectsStructFb = .text:0x800276E0; // type:function size:0x84 -fn_80027770 = .text:0x80027770; // type:function size:0xE8 -fn_80027860 = .text:0x80027860; // type:function size:0xC8 +addToActiveEmittersList__13EffectsStructFUsb = .text:0x80027770; // type:function size:0xE8 +areAllEmittersDone__13EffectsStructFv = .text:0x80027860; // type:function size:0xC8 fn_80027930 = .text:0x80027930; // type:function size:0x130 fn_80027A60 = .text:0x80027A60; // type:function size:0x44 fn_80027AB0 = .text:0x80027AB0; // type:function size:0x6C fn_80027B20 = .text:0x80027B20; // type:function size:0x24 -fn_80027B50 = .text:0x80027B50; // type:function size:0x80 -fn_80027BD0 = .text:0x80027BD0; // type:function size:0xD8 -fn_80027CB0 = .text:0x80027CB0; // type:function size:0x100 -fn_80027DB0 = .text:0x80027DB0; // type:function size:0xC -fn_80027DC0 = .text:0x80027DC0; // type:function size:0x250 -fn_80028010 = .text:0x80028010; // type:function size:0x6C -fn_80028080 = .text:0x80028080; // type:function size:0x100 -fn_80028180 = .text:0x80028180; // type:function size:0x10 -fn_80028190 = .text:0x80028190; // type:function size:0x270 +create__18dParticleFogProc_cFlllP16mHeapAllocator_c = .text:0x80027B50; // type:function size:0x80 +doDraw__18dParticleFogProc_cFv = .text:0x80027BD0; // type:function size:0xD8 +draw__11dEffect2D_cFv = .text:0x80027CB0; // type:function size:0x100 +create__11dEffect2D_cFlUc = .text:0x80027DB0; // type:function size:0xC +doDraw__15dShpEmitterProcFv = .text:0x80027DC0; // type:function size:0x250 +create__13dShpEmitter_cFP16mHeapAllocator_c = .text:0x80028010; // type:function size:0x6C +init__13dShpEmitter_cFPCcPCcb = .text:0x80028080; // type:function size:0x100 +clear__13dShpEmitter_cFv = .text:0x80028180; // type:function size:0x10 +draw__13dShpEmitter_cFP14JPABaseEmitterP15JPABaseParticle = .text:0x80028190; // type:function size:0x270 fn_80028400 = .text:0x80028400; // type:function size:0x18 fn_80028420 = .text:0x80028420; // type:function size:0x58 -fn_80028480 = .text:0x80028480; // type:function size:0x170 +executeAfter__22dJEffEmitterCallback_cFP15JPABaseParticle = .text:0x80028480; // type:function size:0x170 fn_800285F0 = .text:0x800285F0; // type:function size:0x19C fn_80028790 = .text:0x80028790; // type:function size:0x88 -fn_80028820 = .text:0x80028820; // type:function size:0x9C -fn_800288C0 = .text:0x800288C0; // type:function size:0x38 +create__14dJEffManager_cFUs = .text:0x80028820; // type:function size:0x9C +remove__14dJEffManager_cFv = .text:0x800288C0; // type:function size:0x38 fn_80028900 = .text:0x80028900; // type:function size:0x180 -fn_80028A80 = .text:0x80028A80; // type:function size:0x434 -fn_80028EC0 = .text:0x80028EC0; // type:function size:0xCC +setupEffects__14dJEffManager_cFv = .text:0x80028A80; // type:function size:0x434 +removeEffManagers__14dJEffManager_cFv = .text:0x80028EC0; // type:function size:0xCC fn_80028F90 = .text:0x80028F90; // type:function size:0xE0 fn_80029070 = .text:0x80029070; // type:function size:0x4 playEffects = .text:0x80029080; // type:function size:0x1A8 fn_80029230 = .text:0x80029230; // type:function size:0xB0 -fn_800292E0 = .text:0x800292E0; // type:function size:0x18 +draw__14dJEffManager_cFPC11JPADrawInfoUl = .text:0x800292E0; // type:function size:0x18 fn_80029300 = .text:0x80029300; // type:function size:0x94 -fn_800293A0 = .text:0x800293A0; // type:function size:0x1EC -EffectManager__ctor = .text:0x80029590; // type:function size:0xC8 -fn_80029660 = .text:0x80029660; // type:function size:0x90 -EffectManager__dtor = .text:0x800296F0; // type:function size:0xBC +createEffManagers__14dJEffManager_cFv = .text:0x800293A0; // type:function size:0x1EC +__ct__14dJEffManager_cFv = .text:0x80029590; // type:function size:0xC8 +__dt__22dJEffEmitterCallback_cFv = .text:0x80029660; // type:function size:0x90 +__dt__14dJEffManager_cFv = .text:0x800296F0; // type:function size:0xBC fn_800297B0 = .text:0x800297B0; // type:function size:0x90 fn_80029840 = .text:0x80029840; // type:function size:0x6C fn_800298B0 = .text:0x800298B0; // type:function size:0x4 @@ -970,8 +970,8 @@ fn_80029A10__13EffectsStructFUsP7mVec3_cP7mAng3_cP7mVec3_cPvPv = .text:0x80029A1 fn_80029A70__13EffectsStructFUsP7mVec3_cP7mAng3_cP7mVec3_cPvPv = .text:0x80029A70; // type:function size:0x64 fn_80029AE0 = .text:0x80029AE0; // type:function size:0x20 fn_80029B00 = .text:0x80029B00; // type:function size:0xD8 -fn_80029BE0 = .text:0x80029BE0; // type:function size:0x43C -fn_8002A020 = .text:0x8002A020; // type:function size:0xA4 +loadColors__14dEmitterBase_cFP14JPABaseEmitterPC8_GXColorPC8_GXColorll = .text:0x80029BE0; // type:function size:0x43C +removeFromActiveEmittersList__13EffectsStructFv = .text:0x8002A020; // type:function size:0xA4 fn_8002A0D0 = .text:0x8002A0D0; // type:function size:0x15C fn_8002A230 = .text:0x8002A230; // type:function size:0x150 fn_8002A380 = .text:0x8002A380; // type:function size:0xCC @@ -985,30 +985,30 @@ fn_8002B320 = .text:0x8002B320; // type:function size:0x4 fn_8002B330 = .text:0x8002B330; // type:function size:0x4 fn_8002B340 = .text:0x8002B340; // type:function size:0x4 fn_8002B350 = .text:0x8002B350; // type:function size:0x4 -fn_8002B360 = .text:0x8002B360; // type:function size:0x58 +__dt__21CommonEmitterCallbackFv = .text:0x8002B360; // type:function size:0x58 fn_8002B3C0 = .text:0x8002B3C0; // type:function size:0x4 -fn_8002B3D0 = .text:0x8002B3D0; // type:function size:0x7C -fn_8002B450 = .text:0x8002B450; // type:function size:0x68 +__dt__13dShpEmitter_cFv = .text:0x8002B3D0; // type:function size:0x7C +__dt__15dShpEmitterProcFv = .text:0x8002B450; // type:function size:0x68 fn_8002B4C0 = .text:0x8002B4C0; // type:function size:0x5C fn_8002B520 = .text:0x8002B520; // type:function size:0x58 -fn_8002B580 = .text:0x8002B580; // type:function size:0x4 -fn_8002B590 = .text:0x8002B590; // type:function size:0x4 -fn_8002B5A0 = .text:0x8002B5A0; // type:function size:0x58 -fn_8002B600 = .text:0x8002B600; // type:function size:0x5C -fn_8002B660 = .text:0x8002B660; // type:function size:0x4 -fn_8002B670 = .text:0x8002B670; // type:function size:0x4 +drawXlu__15dShpEmitterProcFv = .text:0x8002B580; // type:function size:0x4 +drawOpa__15dShpEmitterProcFv = .text:0x8002B590; // type:function size:0x4 +__dt__11dEffect2D_cFv = .text:0x8002B5A0; // type:function size:0x58 +__dt__18dParticleFogProc_cFv = .text:0x8002B600; // type:function size:0x5C +drawXlu__18dParticleFogProc_cFv = .text:0x8002B660; // type:function size:0x4 +drawOpa__18dParticleFogProc_cFv = .text:0x8002B670; // type:function size:0x4 fn_8002B680 = .text:0x8002B680; // type:function size:0x4 fn_8002B690 = .text:0x8002B690; // type:function size:0x4 fn_8002B6A0 = .text:0x8002B6A0; // type:function size:0x4 -initEffectsThingsMaybe = .text:0x8002B6B0; // type:function size:0x158 -fn_8002B810 = .text:0x8002B810; // type:function size:0x18 -fn_8002B830 = .text:0x8002B830; // type:function size:0x1C -fn_8002B850 = .text:0x8002B850; // type:function size:0x78 -fn_8002B8D0 = .text:0x8002B8D0; // type:function size:0x1C -fn_8002B8F0 = .text:0x8002B8F0; // type:function size:0x44 -fn_8002B940 = .text:0x8002B940; // type:function size:0x1C -fn_8002B960 = .text:0x8002B960; // type:function size:0x18 -fn_8002B980 = .text:0x8002B980; // type:function size:0x1C +__sinit_\d_effects_1_cpp = .text:0x8002B6B0; // type:function size:0x158 +__ct__21CommonEmitterCallbackFv = .text:0x8002B810; // type:function size:0x18 +__arraydtor$9497 = .text:0x8002B830; // type:function size:0x1C +__ct__13dShpEmitter_cFv = .text:0x8002B850; // type:function size:0x78 +__arraydtor$9499 = .text:0x8002B8D0; // type:function size:0x1C +__ct__18dParticleFogProc_cFv = .text:0x8002B8F0; // type:function size:0x44 +__arraydtor$9502 = .text:0x8002B940; // type:function size:0x1C +__ct__11dEffect2D_cFv = .text:0x8002B960; // type:function size:0x18 +__arraydtor$9504 = .text:0x8002B980; // type:function size:0x1C fn_8002B9A0 = .text:0x8002B9A0; // type:function size:0x30 fn_8002B9D0 = .text:0x8002B9D0; // type:function size:0x10C fn_8002BAE0 = .text:0x8002BAE0; // type:function size:0x228 @@ -17850,7 +17850,7 @@ ZXYrotM__6mMtx_cFRC4mAngRC4mAngRC4mAng = .text:0x802F1A40; // type:function size mMtx__XYZrotS = .text:0x802F1AA0; // type:function size:0x60 mMtx__ZYXrotM = .text:0x802F1B00; // type:function size:0x60 toRot__6mMtx_cCFR7mAng3_c = .text:0x802F1B60; // type:function size:0xDC -fn_802F1C40 = .text:0x802F1C40; // type:function size:0x220 +fn_802F1C40__6mMtx_cFll = .text:0x802F1C40; // type:function size:0x220 mMtx_c__makeRotationFromVecs = .text:0x802F1E60; // type:function size:0x58 __sinit_\m_mtx_cpp = .text:0x802F1EC0; // type:function size:0x58 scope:local create__4mPadFv = .text:0x802F1F20; // type:function size:0x30 @@ -28364,7 +28364,7 @@ GET_POTION_BOTTLE_DEFS = .rodata:0x804E9610; // type:object size:0x40 ITEM_MODEL_INDEX = .rodata:0x804E9650; // type:object size:0xA8 ITEM_MODEL_DEFS = .rodata:0x804E96F8; // type:object size:0x350 RUPEE_ITEM_TO_TEX_FRAME = .rodata:0x804E9A48; // type:object size:0x38 data:2byte -lbl_804E9A80 = .rodata:0x804E9A80; // type:object size:0x18 data:2byte +sEffectResourceIds = .rodata:0x804E9A80; // type:object size:0x18 data:2byte lbl_804E9A98 = .rodata:0x804E9A98; // type:object size:0x10 lbl_804E9AA8 = .rodata:0x804E9AA8; // type:object size:0x10 blanMap = .rodata:0x804E9AB8; // type:object size:0x18 scope:local data:4byte @@ -29904,17 +29904,17 @@ __vt__21BlurAndPaletteManager = .data:0x80500E80; // type:object size:0xC lbl_80500E8C = .data:0x80500E8C; // type:object size:0xC lbl_80500E98 = .data:0x80500E98; // type:object size:0x10 data:string lbl_80500EA8 = .data:0x80500EA8; // type:object size:0x444 -lbl_805012EC = .data:0x805012EC; // type:object size:0xC -lbl_805012F8 = .data:0x805012F8; // type:object size:0x24 -lbl_8050131C = .data:0x8050131C; // type:object size:0x1C -lbl_80501338 = .data:0x80501338; // type:object size:0x14 -lbl_8050134C = .data:0x8050134C; // type:object size:0x2C -lbl_80501378 = .data:0x80501378; // type:object size:0x10 -lbl_80501388 = .data:0x80501388; // type:object size:0x30 -lbl_805013B8 = .data:0x805013B8; // type:object size:0x18 -lbl_805013D0 = .data:0x805013D0; // type:object size:0x24 -lbl_805013F4 = .data:0x805013F4; // type:object size:0xC -lbl_80501400 = .data:0x80501400; // type:object size:0xC0 +__vt__14dJEffManager_c = .data:0x805012EC; // type:object size:0xC +__vt__22dJEffEmitterCallback_c = .data:0x805012F8; // type:object size:0x24 +__vt__21CommonEmitterCallback = .data:0x8050131C; // type:object size:0x1C +__vt__13dShpEmitter_c = .data:0x80501338; // type:object size:0x14 +__vt__15dShpEmitterProc = .data:0x8050134C; // type:object size:0x2C +__vt__11dEffect2D_c = .data:0x80501378; // type:object size:0x10 +__vt__18dParticleFogProc_c = .data:0x80501388; // type:object size:0x30 +__vt__19dParticleCallback_c = .data:0x805013B8; // type:object size:0x18 +__vt__18dEmitterCallback_c = .data:0x805013D0; // type:object size:0x24 +__vt__13EffectsStruct = .data:0x805013F4; // type:object size:0xC +__vt__14dEmitterBase_c = .data:0x80501400; // type:object size:0xC lbl_805014C0 = .data:0x805014C0; // type:object size:0x28 lbl_805014E8 = .data:0x805014E8; // type:object size:0x18 lbl_80501500 = .data:0x80501500; // type:object size:0x28 @@ -39892,9 +39892,9 @@ lbl_80575058 = .sbss:0x80575058; // type:object size:0x8 data:byte lbl_80575060 = .sbss:0x80575060; // type:object size:0x1 data:byte lbl_80575064 = .sbss:0x80575064; // type:object size:0x4 data:4byte sPInstance__21BlurAndPaletteManager = .sbss:0x80575068; // type:object size:0x8 data:4byte -lbl_80575070 = .sbss:0x80575070; // type:object size:0x4 data:4byte +sManagers__14dJEffManager_c = .sbss:0x80575070; // type:object size:0x4 data:4byte CURRENT_EFFECT_MANAGER_INIT = .sbss:0x80575074; // type:object size:0x4 data:4byte -lbl_80575078 = .sbss:0x80575078; // type:object size:0x4 data:4byte +ms_allocator__14dJEffManager_c = .sbss:0x80575078; // type:object size:0x4 data:4byte lbl_8057507C = .sbss:0x8057507C; // type:object size:0x1 data:byte lbl_8057507D = .sbss:0x8057507D; // type:object size:0x1 data:byte s_Create_Position__9dAcBase_c = .sbss:0x80575080; // type:object size:0x4 data:4byte @@ -44209,7 +44209,7 @@ PARTICLE_RESOURCE_ID_MAPPING_991_ = .sdata2:0x8057AB6E; // type:object size:0x2 PARTICLE_RESOURCE_ID_MAPPING_992_ = .sdata2:0x8057AB70; // type:object size:0x2 data:2byte lbl_8057AB72 = .sdata2:0x8057AB72; // type:object size:0x2 data:2byte lbl_8057AB74 = .sdata2:0x8057AB74; // type:object size:0x2 data:2byte -EffectManager__NumberOfManagers = .sdata2:0x8057AB78; // type:object size:0x8 data:4byte +sNumberOfMgrs = .sdata2:0x8057AB78; // type:object size:0x8 data:4byte lbl_8057AB80 = .sdata2:0x8057AB80; // type:object size:0x8 data:byte lbl_8057AB88 = .sdata2:0x8057AB88; // type:object size:0x4 data:float lbl_8057AB8C = .sdata2:0x8057AB8C; // type:object size:0x4 data:float diff --git a/include/JSystem/JParticle/JPADrawInfo.h b/include/JSystem/JParticle/JPADrawInfo.h index a358b072..ed269d7f 100644 --- a/include/JSystem/JParticle/JPADrawInfo.h +++ b/include/JSystem/JParticle/JPADrawInfo.h @@ -10,6 +10,7 @@ */ class JPADrawInfo { public: + JPADrawInfo() {} JPADrawInfo(Mtx param_0, f32 fovY, f32 aspect) { MTXCopy(param_0, mCamMtx); C_MTXLightPerspective(mPrjMtx, fovY, aspect, 0.5f, -0.5f, 0.5f, 0.5f); diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 6e49752f..678e327b 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -120,6 +120,7 @@ public: void clearStatus(u32 status) { mStatus &= ~status; } u32 checkStatus(u32 status) const { return (mStatus & status); } bool checkFlag(u32 flag) const { return !!(mpRes->getDyn()->getFlag() & flag); } + u32 getDynResUserWork() const { return mpRes->getDyn()->getResUserWork(); } u8 getResourceManagerID() const { return mResMgrID; } u8 getGroupID() const { return mGroupID; } u8 getDrawTimes() const { return mDrawTimes; } @@ -131,9 +132,8 @@ public: void setGlobalSRTMatrix(const Mtx m) { JPASetRMtxSTVecfromMtx(m, mGlobalRot, &mGlobalScl, &mGlobalTrs); - // set is actually used here in debug - mGlobalPScl.x = mGlobalScl.x; - mGlobalPScl.y = mGlobalScl.y; + // "set is used in TP debug" + mGlobalPScl.set(mGlobalScl.x, mGlobalScl.y); } void setGlobalTranslation(f32 x, f32 y, f32 z) { mGlobalTrs.set(x, y, z); } void setGlobalTranslation(const EGG::Vector3f& trs) { mGlobalTrs.set(trs); } @@ -185,6 +185,14 @@ public: mLocalScl.set(scale); } + f32 getGlobalParticleScaleX() const { + return mGlobalPScl.x; + } + + f32 getGlobalParticleScaleY() const { + return mGlobalPScl.y; + } + f32 get_r_f() { return mRndm.get_rndm_f(); } f32 get_r_zp() { return mRndm.get_rndm_zp(); } f32 get_r_zh() { return mRndm.get_rndm_zh(); } diff --git a/include/d/lyt/meter/d_lyt_meter_item_select.h b/include/d/lyt/meter/d_lyt_meter_item_select.h index b076302a..ae097d41 100644 --- a/include/d/lyt/meter/d_lyt_meter_item_select.h +++ b/include/d/lyt/meter/d_lyt_meter_item_select.h @@ -291,7 +291,7 @@ private: /* 0x5778 */ f32 mArrowRotation; /* 0x577C */ f32 mArrowLength; /* 0x5780 */ f32 field_0x5780; - /* 0x5784 */ f32 field_0x5784; + /* 0x5784 */ f32 mEffectScale; /* 0x5788 */ s32 field_0x5788; /* 0x578C */ s32 field_0x578C; /* 0x5790 */ s32 field_0x5790; @@ -302,7 +302,7 @@ private: /* 0x5798 */ u8 field_0x5798; /* 0x5799 */ u8 field_0x5799; /* 0x579A */ u8 field_0x579A; - /* 0x579B */ u8 field_0x579B; + /* 0x579B */ u8 mEffectAlpha; /* 0x579C */ u8 mStoredBowVariant; /* 0x579C */ u8 mStoredSlingshotVariant; /* 0x579C */ u8 mStoredBeetleVariant; diff --git a/include/egg/math/eggMatrix.h b/include/egg/math/eggMatrix.h index a99a0698..90b1ab8a 100644 --- a/include/egg/math/eggMatrix.h +++ b/include/egg/math/eggMatrix.h @@ -62,7 +62,7 @@ public: void transposeTo(Matrix34f &to) const; void copyFrom(const Matrix34f &other) { for (int i = 0; i < 12; i++) { - (*this)(i) = other(i); + arr[i] = other.arr[i]; } } void setBase(int idx, const Vector3f &b) { diff --git a/include/m/m3d/m_proc.h b/include/m/m3d/m_proc.h index 0e2e4730..88a0852a 100644 --- a/include/m/m3d/m_proc.h +++ b/include/m/m3d/m_proc.h @@ -8,12 +8,12 @@ namespace m3d { class proc_c : public scnLeaf_c { public: - virtual ~proc_c(); - virtual int getType() const override; + /* vt 0x08 */ virtual ~proc_c(); + /* vt 0x0C */ virtual int getType() const override; bool create(mAllocator_c *, u32 *); - virtual void drawOpa(); - virtual void drawXlu(); + /* vt 0x18 */ virtual void drawOpa(); + /* vt 0x1C */ virtual void drawXlu(); }; } // namespace m3d diff --git a/include/m/m3d/m_scnleaf.h b/include/m/m3d/m_scnleaf.h index 5e7b7d49..b0ad5dd5 100644 --- a/include/m/m3d/m_scnleaf.h +++ b/include/m/m3d/m_scnleaf.h @@ -18,13 +18,14 @@ public: UnkClass() {} }; +// Note: Due to multiple inheritance, vtable offsets are shifted by 8 class scnLeaf_c : UnkClass, EGG::Disposer { public: scnLeaf_c(); - virtual ~scnLeaf_c(); - virtual int getType() const = 0; - virtual void remove(); - virtual int entry(); + /* vt 0x08 */ virtual ~scnLeaf_c(); + /* vt 0x0C */ virtual int getType() const = 0; + /* vt 0x10 */ virtual void remove(); + /* vt 0x14 */ virtual int entry(); void setOption(u32 flag, u32 set); void setScale(f32, f32, f32); diff --git a/include/m/m_mtx.h b/include/m/m_mtx.h index 702d2459..4a9eac54 100644 --- a/include/m/m_mtx.h +++ b/include/m/m_mtx.h @@ -87,6 +87,8 @@ public: PSMTXMultVec(m, quat.v, quat.v); } + void fn_802F1C40(s32, s32); + public: static mMtx_c Identity; }; diff --git a/include/nw4r/math/math_types.h b/include/nw4r/math/math_types.h index 5ed34ad3..282ea18a 100644 --- a/include/nw4r/math/math_types.h +++ b/include/nw4r/math/math_types.h @@ -176,6 +176,15 @@ struct _MTX33 { struct MTX33 : _MTX33 { MTX33() {} + // clang-format off + MTX33(f32 f00, f32 f01, f32 f02, + f32 f10, f32 f11, f32 f12, + f32 f20, f32 f21, f32 f22) { + _00 = f00; _01 = f01; _02 = f02; + _10 = f10; _11 = f11; _12 = f12; + _20 = f20; _21 = f21; _22 = f22; + } + // clang-format on }; /****************************************************************************** diff --git a/include/toBeSorted/blur_and_palette_manager.h b/include/toBeSorted/blur_and_palette_manager.h index b86394dd..24bab9bc 100644 --- a/include/toBeSorted/blur_and_palette_manager.h +++ b/include/toBeSorted/blur_and_palette_manager.h @@ -152,6 +152,9 @@ struct Bpm1 { struct Bpm2 { Bpm2() {} ~Bpm2() {} + + // maybe + u8 _0x00[0x14 - 0x00]; }; struct PaletteEAF_smol_entry { @@ -184,6 +187,7 @@ struct PaletteEAF_big { PaletteEAF_big_entry field_0x00[8]; }; +// Apparently particle color related struct Bpm3 { Bpm3() {} ~Bpm3() {} @@ -201,16 +205,22 @@ struct Bpm4 { struct Bpm7 { Bpm7() {} ~Bpm7() {} + + u8 _0x00[0x14 - 0x00]; }; struct Bpm8 { Bpm8() {} ~Bpm8() {} + + u8 _0x00[0x14 - 0x00]; }; struct Bpm9 { Bpm9() {} ~Bpm9() {} + + u8 _0x00[0x14 - 0x00]; }; class BlurAndPaletteManager { @@ -224,6 +234,10 @@ public: return sInstance; } + static BlurAndPaletteManager *GetPInstance() { + return sPInstance; + } + void fn_800247D0(mVec3_c, f32); void fn_80022AF0(f32); void setField_0x2F20(f32 arg) { @@ -242,6 +256,29 @@ public: return field_0x5CE4; } + const Spf &GetCurrentSph() const { + return currentSpf; + } + + const PaletteEAF_smol_entry& getSmallEAF(s32 idx1, s32 idx2) { + return field_0x38E4.field_0x00[idx1].field_0x00[idx2]; + } + + f32 getfield_0x2F14() const { + return field_0x2F14; + } + + f32 getfield_0x2F18() const { + return field_0x2F18; + } + + f32 getfield_0x2F1C() const { + return field_0x2F1C; + } + + static mColor &getLightColor1(); + static mColor &getLightColor2(); + private: mColor combineColors(const mColor &c1, const mColor &c2, f32 ratio); @@ -267,15 +304,22 @@ private: /* 0x2F0C */ s16 field_0x2F0C; /* 0x2F0E */ s16 field_0x2F0E; /* 0x2F10 */ u8 field_0x2F10; - /* 0x2F11 */ u8 field_0x2F11[0x2F20 - 0x2F11]; + /* 0x2F14 */ f32 field_0x2F14; + /* 0x2F18 */ f32 field_0x2F18; + /* 0x2F1C */ f32 field_0x2F1C; /* 0x2F20 */ f32 field_0x2F20; + /* 0x2F24 */ u8 _0x2F24[0x357C - 0x2F24]; /* 0x357C */ Bpm1 field_0x357C; + /* 0x3594 */ u8 _0x3594[0x35A0 - 0x3594]; /* 0x35A0 */ Bpm2 field_0x35A0; /* 0x35B4 */ Bpm7 field_0x35B4[8]; /* 0x3654 */ Bpm8 field_0x3654[10]; /* 0x371C */ Bpm9 field_0x371C[20]; + /* 0x38AC */ u8 _0x38AC[0x38B4 - 0x38AC]; /* 0x38B4 */ mVec3_c field_0x38B4; + /* 0x38C0 */ u8 _0x38C0[0x38C8 - 0x38C0]; /* 0x38C8 */ mVec3_c field_0x38C8; + /* 0x38D4 */ u8 _0x38D4[0x38E4 - 0x38D4]; /* 0x38E4 */ Bpm3 field_0x38E4; /* 0x48E4 */ Bpm4 field_0x48E4; /* 0x5CE4 */ PaletteDefaultMCF field_0x5CE4; diff --git a/include/toBeSorted/d_particle.h b/include/toBeSorted/d_particle.h index ef81921b..745b444b 100644 --- a/include/toBeSorted/d_particle.h +++ b/include/toBeSorted/d_particle.h @@ -73,8 +73,8 @@ public: void createResource(EGG::Heap *heap, s32 mgrIndex, void *jpc, void *jpn); void disposeResource(s32 mgrIndex); - s32 getResUserWork(u16 handle) const; - u16 getJpnData(u16 handle) const; + s32 getResUserWork(u16 particleResId) const; + u16 getJpnData(u16 particleResId) const; // Invokes the JParticle 11 extension void doCustomSkywardSwordThing(u8 groupId, f32 x, f32 y); void calc(u8 groupId); diff --git a/include/toBeSorted/d_unk_mdl_stuff_2.h b/include/toBeSorted/d_unk_mdl_stuff_2.h new file mode 100644 index 00000000..b0359af8 --- /dev/null +++ b/include/toBeSorted/d_unk_mdl_stuff_2.h @@ -0,0 +1,64 @@ +#ifndef D_UNK_MDL_STUFF_2_H +#define D_UNK_MDL_STUFF_2_H + +#include "m/m3d/m_proc.h" +#include "m/m_allocator.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resmat.h" +#include "nw4r/g3d/res/g3d_resshp.h" + +/** a process for drawing shapes directly */ +class dShpProcBase_c : public m3d::proc_c { +public: + virtual ~dShpProcBase_c() {} + + void setResMat(nw4r::g3d::ResMat mat); + void setResShp(nw4r::g3d::ResShp shp) { + mShp = shp; + } + + void setupLight(); + void draw(mVec3_c *pos); + void setAllFlags(); + void doEntry(s32 lightSetId); + + bool init(nw4r::g3d::ResMat mat, nw4r::g3d::ResShp shp, s32 count, bool xlu, u32 *pSize); + + bool isDrawDisabled(s32 idx) const { + return mpFlags[idx]; + } + + void setDrawDisabled(s32 idx, bool val) { + mpFlags[idx] = val; + } + +protected: + /* 0x18 */ nw4r::g3d::ResMat mMat; + /* 0x1C */ nw4r::g3d::ResShp mShp; + /* 0x20 */ bool *mpFlags; + /* 0x24 */ s32 mCount; + /* 0x28 */ s32 mLightSetId; + /* 0x2C */ u8 field_0x2C; +}; + +class dShpProc1_c : public dShpProcBase_c { +public: + virtual ~dShpProc1_c() {} + + void clearTransforms() { + mpTransforms = nullptr; + } + + bool create(nw4r::g3d::ResMat mat, nw4r::g3d::ResShp shp, s32 count, mHeapAllocator_c *alloc, bool xlu, u32 *pSize); + void draw(); + + void setTransform(s32 idx, const mMtx_c &transform) { + mpTransforms[idx].copyFrom(transform); + } + +protected: + /* 0x30 */ mMtx_c *mpTransforms; +}; + +#endif diff --git a/include/toBeSorted/effects_struct.h b/include/toBeSorted/effects_struct.h index 71afbb31..a7c11995 100644 --- a/include/toBeSorted/effects_struct.h +++ b/include/toBeSorted/effects_struct.h @@ -1,17 +1,79 @@ #ifndef EFFECTS_STRUCT_H #define EFFECTS_STRUCT_H +#include "JSystem/JParticle/JPADrawInfo.h" +#include "JSystem/JParticle/JPAEmitter.h" +#include "JSystem/JParticle/JPAParticle.h" #include "common.h" #include "d/d_base.h" +#include "m/m2d.h" +#include "m/m3d/m_proc.h" +#include "m/m_allocator.h" #include "m/m_angle.h" #include "m/m_mtx.h" #include "m/m_vec.h" +#include "toBeSorted/d_d3d.h" +#include "toBeSorted/d_unk_mdl_stuff_2.h" +#include "toBeSorted/tlist.h" -class EffectsStruct { -private: - s32 field_0x00; - u8 field_0x04[0x1C - 0x04]; +#include +class dEmitterBase_c; +class dEmitterCallback_c; +class dParticleCallback_c; + +class dEmitterBase_c { + friend class dEmitterCallback_c; + friend class dParticleCallback_c; + +public: + dEmitterBase_c() : mpEmitterHead(nullptr), mpEmitterCallback(nullptr), mpParticleCallback(nullptr) {} + +protected: + void deactivateEmitters(); + void stopCalcEmitters(); + void playCalcEmitters(); + bool createEmitters( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2 + ); + static u16 fn_80028900(u16); + static void loadColors(JPABaseEmitter *emitter, const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2); + + void setEmitterCallback(dEmitterCallback_c *cb); + void setParticleCallback(dParticleCallback_c *cb); + + void setImmortal(); + + static JPABaseEmitter *GetNextEmitter(JPABaseEmitter *head); + + /* 0x00 */ JPABaseEmitter *mpEmitterHead; + /* 0x04 */ dEmitterCallback_c *mpEmitterCallback; + /* 0x08 */ dParticleCallback_c *mpParticleCallback; + /* 0x0C */ TListNode mEmitterCallbackNode; + /* 0x14 */ TListNode mParticleCallbackNode; + +public: + virtual ~dEmitterBase_c(); + + void stopDrawParticles(); + void playDrawParticles(); + void setPosRotScale(const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale); + void setPosRotScaleWithScreenScale(const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale); + void setTransform(const mMtx_c &mtx); + void loadColors(const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2); + void setGlobalAlpha(u8 alpha); + void setRate(f32 rate); + void setDynamicsScale(const mVec3_c &scale); + void setParticleScale(const mVec3_c &scale); + void setAwayFromCenterSpeed(f32 speed); + void setVolumeSize(u16 size); + void setLifeTime(s16 lifetime); + void attachEmitterCallbackId(s32 id); // corresponds to setup at 80028a80 + void bindShpEmitter(s32 id, bool unused); // corresponds to setup at 8002b6b0 +}; + +// Suggested name: dEmitter_c +class EffectsStruct : public dEmitterBase_c { public: // vt at 0x1C EffectsStruct(); @@ -22,29 +84,34 @@ public: mpOwner = owner; } - void remove(bool); - void fn_80027320(u8); - void fn_800271E0(mVec3_c *pos, mAng3_c *rot, mVec3_c *scale); + void addToActiveEmittersList(u16 resourceId, bool bFlags); + void removeFromActiveEmittersList(); + + void remove(bool bForceDeleteEmitters); void fn_80029920(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *); void fn_80029980(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *); void fn_800299F0(u16 effect, mMtx_c *mtx, void *, void *); void fn_80029A10(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *); void fn_80029A70(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *); - void setMtx(const mMtx_c &); - static void fn_800298C0(u16 effect, mVec3_c *pos, void*, void*, void*, void*); + static void fn_800298C0(u16 effect, mVec3_c *pos, void *, void *, void *, void *); - void fn_80026ED0(); - void fn_80026F10(); - - bool checkField0x00() const { - return field_0x00 != 0; + bool hasEmitters() const { + return mpEmitterHead != 0; } -private: - u8 field_0x20[0x28 - 0x20]; +protected: + bool areAllEmittersDone(); + +public: + /* 0x24 */ TListNode mNode; + +protected: /* 0x28 */ dBase_c *mpOwner; - u8 field_0x2C[0x34 - 0x2C]; + /* 0x2C */ u8 field_0x2C; + /* 0x2D */ u8 _0x2D[0x30 - 0x2D]; + /* 0x30 */ u16 mFlags; + /* 0x32 */ u16 mEffect; }; // Not sure if these belongs here, but it uses EffectsStruct @@ -73,4 +140,210 @@ public: virtual ~EffectsStruct_Ext() {} }; +/** An emitter callback can be part of multiple emitters. */ +class dEmitterCallback_c : public JPAEmitterCallBack { + friend class dEmitterBase_c; + + typedef TList EmitterCallbackList; + +public: + virtual ~dEmitterCallback_c(); + virtual void create(JPABaseEmitter *) {} + virtual void vt_0x20(JPABaseEmitter *) {} + + void remove(dEmitterBase_c *emitter); + + /* 0x04 */ EmitterCallbackList mEmitterList; +}; + +/** A particle callback can be part of multiple emitters. */ +class dParticleCallback_c : public JPAParticleCallBack { + friend class dEmitterBase_c; + + typedef TList ParticleCallbackList; + +public: + virtual ~dParticleCallback_c(); + virtual void create(JPABaseEmitter *) {} + + void remove(dEmitterBase_c *emitter); + + /* 0x04 */ ParticleCallbackList mEmitterList; +}; + +class dParticleFogProc_c : public d3d::EggTextureProc { +public: + virtual ~dParticleFogProc_c() {} + virtual void drawOpa() override { + doDraw(); + } + virtual void drawXlu() override { + doDraw(); + } + + void create(s32 idx, s32 unk, s32 unk2, mHeapAllocator_c *alloc); + +private: + void doDraw(); + /* 0x18 */ u8 _0x18[0x1C - 0x18]; + /* 0x1C */ bool field_0x1C; +}; + +class dEffect2D_c : m2d::Base_c { +public: + dEffect2D_c() : m2d::Base_c(0x80) {} + /* vt 0x08 */ virtual ~dEffect2D_c() {} + /* vt 0x0C */ virtual void draw() override; + + void create(u32 groupId, u8); + +private: + /* 0x10 */ u32 mGroupId; +}; + +class dJEffEmitterCallback_c : public dEmitterCallback_c { +public: + virtual ~dJEffEmitterCallback_c() {} + virtual void executeAfter(JPABaseParticle *); + + /* 0x010 */ mVec3_c field_0x010[0x32]; + /* 0x268 */ mVec3_c field_0x268[0x32]; + /* 0x4C0 */ u8 _0x4C0[0x650 - 0x4C0]; + // TODO unclear structure boundary +}; + +class CommonEmitterCallback : public JPAEmitterCallBack { +public: + CommonEmitterCallback() : field_0x04(0) {} + virtual ~CommonEmitterCallback() {} + virtual void executeAfter(JPABaseEmitter *) override; + void init(s32 v) { + field_0x04 = v; + } + +private: + /* 0x04 */ s32 field_0x04; +}; + +class dShpEmitter_c; + +class dShpEmitterProc : public dShpProc1_c { +public: + virtual ~dShpEmitterProc() { + mpTransforms = nullptr; + } + virtual void drawOpa() override { + doDraw(); + } + virtual void drawXlu() override { + doDraw(); + } + + void setOwner(dShpEmitter_c *cb) { + mpOwner = cb; + } + + void setAlpha(s32 idx, u8 val) { + mAlpha[idx] = val; + } + +private: + void doDraw(); + /* 0x34 */ dShpEmitter_c *mpOwner; + // TODO: This is read from JParticle as alpha, but used as the nw4r::g3d lightSetId. + // Is this a creative use of the particle color value, given that particles themselves + // are never drawn? + /* 0x3C */ u8 mAlpha[100]; +}; + +class dShpEmitter_c : public JPAParticleCallBack { +public: + virtual ~dShpEmitter_c() {} + virtual void draw(JPABaseEmitter *, JPABaseParticle *) override; + + bool create(mHeapAllocator_c *alloc); + void init(const char *mdlName, const char *arcName, bool priority); + void clear(); + void remove(); + +private: + /* 0x04 */ dShpEmitterProc mProc; + /* 0xA0 */ s32 field_0xA0; +}; + +class dJEffManager_c : public dEmitterBase_c { +public: + dJEffManager_c() : field_0x670(-1), field_0x67C(-1) {} + virtual ~dJEffManager_c() { + remove(); + } + + static bool createEffManagers(); + static void removeEffManagers(); + static void draw(const JPADrawInfo *info, u32 groupId); + static void setupEffects(); + + enum Fx_e { + TsuboA, + TsuboB, + BRockA, + FruitA, + GrassCoil, + BRockB, + Beehive, + VeraRock, + Pumpkin, + BRockC, + F300BrokenRockWall_00, + F300BrokenRockWall_01, + F300BrokenRockWall_01T, + LotusSeed, + Beamoss, + Cakram, + Dodai, + LegParts, + AsuraFloorBrk, + BreakPillar, + Barrel, + BarrelBomb, + RockMiddle, + BocoBone, + BRockStopA, + BWallD201, + Gunho, + TuboBig, + Amos, + HidokariBoneA, + HidokariBoneB, + Hydra, + Captain, + KibakoHang, + IslTreIRock, + BirdraceTarget, + FlowerA00F, + FlowerA00L, + FlowerB00, + FlowerB01, + GirahimClaymore, + BirdKobunAEgg, + BirdKobunBEgg, + BirdRivalEgg, + BWallAF200, + BWallBF200, + BWallF210, + }; + +private: + void create(u16 resourceId); + void remove(); + + static mHeapAllocator_c *ms_allocator; + static dJEffManager_c *sManagers; + + /* 0x01C */ dJEffEmitterCallback_c mCallback; + /* 0x670 */ s32 field_0x670; + /* 0x674 */ u8 _0x674[0x67C - 0x674]; + /* 0x674 */ s32 field_0x67C; +}; + #endif diff --git a/include/toBeSorted/lyt_related_floats.h b/include/toBeSorted/lyt_related_floats.h index be17f713..092b8ea7 100644 --- a/include/toBeSorted/lyt_related_floats.h +++ b/include/toBeSorted/lyt_related_floats.h @@ -18,6 +18,11 @@ inline s32 get_8057511C() { return lbl_8057511C; } +extern "C" f32 lbl_80575150; +inline f32 get_80575150() { + return lbl_80575150; +} + extern "C" f32 lbl_8057515C; inline f32 get_8057515C() { return lbl_8057515C; @@ -38,4 +43,9 @@ inline f32 get_80575190() { return lbl_80575190; } +extern "C" s32 lbl_80575184; +inline s32 get_80575184() { + return lbl_80575184; +} + #endif diff --git a/include/toBeSorted/tlist.h b/include/toBeSorted/tlist.h index 736d7320..65aa1ef2 100644 --- a/include/toBeSorted/tlist.h +++ b/include/toBeSorted/tlist.h @@ -9,6 +9,12 @@ // * Entirely in headers // * Swapped node and count members // Used in DowsingTarget, maybe also in dAcBase_c.soundStuff +// +// The current implementation has various unexplained behaviors +// * Constructor doesn't match if offset != 0 https://decomp.me/scratch/YqOCh +// * Many loops based on these iterators don't match in general, but probably not worth +// messing with until the ctor is fixed +// * -ipa file optimizes things that shouldn't be optimized https://decomp.me/scratch/lqM6i template class TListNode { public: diff --git a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp index ae522bae..e49d456d 100644 --- a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp +++ b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp @@ -202,8 +202,8 @@ int dAcODungeonShip_c::actorExecute() { if (field_0x8D9) { mMtx_c tmpMtx; mMdl.getNodeWorldMtx(0, tmpMtx); - if (mEffects[1].checkField0x00()) { - mEffects[1].setMtx(tmpMtx); + if (mEffects[1].hasEmitters()) { + mEffects[1].setTransform(tmpMtx); } else if (field_0x8DA == 0) { mEffects[1].fn_800299F0(PARTICLE_RESOURCE_ID_MAPPING_683_, &tmpMtx, nullptr, nullptr); field_0x8DA = 1; diff --git a/src/REL/d/a/obj/d_a_obj_seat_sword.cpp b/src/REL/d/a/obj/d_a_obj_seat_sword.cpp index 726a008a..36b16ea1 100644 --- a/src/REL/d/a/obj/d_a_obj_seat_sword.cpp +++ b/src/REL/d/a/obj/d_a_obj_seat_sword.cpp @@ -232,7 +232,7 @@ void dAcOSeatSword_c::actorExecuteCommon() { mEffPos.y = position.y; mEff.fn_80029A10(PARTICLE_RESOURCE_ID_MAPPING_76_, &mEffPos, &rotation, &mScale, nullptr, nullptr); - mEff.fn_80027320(mField_0x7E4); + mEff.setGlobalAlpha(mField_0x7E4); } void dAcOSeatSword_c::updateSwordMdl() { diff --git a/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp b/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp index 910dd1e4..f4c0fdf2 100644 --- a/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp +++ b/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp @@ -248,11 +248,11 @@ int dAcOTowerHandD101_c::actorExecute() { PSMTXConcat(tmpMtx3, tmpMtx4, tmpMtx3); mLoc2Mtx.copyFrom(tmpMtx3); - if (mEffects.checkField0x00()) { + if (mEffects.hasEmitters()) { if (direction == 1) { tmpMtx3.YrotM(-0x8000); } - mEffects.setMtx(tmpMtx3); + mEffects.setTransform(tmpMtx3); } for (int i = 0; i <= 2; i++) { dBgW *bgW = nullptr; @@ -300,11 +300,11 @@ int dAcOTowerHandD101_c::actorExecuteInEvent() { PSMTXConcat(tmpMtx3, tmpMtx4, tmpMtx3); mLoc2Mtx.copyFrom(tmpMtx3); - if (mEffects.checkField0x00()) { + if (mEffects.hasEmitters()) { if (direction == 1) { tmpMtx3.YrotM(-0x8000); } - mEffects.setMtx(tmpMtx3); + mEffects.setTransform(tmpMtx3); } for (int i = 0; i <= 2; i++) { dBgW *bgW = nullptr; diff --git a/src/REL/d/a/obj/d_a_obj_tubo.cpp b/src/REL/d/a/obj/d_a_obj_tubo.cpp index 14a0f3ff..e1a2b065 100644 --- a/src/REL/d/a/obj/d_a_obj_tubo.cpp +++ b/src/REL/d/a/obj/d_a_obj_tubo.cpp @@ -30,7 +30,10 @@ #include "rvl/MTX/mtxvec.h" #include "s/s_Math.h" #include "toBeSorted/attention.h" +#include "toBeSorted/blur_and_palette_manager.h" +#include "toBeSorted/effects_struct.h" #include "toBeSorted/event_manager.h" +#include "toBeSorted/small_sound_mgr.h" #include "toBeSorted/special_item_drop_mgr.h" void float_ordering() { @@ -220,14 +223,14 @@ void dAcOtubo_c::executeState_Wait() { fn_8002A450(position, polyAttr0, polyAttr1, mField_0x1B4, 0, 1.0f, mField_0x1B0); } if (mbField_0x9F3) { - playSound(0xA46); + playSound(SE_Tubo_PUT); mbField_0x9F3 = false; } if (checkOnLava()) { if (mField_0x9F6 != 2) { fn_8002A450(position, polyAttr0, polyAttr1, mField_0x1B4, 0, 1.0f, mField_0x1B0); } - playSound(0x9A3); + playSound(SE_O_FALL_LAVA_S); } } } else if (mObjAcch.ChkGndHit()) { @@ -446,11 +449,8 @@ void dAcOtubo_c::finalizeState_Rebirth() { setActorProperty(0x1); } -extern "C" void fn_80027510(void *, bool); -extern "C" void fn_80027560(void *, bool, int); -extern "C" void *fn_800298B0(u16, mVec3_c *, mVec3_c *, u32, u32, u32, u32, u32); +extern "C" dEmitterBase_c *fn_800298B0(u16, mVec3_c *, mVec3_c *, u32, u32, u32, u32, u32); extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_109_, PARTICLE_RESOURCE_ID_MAPPING_209_; -extern "C" void *ENVIRONMENT; extern "C" void fn_80022BE0(void *, const mVec3_c &); void dAcOtubo_c::destroy() { @@ -462,19 +462,19 @@ void dAcOtubo_c::destroy() { if (!boolParam) { return; } - fn_80022BE0(ENVIRONMENT, position); + fn_80022BE0(BlurAndPaletteManager::GetPInstance(), position); mActorCarryInfo.fn_80050EA0(this); - void *fx_thing = fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_209_, &poscopy2, nullptr, 0, 0, 0, 0, 0); + dEmitterBase_c *fx_thing = fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_209_, &poscopy2, nullptr, 0, 0, 0, 0, 0); if (fx_thing) { - fn_80027510(fx_thing, mSubtype != 0); + fx_thing->attachEmitterCallbackId(mSubtype != 0 ? dJEffManager_c::TsuboB : dJEffManager_c::TsuboA); } fx_thing = fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_109_, &position, nullptr, 0, 0, 0, 0, 0); if (fx_thing) { - fn_80027560(fx_thing, mSubtype != 0, 0); + fx_thing->bindShpEmitter(mSubtype != 0 ? dJEffManager_c::TsuboB : dJEffManager_c::TsuboA, false); } - playSound(0xA47); // TODO (Sound ID) + playSound(SE_Tubo_BREAK); if (mSceneflag < 0xFF && !checkSceneflag()) { SceneflagManager::sInstance->setFlag(roomid, mSceneflag); @@ -614,7 +614,7 @@ void dAcOtubo_c::fn_272_2670() { cLib::addCalcPosXZ(&velocity, mVec3_c::Zero, 0.05f, 1.0f, 0.2f); forwardSpeed = EGG::Math::sqrt(velocity.x * velocity.x + velocity.z * velocity.z); if (!noSound) { - playSound(0x9A0); // TODO (Sound ID) - Fall Water S + playSound(SE_O_FALL_WATER_S); } mbSubmerged = true; } else { @@ -860,7 +860,7 @@ void dAcOtubo_c::playRollSound() { return; } - FUN_8002d770(0xA48, forwardSpeed); + FUN_8002d770(SE_Tubo_ROLL_LV, forwardSpeed); } void float_order() { diff --git a/src/d/lyt/meter/d_lyt_meter_item_select.cpp b/src/d/lyt/meter/d_lyt_meter_item_select.cpp index f79df912..94cf6fde 100644 --- a/src/d/lyt/meter/d_lyt_meter_item_select.cpp +++ b/src/d/lyt/meter/d_lyt_meter_item_select.cpp @@ -702,8 +702,8 @@ void dLytMeterItemSelect_c::initializeState_SelectIn() { if (dAcPy_c::GetLink()->checkFlags0x340(0x400)) { field_0x57BD = 1; field_0x5788 = 0; - field_0x579B = 0; - mEffects.fn_80027320(0); + mEffectAlpha = 0; + mEffects.setGlobalAlpha(0); mpPanes[ITEM_SELECT_PANE_ICON_OFFSET + 2]->SetInfluencedAlpha(true); mpPanes[ITEM_SELECT_PANE_ICON_OFFSET + 2]->SetAlpha(64); } @@ -759,16 +759,16 @@ void dLytMeterItemSelect_c::executeState_SelectIn() { bAllAnimsSettled = false; } else { field_0x57BE = 1; - bool settled0x57BE = true; - bool settled0x5784 = true; - if (field_0x579B != 0xFF) { - settled0x57BE = sLib::chaseUC(&field_0x579B, 0xFF, 0x55); + bool settledAnimAlpha = true; + bool settledAnimScale = true; + if (mEffectAlpha != 0xFF) { + settledAnimAlpha = sLib::chaseUC(&mEffectAlpha, 0xFF, 0x55); } - if (field_0x5784 != 1.0f) { - settled0x5784 = sLib::chase(&field_0x5784, 1.0f, 0.06666666f); + if (mEffectScale != 1.0f) { + settledAnimScale = sLib::chase(&mEffectScale, 1.0f, 0.06666666f); } - mEffects.fn_80027320(field_0x579B); - if (!settled0x57BE || !settled0x5784) { + mEffects.setGlobalAlpha(mEffectAlpha); + if (!settledAnimAlpha || !settledAnimScale) { bAllAnimsSettled = false; } } @@ -840,13 +840,13 @@ void dLytMeterItemSelect_c::executeState_SetIn() { } else { bool settled0x57BE = true; bool settled0x5784 = true; - if (field_0x579B != 0) { - settled0x57BE = sLib::chaseUC(&field_0x579B, 0, 0x55); + if (mEffectAlpha != 0) { + settled0x57BE = sLib::chaseUC(&mEffectAlpha, 0, 0x55); } - if (field_0x5784 != 0.8f) { - settled0x5784 = sLib::chase(&field_0x5784, 0.8f, 0.06666666f); + if (mEffectScale != 0.8f) { + settled0x5784 = sLib::chase(&mEffectScale, 0.8f, 0.06666666f); } - mEffects.fn_80027320(field_0x579B); + mEffects.setGlobalAlpha(mEffectAlpha); if (settled0x57BE && settled0x5784) { field_0x57BD = 0; field_0x57BE = 0; @@ -1058,13 +1058,13 @@ void dLytMeterItemSelect_c::executeState_SelectOut() { } else { bool settled0x57BE = true; bool settled0x5784 = true; - if (field_0x579B != 0) { - settled0x57BE = sLib::chaseUC(&field_0x579B, 0, 0x55); + if (mEffectAlpha != 0) { + settled0x57BE = sLib::chaseUC(&mEffectAlpha, 0, 0x55); } - if (field_0x5784 != 0.8f) { - settled0x5784 = sLib::chase(&field_0x5784, 0.8f, 0.06666666f); + if (mEffectScale != 0.8f) { + settled0x5784 = sLib::chase(&mEffectScale, 0.8f, 0.06666666f); } - mEffects.fn_80027320(field_0x579B); + mEffects.setGlobalAlpha(mEffectAlpha); if (settled0x57BE && settled0x5784) { field_0x57BD = 0; field_0x57BE = 0; @@ -1674,9 +1674,9 @@ bool dLytMeterItemSelect_c::build(d2d::ResAccIf_c *resAcc) { field_0x578C = 0; field_0x5790 = 0; - field_0x5784 = 0.8f; + mEffectScale = 0.8f; field_0x5788 = 0; - field_0x579B = 0; + mEffectAlpha = 0; field_0x57BD = 0; field_0x57BE = 0; field_0x57BF = 0; @@ -1922,9 +1922,9 @@ bool dLytMeterItemSelect_c::execute() { } if (field_0x57BD != 0) { - field_0x579B = 0; - field_0x5784 = 0.8f; - mEffects.fn_80027320(0); + mEffectAlpha = 0; + mEffectScale = 0.8f; + mEffects.setGlobalAlpha(0); field_0x57BD = 0; field_0x57BE = 0; mpPanes[ITEM_SELECT_PANE_ICON_OFFSET + 2]->SetAlpha(0xFF); @@ -2241,18 +2241,18 @@ extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_717_; void dLytMeterItemSelect_c::fn_800EF580() { nw4r::math::MTX34 mtx = mpPanes[11]->GetGlobalMtx(); mVec3_c pos(mtx._03, mtx._13, 0.0f); - mVec3_c scale(field_0x5784, field_0x5784, field_0x5784); + mVec3_c scale(mEffectScale, mEffectScale, mEffectScale); mEffects.fn_80029A70(PARTICLE_RESOURCE_ID_MAPPING_717_, &pos, nullptr, &scale, nullptr, nullptr); if (field_0x57C0 != 0) { - mEffects.fn_80026ED0(); + mEffects.stopDrawParticles(); field_0x57C0 = 0; } else { if (field_0x57BE != field_0x57BF) { if (field_0x57BE != 0) { - mEffects.fn_80026F10(); + mEffects.playDrawParticles(); } else { - mEffects.fn_80026ED0(); + mEffects.stopDrawParticles(); } } } diff --git a/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp b/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp index f7fcb7a6..fb71a501 100644 --- a/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp @@ -676,7 +676,7 @@ void dLytMeterMinusBtn_c::executeState_DemoMove() { mEffectsRot[i].z += demoRotIncrement; nw4r::math::MTX34 mtx = getPaneByIndex(slot + MINUS_BTN_PANE_ITEM_OFFSET)->GetGlobalMtx(); mVec3_c pos(mtx._03, mtx._13, 0.0f); - mEffects[i].fn_800271E0(&pos, &mEffectsRot[i], nullptr); + mEffects[i].setPosRotScaleWithScreenScale(pos, &mEffectsRot[i], nullptr); } } } diff --git a/src/toBeSorted/blur_and_palette_manager.cpp b/src/toBeSorted/blur_and_palette_manager.cpp index b2d3a21b..f86d9e43 100644 --- a/src/toBeSorted/blur_and_palette_manager.cpp +++ b/src/toBeSorted/blur_and_palette_manager.cpp @@ -5,7 +5,7 @@ BlurAndPaletteManager BlurAndPaletteManager::sInstance; BlurAndPaletteManager *BlurAndPaletteManager::sPInstance; -TList sList; +TList sPlayingEffectsList; mColor BlurAndPaletteManager::combineColors(const mColor &c1, const mColor &c2, f32 ratio) { mColor result; @@ -178,7 +178,7 @@ BlurAndPaletteManager::BlurAndPaletteManager() { } - field_0x5CE4.MA06_kColor3 = mColor(0xff, 0xff, 0xff, 0xff); + field_0x5CE4.MA00_kColor3 = mColor(0xff, 0xff, 0xff, 0xff); field_0x5CE4.MA01_tevReg1 = mColor(0xff, 0xff, 0xff, 0xff); field_0x5CE4.MA01_kColor2 = mColor(0xff, 0xff, 0xff, 0xff); field_0x5CE4.MA02_tevReg1 = mColor(0xff, 0xff, 0xff, 0xff); diff --git a/src/toBeSorted/d_effects_1.cpp b/src/toBeSorted/d_effects_1.cpp new file mode 100644 index 00000000..ab9825a4 --- /dev/null +++ b/src/toBeSorted/d_effects_1.cpp @@ -0,0 +1,713 @@ +#include "JSystem/JParticle/JPADrawInfo.h" +#include "JSystem/JParticle/JPAEmitter.h" +#include "c/c_math.h" +#include "common.h" +#include "d/d_base.h" +#include "d/d_heap.h" +#include "d/d_stage.h" +#include "egg/core/eggHeap.h" +#include "m/m_allocator.h" +#include "m/m_color.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmat.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "nw4r/g3d/res/g3d_resshp.h" +#include "rvl/MTX/mtx.h" +#include "rvl/MTX/mtxvec.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/oarc_manager.h" +#include "toBeSorted/blur_and_palette_manager.h" +#include "toBeSorted/d_particle.h" +#include "toBeSorted/effects_struct.h" +#include "toBeSorted/lyt_related_floats.h" + +#include "rvl/GX.h" +#include "rvl/MTX.h" + +typedef TList EffectsList; +EffectsList sPlayingEffectsList; +CommonEmitterCallback sCommonEmitterCallbacks[2]; +dShpEmitter_c sShpEmitters[47]; +dEmitterBase_c sEmitter; +dParticleFogProc_c sFogProcs[12]; +dEffect2D_c s2DEffects[3]; + +// broken by -ipa file - reconsider splits? +dEmitterCallback_c::~dEmitterCallback_c() { + for (EmitterCallbackList::Iterator it = mEmitterList.GetBeginIter(); it != mEmitterList.GetEndIter();) { + EmitterCallbackList::Iterator itCopy = it; + ++itCopy; + it->setEmitterCallback(nullptr); + it = itCopy; + } +} + +void dEmitterCallback_c::remove(dEmitterBase_c *emitter) { + if (mEmitterList.GetPosition(emitter) == mEmitterList.GetEndIter()) { + return; + } + mEmitterList.remove(emitter); +} + +// broken by -ipa file - reconsider splits? +dParticleCallback_c::~dParticleCallback_c() { + for (ParticleCallbackList::Iterator it = mEmitterList.GetBeginIter(); it != mEmitterList.GetEndIter();) { + ParticleCallbackList::Iterator itCopy = it; + ++itCopy; + it->setParticleCallback(nullptr); + it = itCopy; + } +} + +void dParticleCallback_c::remove(dEmitterBase_c *emitter) { + if (mEmitterList.GetPosition(emitter) == mEmitterList.GetEndIter()) { + return; + } + mEmitterList.remove(emitter); +} + +dEmitterBase_c::~dEmitterBase_c() { + deactivateEmitters(); + if (mpEmitterCallback != nullptr) { + mpEmitterCallback->remove(this); + mpEmitterCallback = nullptr; + } + + if (mpParticleCallback != nullptr) { + mpParticleCallback->remove(this); + mpParticleCallback = nullptr; + } +} + +JPABaseEmitter *dEmitterBase_c::GetNextEmitter(JPABaseEmitter *head) { + return reinterpret_cast(head->getUserWork()); +} + +bool dEmitterBase_c::createEmitters( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2 +) { + u16 iter = effectResourceId; + JPABaseEmitter *head = nullptr; + JPABaseEmitter *last; + for (; iter != 0xFFFF; iter = dParticle::mgr_c::GetInstance()->getJpnData(iter)) { + last = dParticle::mgr_c::GetInstance()->createEmitter(iter, fn_80028900(iter), position, rot, scale); + if (last != nullptr) { + if (head != nullptr) { + head->setUserWork(reinterpret_cast(last)); + } else { + mpEmitterHead = last; + } + head = last; + last->setEmitterCallBackPtr(mpEmitterCallback); + last->setParticleCallBackPtr(mpParticleCallback); + loadColors(last, c1, c2, idx1, idx2); + } + } + + if (mpEmitterHead != nullptr) { + if (mpEmitterCallback != nullptr) { + // why last and not head? + mpEmitterCallback->create(last); + } + if (mpParticleCallback != nullptr) { + // why last and not head? + mpParticleCallback->create(last); + } + } + return mpEmitterHead != nullptr; +} + +void dEmitterBase_c::setEmitterCallback(dEmitterCallback_c *cb) { + if (mpEmitterCallback != cb) { + if (mpEmitterCallback != nullptr) { + mpEmitterCallback->remove(this); + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setEmitterCallBackPtr(nullptr); + } + } + mpEmitterCallback = cb; + if (cb != nullptr) { + cb->mEmitterList.append(this); + } + } +} + +void dEmitterBase_c::setParticleCallback(dParticleCallback_c *cb) { + if (mpParticleCallback != cb) { + if (mpParticleCallback != nullptr) { + mpParticleCallback->remove(this); + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setParticleCallBackPtr(nullptr); + } + } + mpParticleCallback = cb; + if (cb != nullptr) { + cb->mEmitterList.append(this); + } + } +} + +void dEmitterBase_c::setImmortal() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->becomeImmortalEmitter(); + } +} + +void dEmitterBase_c::deactivateEmitters() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setEmitterCallBackPtr(nullptr); + emitter->setParticleCallBackPtr(nullptr); + emitter->quitImmortalEmitter(); + if (emitter->mMaxFrame == 0) { + emitter->becomeInvalidEmitter(); + } + emitter->playCalcEmitter(); + } + mpEmitterHead = nullptr; +} + +void dEmitterBase_c::stopCalcEmitters() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->stopCalcEmitter(); + } +} + +void dEmitterBase_c::playCalcEmitters() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->playCalcEmitter(); + } +} + +void dEmitterBase_c::stopDrawParticles() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->stopDrawParticle(); + } +} + +void dEmitterBase_c::playDrawParticles() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->playDrawParticle(); + } +} + +void dEmitterBase_c::setPosRotScale(const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalTranslation(position); + if (rot != nullptr) { + emitter->setGlobalRotation(*rot); + } + if (scale != nullptr) { + emitter->setGlobalScale(*scale); + } + } +} + +extern "C" f32 lbl_80571C50; +inline f32 getlbl_80571C50() { + return lbl_80571C50; +} +void dEmitterBase_c::setPosRotScaleWithScreenScale(const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale) { + mVec3_c adjustedPosition(position.x * getlbl_80571C50(), position.y, position.z); + setPosRotScale(adjustedPosition, rot, scale); +} + +void dEmitterBase_c::setTransform(const mMtx_c &mtx) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalSRTMatrix(mtx); + } +} + +void dEmitterBase_c::loadColors(const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + loadColors(emitter, c1, c2, idx1, idx2); + } +} + +void dEmitterBase_c::setGlobalAlpha(u8 alpha) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalAlpha(alpha); + } +} + +void dEmitterBase_c::setRate(f32 rate) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setRate(rate); + } +} + +void dEmitterBase_c::setDynamicsScale(const mVec3_c &scale) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalDynamicsScale(scale); + } +} + +void dEmitterBase_c::setParticleScale(const mVec3_c &scale) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalParticleScale(scale); + } +} + +void dEmitterBase_c::setAwayFromCenterSpeed(f32 speed) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setAwayFromCenterSpeed(speed); + } +} + +void dEmitterBase_c::setVolumeSize(u16 size) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setVolumeSize(size); + } +} + +void dEmitterBase_c::setLifeTime(s16 lifetime) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setLifeTime(lifetime); + } +} + +void dEmitterBase_c::attachEmitterCallbackId(s32 id) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setEmitterCallBackPtr(&sCommonEmitterCallbacks[id]); + } +} + +void dEmitterBase_c::bindShpEmitter(s32 id, bool unused) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setParticleCallBackPtr(&sShpEmitters[id]); + emitter->setGlobalAlpha(0); + } +} + +EffectsStruct::EffectsStruct() : mpOwner(nullptr), mFlags(0), mEffect(0) {} + +EffectsStruct::EffectsStruct(dBase_c *base) : mpOwner(base), mFlags(0), mEffect(0) {} + +EffectsStruct::~EffectsStruct() { + mpOwner = nullptr; + remove(false); +} + +void EffectsStruct::remove(bool bForceDeleteEmitters) { + mFlags &= ~0x1; + JPABaseEmitter *emitter = bForceDeleteEmitters ? mpEmitterHead : nullptr; + deactivateEmitters(); + for (; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + dParticle::mgr_c::GetInstance()->forceDeleteEmitter(emitter); + } + removeFromActiveEmittersList(); +} + +void EffectsStruct::addToActiveEmittersList(u16 resourceId, bool bFlags) { + mEffect = resourceId; + mFlags = 0; + setImmortal(); + sPlayingEffectsList.append(this); + mFlags |= 1; + if (bFlags) { + mFlags |= 4; + } + if (dParticle::mgr_c::GetInstance()->getResUserWork(resourceId) & 0x4000) { + mFlags |= 0x10; + } +} + +bool EffectsStruct::areAllEmittersDone() { + bool allDone = true; + + if (mpEmitterHead != nullptr) { + if ((mFlags & 0x8) != 0 && field_0x2C != 0) { + return false; + } + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + bool canDelete = emitter->isEnableDeleteEmitter(); + if (!canDelete) { + if (emitter->mMaxFrame == 0) { + emitter->becomeInvalidEmitter(); + } + allDone = false; + } + } + } + + return allDone; +} + +extern "C" bool fn_80054AD0(); +void dEffect2D_c::draw() { + f32 proj[GX_PROJECTION_SZ]; + GXGetProjectionv(proj); + f32 base = proj[1]; + proj[1] = base / get_805751A4(); + GXSetProjectionv(proj); + f32 f = get_80575184() / 2; + mMtx_c mtx1, mtx2; + JPADrawInfo info; + + C_MTXLightOrtho(mtx1, -get_80575150(), get_80575150(), -f, f, 0.5f, 0.5f, 0.5f, 0.5f); + + MTXScale(mtx2, fn_80054AD0() ? get_805751A4() : 1.0f, 1.0f, 1.0f); + MTXCopy(mtx2, info.mCamMtx); + MTXCopy(mtx1, info.mPrjMtx); + dJEffManager_c::draw(&info, mGroupId); + proj[1] = base; + GXSetProjectionv(proj); +} + +void dEffect2D_c::create(u32 groupId, u8 prio) { + mGroupId = groupId; + setPriority(prio); +} + +void dJEffEmitterCallback_c::executeAfter(JPABaseParticle *) {} + +void dShpEmitterProc::doDraw() { + mMtx_c viewMtx; + getViewMtx(viewMtx); + s32 ctrl = 0; + mLightSetId = mAlpha[0]; + mMtx_c *pTransforms = mpTransforms; + bool *pFlags = mpFlags; + for (s32 idx = 0; idx < mCount;) { + if (*pFlags == false) { + mMtx_c mtx; + mtx.copyFrom(*pTransforms); + MTXConcat(viewMtx, mtx, mtx); + mMtx_c mtx2; + mtx2.copyFrom(mtx); + mtx2.fn_802F1C40(0, 1); + nw4r::math::MTX33 mtx3; + for (int a = 0; a < 3; a++) { + for (int b = 0; b < 3; b++) { + mtx3.m[a][b] = mtx2.m[a][b]; + } + } + if (mLightSetId != mAlpha[idx]) { + mLightSetId = mAlpha[idx]; + setupLight(); + } + mVec3_c v; + mVec3_c zero(0.0f, 0.0f, 0.0f); + MTXMultVec(*pTransforms, zero, v); + dShpProcBase_c::draw(&v); + nw4r::g3d::G3DState::SetViewPosNrmMtxArray(mtx, &mtx3, nullptr); + nw4r::g3d::Draw1Mat1ShpDirectly(nw4r::g3d::ResMat(nullptr), mShp, mtx, mtx2, ctrl, nullptr, nullptr); + if (ctrl == 0) { + ctrl = 2; + } + } + idx++; + pTransforms++; + pFlags++; + } + mpOwner->clear(); +} + +bool dShpEmitter_c::create(mHeapAllocator_c *alloc) { + if (!mProc.create(nw4r::g3d::ResMat(nullptr), nw4r::g3d::ResShp(nullptr), 100, alloc, false, nullptr)) { + return false; + } + mProc.setOwner(this); + return true; +} + +void dShpEmitter_c::init(const char *mdlName, const char *arcName, bool priority) { + clear(); + void *ptr = OarcManager::GetInstance()->getSubEntryData(arcName, "g3d/model.brres"); + if (ptr == nullptr) { + mProc.setResMat(nw4r::g3d::ResMat(nullptr)); + mProc.setResShp(nw4r::g3d::ResShp(nullptr)); + return; + } + + nw4r::g3d::ResFile f(ptr); + + if (strequals(arcName, "F300BrokenRockWall")) { + dStage_c::bindStageResToFile(&f); + } + + nw4r::g3d::ResMdl mdl = f.GetResMdl(mdlName); + nw4r::g3d::ResMat mat = mdl.GetResMat(0); + mProc.setResMat(mat); + mProc.setResShp(mdl.GetResShp(0)); + if (priority) { + mProc.setPriorityDraw(0x1C, 4); + } +} + +void dShpEmitter_c::clear() { + field_0xA0 = 0; + mProc.setAllFlags(); +} + +void dShpEmitter_c::draw(JPABaseEmitter *emitter, JPABaseParticle *particle) { + // TODO + for (s32 i = 0; i < 100; i++) { + if (mProc.isDrawDisabled(i)) { + mProc.setDrawDisabled(i, false); + mVec3_c pos; + mVec3_c velocity; + particle->getGlobalPosition(pos); + particle->getVelVec(velocity); + mVec3_c v; + if (cM::isZero(velocity.squareMagXZ())) { + v = mVec3_c::Ex; + } else { + v = mVec3_c::Ey.cross(velocity); + v.normalize(); + } + mMtx_c m; + m.setAxisRotation(v, mAng((u16)particle->mRotateAngle).radian2()); + m.setBase(3, pos); + mMtx_c mtx2; + mVec3_c scale( + particle->getParticleScaleX() * emitter->getGlobalParticleScaleX(), + particle->getParticleScaleY() * emitter->getGlobalParticleScaleY(), + particle->getParticleScaleX() * emitter->getGlobalParticleScaleX() + ); + MTXScale(mtx2, scale.x, scale.y, scale.z); + MTXConcat(m, mtx2, m); + mProc.setTransform(i, m); + mProc.setAlpha(i, emitter->getGlobalAlpha()); + field_0xA0++; + break; + } + } + // Hide the particle - we're doing all the drawing ourselves + particle->setInvisibleParticleFlag(); +} + +void dJEffManager_c::remove() { + setEmitterCallback(nullptr); + mpEmitterHead = nullptr; +} + +extern "C" u32 sNumberOfMgrs; // should be const? +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_119_; +extern "C" dJEffManager_c *CURRENT_EFFECT_MANAGER_INIT; + +// various grasses being cut +extern const u16 sEffectResourceIds[]; + +void dJEffManager_c::setupEffects() { + for (s32 idx = 0; idx < sNumberOfMgrs; idx++) { + sManagers[idx].create(sEffectResourceIds[idx]); + } + + sShpEmitters[TsuboA].init("FX_TsuboA", "Tubo", false); + sShpEmitters[TsuboB].init("FX_TsuboB", "Tubo", false); + sShpEmitters[BRockA].init("FX_BRockA", "FXBRockA", false); + sShpEmitters[FruitA].init("FX_FruitA", "FruitA", true); + sShpEmitters[GrassCoil].init("FX_GrassCoil", "GrassCoilPiece", false); + sShpEmitters[BRockB].init("FX_BRockB", "RockFace", true); + sShpEmitters[Beehive].init("FX_Beehive", "Bee", false); + sShpEmitters[VeraRock].init("FX_VeraRock", "Bvd", false); + sShpEmitters[Pumpkin].init("FX_Pumpkin", "Pumpkin", false); + sShpEmitters[BRockC].init("FX_BRockC", "FX_BRockC", true); + sShpEmitters[F300BrokenRockWall_00].init("FX_F300BrokenRockWall_00", "F300BrokenRockWall", true); + sShpEmitters[F300BrokenRockWall_01].init("FX_F300BrokenRockWall_01", "F300BrokenRockWall", true); + sShpEmitters[F300BrokenRockWall_01T].init("FX_F300BrokenRockWall_01T", "F300BrokenRockWall", true); + sShpEmitters[LotusSeed].init("FX_LotusSeed", "LotusSeed", false); + sShpEmitters[Beamoss].init("FX_Beamoss", "Beamos", false); + sShpEmitters[Cakram].init("FX_Cakram", "Asura", false); + sShpEmitters[Dodai].init("FX_Dodai", "Asura", false); + sShpEmitters[LegParts].init("FX_LegParts", "Asura", false); + sShpEmitters[AsuraFloorBrk].init("FX_AsuraFloorBrk", "Asura", false); + sShpEmitters[BreakPillar].init("FX_BreakPillar", "BreakPillar", false); + sShpEmitters[Barrel].init("FX_Barrel", "Barrel", false); + sShpEmitters[BarrelBomb].init("FX_BarrelBomb", "BarrelBomb", false); + sShpEmitters[RockMiddle].init("FX_RockMiddle", "RockCarryMiddle", false); + sShpEmitters[BocoBone].init("FX_BocoBone", "Skull", false); + sShpEmitters[BRockStopA].init("FX_BRockStopA", "BRockStopA", true); + sShpEmitters[BWallD201].init("FX_BWallD201", "BWallD201", true); + sShpEmitters[Gunho].init("FX_Gunho", "Gunho", false); + sShpEmitters[TuboBig].init("FX_TuboBig", "TuboBig", false); + sShpEmitters[Amos].init("FX_Amos", "Amos", false); + sShpEmitters[HidokariBoneA].init("FX_HidokariBoneA", "HidokariS", false); + sShpEmitters[HidokariBoneB].init("FX_HidokariBoneB", "HidokariS", false); + sShpEmitters[Hydra].init("FX_Hydra", "Hydra", false); + sShpEmitters[Captain].init("FX_Captain", "Captain", false); + sShpEmitters[KibakoHang].init("FX_KibakoHang", "KibakoHang", true); + sShpEmitters[IslTreIRock].init("FX_IslTreIRock", "IslTreIRock", false); + sShpEmitters[BirdraceTarget].init("FX_BirdraceTarget", "BirdraceTarget", false); + sShpEmitters[FlowerA00F].init("FX_FlowerA00F", "FlowerA00", false); + sShpEmitters[FlowerA00L].init("FX_FlowerA00L", "FlowerA00", false); + sShpEmitters[FlowerB00].init("FX_FlowerB00", "FlowerB00", false); + sShpEmitters[FlowerB01].init("FX_FlowerB01", "FlowerB01", false); + sShpEmitters[GirahimClaymore].init("FX_GirahimClaymore", "GirahimBt03", false); + sShpEmitters[BirdKobunAEgg].init("FX_BirdKobunAEgg", "BirdEgg", false); + sShpEmitters[BirdKobunBEgg].init("FX_BirdKobunBEgg", "BirdEgg", false); + sShpEmitters[BirdRivalEgg].init("FX_BirdRivalEgg", "BirdEgg", false); + sShpEmitters[BWallAF200].init("FX_BWallAF200", "BWallAF200", true); + sShpEmitters[BWallBF200].init("FX_BWallBF200", "BWallBF200", true); + sShpEmitters[BWallF210].init("FX_BWallF210", "BWallF210", true); +} + +void dJEffManager_c::removeEffManagers() { + for (s32 i = 0; i < sNumberOfMgrs; i++) { + sManagers[i].remove(); + } + + // TODO + EffectsList::Iterator it = sPlayingEffectsList.GetBeginIter(); + while (it != sPlayingEffectsList.GetEndIter()) { + EffectsList::Iterator itCopy; + ++itCopy; + it->remove(true); + it = itCopy; + } + + dParticle::mgr_c::GetInstance()->forceDeleteAllEmitter(); + for (s32 i = 0; i < 47; i++) { + sShpEmitters[i].clear(); + } +} + +// TODO explain this +static u32 sInts[] = {0x28, 0x29, 0x87, 0x88, 0x89, 0x8A, 0x8C, 0x8D, 0x91, 0x86, 0x1, 0x2}; +static u32 sInts2[] = {0x2, 0x87, 0x8B}; + +bool dJEffManager_c::createEffManagers() { + EGG::Heap *heap = dHeap::work1Heap.heap; + ms_allocator = new (heap, 4) mHeapAllocator_c(); + sManagers = new (heap, 4) dJEffManager_c[sNumberOfMgrs]; + + for (s32 idx = 0; idx < sNumberOfMgrs; idx++) { + // TODO explain this + if (sEffectResourceIds[idx] == PARTICLE_RESOURCE_ID_MAPPING_119_) { + CURRENT_EFFECT_MANAGER_INIT = &sManagers[idx]; + break; + } + } + + ms_allocator->createNewTempFrmHeap(-1, dHeap::work1Heap.heap, "dJEffManager_c::ms_allocator", 0x20, 0); + for (s32 idx = 0; idx < 2; idx++) { + sFogProcs[idx].create(idx, sInts[idx], -1, ms_allocator); + } + for (s32 idx = 2; idx < 12; idx++) { + sFogProcs[idx].create(idx, -1, sInts[idx], ms_allocator); + } + + for (s32 idx = 0; idx < 3; idx++) { + s2DEffects[idx].create(idx + 12, sInts2[idx]); + } + + for (s32 idx = 0; idx < 47; idx++) { + sShpEmitters[idx].create(ms_allocator); + } + + ms_allocator->adjustFrmHeapRestoreCurrent(); + for (int i = 0; i < 2; i++) { + sCommonEmitterCallbacks[i].init(i); + } + return true; +} + +void dEmitterBase_c::loadColors(JPABaseEmitter *emitter, const GXColor *color1, const GXColor *color2, s32 plltIdx1, s32 plltIdx2) { + BlurAndPaletteManager &mgr = BlurAndPaletteManager::GetInstance(); + u8 r1 = 0xFF; + u8 g1 = 0xFF; + u8 b1 = 0xFF; + u8 r2 = 0xFF; + u8 g2 = 0xFF; + u8 b2 = 0xFF; + u8 r, g, b; + + mColor c1 = mgr.GetCurrentSph().black3_000000; + mColor c2 = mgr.GetCurrentSph().black4_000000; + + u32 flags = emitter->getDynResUserWork(); + u32 factor = flags >> 24; + bool useBlack4 = false; + if (factor > 100) { + useBlack4 = true; + factor = factor - 100; + } + f32 fFactor = factor / 100.0f; + if (fFactor > 1.0f) { + fFactor = 1.0f; + } + + f32 scaleR, scaleG, scaleB; + if (!useBlack4) { + scaleR = 1.0f - (1.0f - (c1.r / 255.0f)) * fFactor; + scaleG = 1.0f - (1.0f - (c1.g / 255.0f)) * fFactor; + scaleB = 1.0f - (1.0f - (c1.b / 255.0f)) * fFactor; + } else { + const mColor &c = mgr.GetCurrentSph().black4_000000; + scaleR = 1.0f - (1.0f - (c2.r / 255.0f)) * fFactor; + scaleG = 1.0f - (1.0f - (c2.g / 255.0f)) * fFactor; + scaleB = 1.0f - (1.0f - (c2.b / 255.0f)) * fFactor; + } + + if (color1 != nullptr) { + r1 = color1->r; + g1 = color1->g; + b1 = color1->b; + } + + if (plltIdx1 > 0) { + if ((flags & 0x1000) != 0) { + const PaletteEAF_smol_entry &entry = mgr.getSmallEAF(plltIdx1 - 1, plltIdx2); + r1 = entry.field_0x00.r; + g1 = entry.field_0x00.g; + b1 = entry.field_0x00.b; + } else if ((flags & 0x2000) != 0) { + const PaletteEAF_smol_entry &entry = mgr.getSmallEAF(plltIdx1 - 1, plltIdx2); + r1 = entry.field_0x08.r; + g1 = entry.field_0x08.g; + b1 = entry.field_0x08.b; + } + } + + if (factor != 0) { + r = mgr.getfield_0x2F14() * r1 * scaleR; + g = mgr.getfield_0x2F18() * g1 * scaleG; + b = mgr.getfield_0x2F1C() * b1 * scaleB; + } else { + r = r1 * scaleR; + g = g1 * scaleG; + b = b1 * scaleB; + } + + emitter->setGlobalPrmColor(r, g, b); + + if (color2 != nullptr) { + r2 = color2->r; + g2 = color2->g; + b2 = color2->b; + } + + if (plltIdx1 > 0) { + if ((flags & 0x1000) != 0) { + const PaletteEAF_smol_entry &entry = mgr.getSmallEAF(plltIdx1 - 1, plltIdx2); + r2 = entry.field_0x04.r; + g2 = entry.field_0x04.g; + b2 = entry.field_0x04.b; + } else if ((flags & 0x2000) != 0) { + const PaletteEAF_smol_entry &entry = mgr.getSmallEAF(plltIdx1 - 1, plltIdx2); + r2 = entry.field_0x0C.r; + g2 = entry.field_0x0C.g; + b2 = entry.field_0x0C.b; + } + } + + if (factor != 0) { + r = mgr.getfield_0x2F14() * r2 * scaleR; + g = mgr.getfield_0x2F18() * g2 * scaleG; + b = mgr.getfield_0x2F1C() * b2 * scaleB; + } else { + r = r2 * scaleR; + g = g2 * scaleG; + b = b2 * scaleB; + } + + emitter->setGlobalEnvColor(r, g, b); +} + +void EffectsStruct::removeFromActiveEmittersList() { + if (sPlayingEffectsList.GetPosition(this) != sPlayingEffectsList.GetEndIter()) { + sPlayingEffectsList.remove(this); + } +} diff --git a/src/toBeSorted/d_unk_mdl_stuff_2.cpp b/src/toBeSorted/d_unk_mdl_stuff_2.cpp new file mode 100644 index 00000000..7ccc654f --- /dev/null +++ b/src/toBeSorted/d_unk_mdl_stuff_2.cpp @@ -0,0 +1,148 @@ + +#include "toBeSorted/d_unk_mdl_stuff_2.h" + +#include "common.h" +#include "d/col/bg/d_bg_s.h" +#include "egg/gfx/eggLightManager.h" +#include "m/m3d/m3d.h" +#include "m/m3d/m_proc.h" +#include "m/m_mtx.h" +#include "nw4r/g3d/g3d_draw1mat1shp.h" +#include "nw4r/g3d/g3d_scnobj.h" +#include "nw4r/g3d/g3d_state.h" +#include "nw4r/g3d/res/g3d_resmat.h" +#include "nw4r/g3d/res/g3d_resshp.h" +#include "nw4r/math/math_types.h" +#include "rvl/GX/GXLight.h" +#include "rvl/GX/GXTev.h" +#include "rvl/GX/GXTypes.h" +#include "rvl/MTX/mtx.h" +#include "toBeSorted/blur_and_palette_manager.h" + +bool dShpProcBase_c::init(nw4r::g3d::ResMat mat, nw4r::g3d::ResShp shp, s32 count, bool xlu, u32 *pSize) { + mCount = count; + mpFlags = new bool[count]; + if (mpFlags == nullptr) { + return false; + } + + if (pSize != nullptr) { + *pSize += count * sizeof(bool); + } + for (s32 i = 0; i < mCount; i++) { + mpFlags[i] = 0; + } + mMat = mat; + mShp = shp; + if (xlu) { + setOption(nw4r::g3d::ScnObj::OPTION_DISABLE_DRAW_OPA, true); + } else { + setOption(nw4r::g3d::ScnObj::OPTION_DISABLE_DRAW_XLU, true); + } + return true; +} + +void dShpProcBase_c::setupLight() { + u32 pDiffColorMask; + u32 pDiffAlphaMask; + u32 pSpecColorMask; + u32 pSpecAlphaMask; + GXColor pColor; + m3d::getLightMgr(0)->LoadLightSet( + mLightSetId, &pDiffColorMask, &pDiffAlphaMask, &pSpecColorMask, &pSpecAlphaMask, &pColor + ); + GXSetChanCtrl(GX_COLOR0, GX_TRUE, GX_SRC_REG, GX_SRC_REG, (GXLightID)pDiffColorMask, GX_DF_CLAMP, GX_AF_SPOT); + GXSetChanCtrl(GX_ALPHA0, GX_FALSE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); + GXSetChanAmbColor(GX_COLOR0, pColor); +} + +void dShpProcBase_c::draw(mVec3_c *pos) { + nw4r::g3d::Draw1Mat1ShpDirectly( + mMat, nw4r::g3d::ResShp(nullptr), mMtx_c::Identity, mMtx_c::Identity, 0, nullptr, nullptr + ); + setupLight(); + if (!field_0x2C) { + BlurAndPaletteManager &mgr = BlurAndPaletteManager::GetInstance(); + u32 code = 0xFF; + if (pos != nullptr) { + pos->y += 100.0f; + code = dBgS::GetInstance()->GetLightingCode(pos); + } + if (code != 0) { + GXSetTevColor(GX_TEVREG0, BlurAndPaletteManager::getLightColor1()); + GXSetTevKColor(GX_KCOLOR0, BlurAndPaletteManager::getLightColor2()); + } else { + GXSetTevColor(GX_TEVREG0, mgr.GetCurrentSph().white2_ffffff); + GXSetTevKColor(GX_KCOLOR0, mgr.GetCurrentSph().grey2_aaaaaa); + } + } +} + +void dShpProcBase_c::setResMat(nw4r::g3d::ResMat mat) { + mMat = mat; +} + +void dShpProcBase_c::setAllFlags() { + for (s32 idx = 0; idx < mCount; idx++) { + mpFlags[idx] = 1; + } +} + +void dShpProcBase_c::doEntry(s32 lightSetId) { + mLightSetId = lightSetId; + entry(); +} + + +bool dShpProc1_c::create(nw4r::g3d::ResMat mat, nw4r::g3d::ResShp shp, s32 count, mHeapAllocator_c *alloc, bool xlu, u32 *pSize) { + if (!m3d::proc_c::create(alloc, pSize)) { + return false; + } + if (!init(mat, shp, count, xlu, pSize)) { + return false; + } + mpTransforms = new mMtx_c[count]; + if (mpTransforms == nullptr) { + return false; + } + if (pSize != nullptr) { + *pSize += count * sizeof(mMtx_c); + } + for (s32 idx = 0; idx < count; idx++) { + MTXIdentity(mpTransforms[idx]); + } + return true; +} + +void dShpProc1_c::draw() { + mMtx_c viewMtx; + getViewMtx(viewMtx); + s32 ctrl = 0; + mMtx_c *pTransforms = mpTransforms; + bool *pFlags = mpFlags; + dShpProcBase_c::draw(nullptr); + for (s32 idx = 0; idx < mCount;) { + if (*pFlags == false) { + mMtx_c mtx; + mtx.copyFrom(*pTransforms); + MTXConcat(viewMtx, mtx, mtx); + mMtx_c mtx2; + mtx2.copyFrom(mtx); + mtx2.fn_802F1C40(0, 1); + nw4r::math::MTX33 mtx3; + for (int a = 0; a < 3; a++) { + for (int b = 0; b < 3; b++) { + mtx3.m[a][b] = mtx2.m[a][b]; + } + } + nw4r::g3d::G3DState::SetViewPosNrmMtxArray(mtx, &mtx3, nullptr); + nw4r::g3d::Draw1Mat1ShpDirectly(nw4r::g3d::ResMat(nullptr), mShp, mtx, mtx2, ctrl, nullptr, nullptr); + if (ctrl == 0) { + ctrl = 2; + } + } + idx++; + pTransforms++; + pFlags++; + } +}