diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 5909330b..f8d9a6cc 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -78,6 +78,8 @@ d/d_dylink.cpp: d/d_fader.cpp: .text start:0x80053A30 end:0x80053E70 .ctors start:0x804DB678 end:0x804DB67C + .data start:0x8050D348 end:0x8050D358 + .sbss start:0x80575100 end:0x80575108 d/d_font_manager.cpp: .text start:0x80053E70 end:0x800541EC @@ -283,6 +285,11 @@ d/lyt/d_lyt_fader.cpp: .sdata start:0x80572AA8 end:0x80572AB0 .sdata2 start:0x8057ABC8 end:0x8057ABE0 +d/lyt/d_screen_fader.cpp: + .text start:0x80175BD0 end:0x80175FC4 + .data start:0x80528D68 end:0x80528D90 + .sdata2 start:0x8057ABE0 end:0x8057AC08 + d/a/d_a_player.cpp: .text start:0x801C5C30 end:0x802471F8 .ctors start:0x804DB824 end:0x804DB828 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 16238f2f..0974450f 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2185,12 +2185,12 @@ set__21dDynamicModuleControlFPUsi = .text:0x80053880; // type:function size:0xC do_link__21dDynamicModuleControlCFv = .text:0x80053890; // type:function size:0xA0 do_unlink__21dDynamicModuleControlFv = .text:0x80053930; // type:function size:0x9C __sinit_\d_dylink_cpp = .text:0x800539D0; // type:function size:0x54 scope:local -dFader_c____dt = .text:0x80053A30; // type:function size:0xE4 -dFader_c__create = .text:0x80053B20; // type:function size:0x128 -dFader_c__setFader = .text:0x80053C50; // type:function size:0x198 -fn_80053DF0 = .text:0x80053DF0; // type:function size:0x1C -fn_80053E10 = .text:0x80053E10; // type:function size:0x38 -dFader_c__sinit = .text:0x80053E50; // type:function size:0x20 +__dt__8dFader_cFv = .text:0x80053A30; // type:function size:0xE4 +create__8dFader_cFv = .text:0x80053B20; // type:function size:0x128 +setFader__8dFader_cFl = .text:0x80053C50; // type:function size:0x198 +getColorFaderAlpha__8dFader_cFv = .text:0x80053DF0; // type:function size:0x1C +initForLyt__8dFader_cFv = .text:0x80053E10; // type:function size:0x38 +__sinit_\d_fader_cpp = .text:0x80053E50; // type:function size:0x20 scope:local __ct__10dFontMng_cFv = .text:0x80053E70; // type:function size:0x50 __dt__10dFontMng_cFv = .text:0x80053EC0; // type:function size:0x68 getFont__10dFontMng_cFUc = .text:0x80053F30; // type:function size:0x34 @@ -9830,13 +9830,13 @@ fn_801759B0__11dLytFader_cFv = .text:0x801759B0; // type:function size:0x94 fn_80175A50__11dLytFader_cFv = .text:0x80175A50; // type:function size:0xB8 fn_80175B10__11dLytFader_cFv = .text:0x80175B10; // type:function size:0xA4 fn_80175BC0__11dLytFader_cFl = .text:0x80175BC0; // type:function size:0x10 -fn_80175BD0 = .text:0x80175BD0; // type:function size:0x44 -fn_80175C20 = .text:0x80175C20; // type:function size:0x58 -fn_80175C80 = .text:0x80175C80; // type:function size:0x74 -fn_80175D00 = .text:0x80175D00; // type:function size:0x158 -fn_80175E60 = .text:0x80175E60; // type:function size:0x148 -fn_80175FB0 = .text:0x80175FB0; // type:function size:0x4 -fn_80175FC0 = .text:0x80175FC0; // type:function size:0x4 +__ct__14dScreenFader_cFRC6mColorQ212mFaderBase_c7EStatus = .text:0x80175BD0; // type:function size:0x44 +__dt__14dScreenFader_cFv = .text:0x80175C20; // type:function size:0x58 +setStatus__14dScreenFader_cFQ212mFaderBase_c7EStatus = .text:0x80175C80; // type:function size:0x74 +calc__14dScreenFader_cFv = .text:0x80175D00; // type:function size:0x158 +draw__14dScreenFader_cFv = .text:0x80175E60; // type:function size:0x148 +fadeIn__14dScreenFader_cFv = .text:0x80175FB0; // type:function size:0x4 +fadeOut__14dScreenFader_cFv = .text:0x80175FC0; // type:function size:0x4 fn_80175FD0 = .text:0x80175FD0; // type:function size:0xC8 fn_801760A0 = .text:0x801760A0; // type:function size:0x778 fn_80176820 = .text:0x80176820; // type:function size:0x310 @@ -30699,7 +30699,7 @@ lbl_8050D30C = .data:0x8050D30C; // type:object size:0x14 lbl_8050D320 = .data:0x8050D320; // type:object size:0x10 __vt__21dDynamicModuleControl = .data:0x8050D330; // type:object size:0xC lbl_8050D33C = .data:0x8050D33C; // type:object size:0xC -dFader_c__vtable = .data:0x8050D348; // type:object size:0x10 +__vt__8dFader_c = .data:0x8050D348; // type:object size:0xC lbl_8050D358 = .data:0x8050D358; // type:object size:0x10 data:string lbl_8050D368 = .data:0x8050D368; // type:object size:0x11 data:string lbl_8050D37C = .data:0x8050D37C; // type:object size:0x11 data:string @@ -33504,7 +33504,7 @@ lbl_80528D18 = .data:0x80528D18; // type:object size:0x9 scope:local data:string lbl_80528D24 = .data:0x80528D24; // type:object size:0x9 scope:local data:string lbl_80528D30 = .data:0x80528D30; // type:object size:0xE scope:local data:string __vt__11dLytFader_c = .data:0x80528D40; // type:object size:0x24 -lbl_80528D68 = .data:0x80528D68; // type:object size:0x28 +__vt__14dScreenFader_c = .data:0x80528D68; // type:object size:0x24 lbl_80528D90 = .data:0x80528D90; // type:object size:0x10 lbl_80528DA0 = .data:0x80528DA0; // type:object size:0x168 lbl_80528F08 = .data:0x80528F08; // type:object size:0xC data:string @@ -39748,7 +39748,7 @@ nDMC__4dDyl = .sbss:0x805750EC; // type:object size:0x4 data:4byte cCc_frmHeap__4dDyl = .sbss:0x805750F0; // type:object size:0x4 data:4byte Initialized__4dDyl = .sbss:0x805750F4; // type:object size:0x1 data:byte DVD__4dDyl = .sbss:0x805750F8; // type:object size:0x4 data:4byte -dFader_c__mColorFader = .sbss:0x80575100; // type:object size:0x8 data:byte +mFaderColor = .sbss:0x80575100; // type:object size:0x4 scope:local data:byte @GUARD@getFontPath__10dFontMng_cFUc@TEMP_FONT_NAME = .sbss:0x80575108; // type:object size:0x1 data:byte SOME_GFX_THING = .sbss:0x80575110; // type:object size:0x8 data:4byte lbl_80575118 = .sbss:0x80575118; // type:object size:0x4 data:4byte @@ -47711,11 +47711,11 @@ lbl_8057F418 = .sdata2:0x8057F418; // type:object size:0x4 data:float lbl_8057F41C = .sdata2:0x8057F41C; // type:object size:0x4 data:float lbl_8057F420 = .sdata2:0x8057F420; // type:object size:0x8 data:double lbl_8057F428 = .sdata2:0x8057F428; // type:object size:0x18 data:double -EGG__DrawGX__scColorBlack = .sdata2:0x8057F440; // type:object size:0x4 data:4byte -EGG__DrawGX__scColorWhite = .sdata2:0x8057F444; // type:object size:0x4 data:4byte -EGG__DrawGX__scColorRed = .sdata2:0x8057F448; // type:object size:0x4 data:4byte -EGG__DrawGX__scColorGreen = .sdata2:0x8057F44C; // type:object size:0x4 data:4byte -EGG__DrawGX__scColorBlue = .sdata2:0x8057F450; // type:object size:0x8 data:4byte +BLACK__Q23EGG6DrawGX = .sdata2:0x8057F440; // type:object size:0x4 data:4byte +WHITE__Q23EGG6DrawGX = .sdata2:0x8057F444; // type:object size:0x4 data:4byte +RED__Q23EGG6DrawGX = .sdata2:0x8057F448; // type:object size:0x4 data:4byte +GREEN__Q23EGG6DrawGX = .sdata2:0x8057F44C; // type:object size:0x4 data:4byte +BLUE__Q23EGG6DrawGX = .sdata2:0x8057F450; // type:object size:0x8 data:4byte lbl_8057F458 = .sdata2:0x8057F458; // type:object size:0x8 data:4byte lbl_8057F460 = .sdata2:0x8057F460; // type:object size:0x4 data:float lbl_8057F464 = .sdata2:0x8057F464; // type:object size:0x4 data:float diff --git a/configure.py b/configure.py index 1246e644..b262fa1b 100644 --- a/configure.py +++ b/configure.py @@ -313,6 +313,7 @@ config.libs = [ Object(Matching, "d/d_dvd.cpp"), Object(NonMatching, "d/d_dvd_unk.cpp"), Object(NonMatching, "d/d_dylink.cpp"), + Object(Matching, "d/d_fader.cpp"), Object(Matching, "d/d_font_manager.cpp"), Object(Matching, "d/d_heap.cpp"), Object(Matching, "d/d_rawarchive.cpp"), @@ -355,6 +356,7 @@ config.libs = [ Object(NonMatching, "d/lyt/d_textbox.cpp"), Object(Matching, "d/lyt/d_window.cpp"), Object(Matching, "d/lyt/d_lyt_fader.cpp"), + Object(Matching, "d/lyt/d_screen_fader.cpp"), Object(NonMatching, "d/lyt/common_arrow.cpp"), Object(NonMatching, "d/lyt/pause_disp_00.cpp"), Object(NonMatching, "toBeSorted/file_manager.cpp"), diff --git a/include/d/d_fader.h b/include/d/d_fader.h new file mode 100644 index 00000000..244f0ef2 --- /dev/null +++ b/include/d/d_fader.h @@ -0,0 +1,30 @@ +#ifndef D_FADER_H +#define D_FADER_H + +#include +#include +#include +#include + +class dFader_c : mFader_c { +public: + dFader_c() : mpColorFader(nullptr), mpLytFader(nullptr), mpScreenFader(nullptr) {} + virtual ~dFader_c(); + + bool create(); + bool setFader(s32 fader); + u8 getColorFaderAlpha(); + bool initForLyt(); + +private: + /* 0x08 */ mColorFader_c *mpColorFader; + /* 0x0C */ dLytFader_c *mpLytFader; + /* 0x10 */ dScreenFader_c *mpScreenFader; + /* 0x14 */ UNKWORD field_0x14; + /* 0x18 */ s32 mFadeInType; + /* 0x1C */ s32 mFadeOutType; + /* 0x20 */ u16 field_0x20; + /* 0x22 */ u16 field_0x22; +}; + +#endif diff --git a/include/d/lyt/d_screen_fader.h b/include/d/lyt/d_screen_fader.h new file mode 100644 index 00000000..26e3c388 --- /dev/null +++ b/include/d/lyt/d_screen_fader.h @@ -0,0 +1,22 @@ +#ifndef D_SCREEN_FADER_H +#define D_SCREEN_FADER_H + +#include + +// A fader that closes and opens vertically like a camera shutter with two blades +class dScreenFader_c : public mFaderBase_c { +public: + dScreenFader_c(const mColor &color, EStatus status); + virtual ~dScreenFader_c(); + + virtual void setStatus(EStatus status) override; + virtual bool fadeIn() override; + virtual bool fadeOut() override; + virtual bool calc() override; + virtual void draw() override; + +private: + /* 0x014 */ f32 mProgress; +}; + +#endif diff --git a/include/egg/gfx/eggDrawGX.h b/include/egg/gfx/eggDrawGX.h index 91ce5fc8..c2a89585 100644 --- a/include/egg/gfx/eggDrawGX.h +++ b/include/egg/gfx/eggDrawGX.h @@ -7,15 +7,39 @@ #include #include - namespace EGG { class DrawGX { public: + enum DL { + DL_0, + DL_1, + DL_2, + DL_3, + DL_4, + DL_5, + DL_6, + DL_7, + DL_8, + DL_9, + DL_10, + DL_11, + DL_12, + DL_13, + DL_14, + DL_15, + DL_16, + DL_17, + + DL_MAX + }; + static void Initialize(Heap *); static GXTexMapID GetTexMapDefault(); static void LoadTexture(const EGG::ResTIMG *, GXTexMapID); + static void BeginDrawScreen(bool, bool, bool); + static void DrawDL(enum DL, const nw4r::math::MTX34 &, GXColor); // TODO MORE diff --git a/include/m/m_color.h b/include/m/m_color.h index a5ce85b8..4e021ad6 100644 --- a/include/m/m_color.h +++ b/include/m/m_color.h @@ -4,6 +4,9 @@ #include #include -struct mColor : public nw4r::ut::Color {}; +struct mColor : public nw4r::ut::Color { + mColor() : nw4r::ut::Color() {} + mColor(int red, int green, int blue, int alpha) : nw4r::ut::Color(red, green, blue, alpha) {} +}; #endif diff --git a/src/d/d_fader.cpp b/src/d/d_fader.cpp new file mode 100644 index 00000000..34242d0c --- /dev/null +++ b/src/d/d_fader.cpp @@ -0,0 +1,98 @@ +#include +#include + +static mColor mFaderColor = mColor(200, 200, 200, 0xFF); + +dFader_c::~dFader_c() { + if (mpScreenFader != nullptr) { + delete mpScreenFader; + mpScreenFader = nullptr; + } + if (mpLytFader != nullptr) { + delete mpLytFader; + mpLytFader = nullptr; + } + if (mpColorFader != nullptr) { + delete mpColorFader; + mpColorFader = nullptr; + } +} + +bool dFader_c::create() { + mpColorFader = new mColorFader_c(mColor(0, 0, 0, 0x80), mFaderBase_c::FADED_OUT); + if (!mpColorFader) { + return false; + } + + mpLytFader = new dLytFader_c(mColor(0, 0, 0, 0xFF), mFaderBase_c::FADED_OUT); + if (!mpLytFader) { + return false; + } + + mpScreenFader = new dScreenFader_c(mColor(0, 0, 0, 0xFF), mFaderBase_c::FADED_OUT); + if (!mpScreenFader) { + return false; + } + + mFadeOutType = 0; + mFadeInType = 0; + field_0x20 = 0x1E; + field_0x22 = 0x1E; + setFader(0); + + return true; +} + +bool dFader_c::setFader(s32 fader) { + switch (fader) { + case 0: + if (mFader_c::setFader(mpColorFader)) { + if (mpColorFader->getStatus() == mFaderBase_c::FADED_IN) { + mpColorFader->setColor(mColor(0, 0, 0, 0xFF)); + } + return true; + } + break; + case 1: + if (mFader_c::setFader(mpColorFader)) { + if (mpColorFader->getStatus() == mFaderBase_c::FADED_IN) { + mpColorFader->setColor(mFaderColor); + } + return true; + } + break; + case 2: + if (mFader_c::setFader(mpLytFader)) { + if (mpLytFader->getStatus() == mFaderBase_c::FADED_IN) { + mpLytFader->setColor(mColor(0, 0, 0, 0xFF)); + } + return true; + } + break; + case 3: + if (mFader_c::setFader(mpScreenFader)) { + if (mpScreenFader->getStatus() == mFaderBase_c::FADED_IN) { + mpScreenFader->setColor(mColor(0, 0, 0, 0xFF)); + } + return true; + } + break; + } + + return false; +} + +u8 dFader_c::getColorFaderAlpha() { + if (mpColorFader != nullptr) { + return mpColorFader->mFaderColor.a; + } + return 0xFF; +} + +bool dFader_c::initForLyt() { + bool ok = false; + if (mpLytFader != nullptr) { + ok = mpLytFader->init(); + } + return ok; +} diff --git a/src/d/lyt/d_screen_fader.cpp b/src/d/lyt/d_screen_fader.cpp new file mode 100644 index 00000000..5053861b --- /dev/null +++ b/src/d/lyt/d_screen_fader.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include + +dScreenFader_c::dScreenFader_c(const mColor &color, EStatus status) : mFaderBase_c(color, status), mProgress(0.0f) {} + +dScreenFader_c::~dScreenFader_c() {} + +void dScreenFader_c::setStatus(EStatus status) { + if (status == FADED_OUT) { + mStatus = FADED_OUT; + mProgress = EGG::Screen::GetSizeYMax() * 0.5f; + } else if (status == FADED_IN) { + mStatus = FADED_IN; + mProgress = 0.0f; + } +} + +bool dScreenFader_c::calc() { + bool res = mFaderBase_c::calc(); + + f32 h = EGG::Screen::GetSizeYMax() * 0.5f; + u16 elapsed = mElapsed; + if (elapsed > mFrame) { + elapsed = mFrame; + } + + switch (mStatus) { + case FADING_IN: + mProgress = h - (h * nw4r::math::SinRad((float)elapsed * M_PI / ((float)(mFrame * 2)))); + break; + case FADING_OUT: + mProgress = h - (h * nw4r::math::CosRad((float)elapsed * M_PI / ((float)(mFrame * 2)))); + break; + } + + return res; +} + +extern "C" void fn_80016200(); + +void dScreenFader_c::draw() { + fn_80016200(); + EGG::DrawGX::BeginDrawScreen(false, false, true); + f32 scaleX = EGG::Screen::GetSizeXMax(); + f32 scaleY = EGG::Screen::GetSizeYMax(); + + mMtx_c mtx; + PSMTXScale(mtx, scaleX, mProgress, 1.0f); + PSMTXTransApply(mtx, mtx, -scaleX * 0.5f, scaleY * 0.5f - mProgress, 0.0f); + + GXColor a = EGG::DrawGX::BLACK; + EGG::DrawGX::DrawDL(EGG::DrawGX::DL_17, mtx.nw4rm, a); + + PSMTXScale(mtx, scaleX, mProgress, 1.0f); + PSMTXTransApply(mtx, mtx, -scaleX * 0.5f, -scaleY * 0.5f, 0.0f); + EGG::DrawGX::DrawDL(EGG::DrawGX::DL_17, mtx.nw4rm, a); +} + +bool dScreenFader_c::fadeIn() { + return mFaderBase_c::fadeIn(); +} + +bool dScreenFader_c::fadeOut() { + return mFaderBase_c::fadeOut(); +}