mirror of https://github.com/PrimeDecomp/prime.git
252 lines
8.5 KiB
C++
252 lines
8.5 KiB
C++
#include "MetroidPrime/CCredits.hpp"
|
|
|
|
#include "MetroidPrime/CArchitectureMessage.hpp"
|
|
#include "MetroidPrime/Cameras/CCameraFilterPass.hpp"
|
|
#include "MetroidPrime/Decode.hpp"
|
|
#include "MetroidPrime/Tweaks/CTweakGui.hpp"
|
|
|
|
#include "GuiSys/CGuiTextSupport.hpp"
|
|
#include "GuiSys/CGuiWidget.hpp"
|
|
|
|
|
|
#include "Kyoto/CResFactory.hpp"
|
|
#include "Kyoto/Graphics/CGraphics.hpp"
|
|
#include "Kyoto/Graphics/CMoviePlayer.hpp"
|
|
#include "Kyoto/Text/CRasterFont.hpp"
|
|
#include "Kyoto/Text/CStringTable.hpp"
|
|
|
|
#include "MetaRender/CCubeRenderer.hpp"
|
|
|
|
#include "rstl/math.hpp"
|
|
|
|
bool CCredits::GetIsContinueDraw() const { return false; }
|
|
|
|
CCredits::CCredits()
|
|
: CIOWin("Credits")
|
|
, x18_creditsTable(gpSimplePool->GetObj(gpTweakGui->GetCreditsTable().data()))
|
|
, x20_creditsFont(gpSimplePool->GetObj(gpTweakGui->GetJapaneseCreditsFont().data()))
|
|
, x54_(gpTweakGui->GetCredits_x30c()) {
|
|
// x18_creditsTable.Lock();
|
|
// x20_creditsFont.Lock();
|
|
}
|
|
|
|
CCredits::~CCredits() {}
|
|
|
|
CIOWin::EMessageReturn CCredits::OnMessage(const CArchitectureMessage& msg,
|
|
CArchitectureQueue& queue) {
|
|
switch (msg.GetType()) {
|
|
case kAM_UserInput: {
|
|
return ProcessUserInput(MakeMsg::GetParmUserInput(msg).GetUserInput());
|
|
break;
|
|
case kAM_TimerTick: {
|
|
return Update(MakeMsg::GetParmTimerTick(msg).GetReal(), queue);
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return kMR_Normal;
|
|
}
|
|
|
|
CIOWin::EMessageReturn CCredits::Update(float dt, CArchitectureQueue& queue) {
|
|
switch (x14_) {
|
|
case 0: {
|
|
if (!x18_creditsTable.IsLoaded() || !x20_creditsFont.IsLoaded()) {
|
|
return kMR_Exit;
|
|
}
|
|
if (x30_text.empty()) {
|
|
for (int i = 0; i < x18_creditsTable->GetStringCount(); ++i) {
|
|
x30_text.push_back(rstl::pair< rstl::single_ptr< CGuiTextSupport >, CVector2i >(
|
|
rs_new CGuiTextSupport(
|
|
gpResourceFactory->GetResourceIdByName(gpTweakGui->GetCreditsFont().data())->mId,
|
|
CGuiTextProperties(true, true, kJustification_Center, kVerticalJustification_Top),
|
|
gpTweakGui->GetCreditsTextFontColor(), gpTweakGui->GetCreditsTextBorderColor(),
|
|
CColor::White(), CGraphics::GetViewport().mWidth - 64, 0, gpSimplePool,
|
|
CGuiWidget::kGMDF_Alpha),
|
|
CVector2i(0, 0)));
|
|
// x30_text.back().first->SetText(x18_creditsTable->GetString(i));
|
|
}
|
|
|
|
// auto tmp = std::make_pair(std::make_unique<CGuiTextSupport>(
|
|
// gpResourceFactory->GetResourceIdByName(gpTweakGui->GetCreditsFont())->mId,
|
|
// CGuiTextProperties(true, true, kJ_Center,
|
|
// EVerticalJustification::Top),
|
|
// gpTweakGui->GetCreditsTextFontColor(),
|
|
// gpTweakGui->GetCreditsTextBorderColor(),
|
|
// CColor::White(), g_Viewport.x8_width
|
|
// - 64, 0, gpSimplePool,
|
|
// CGuiWidget::EGuiModelDrawFlags::Alpha),
|
|
// CVector2i(0, 0));
|
|
// tmp.first->SetText(
|
|
// "\n&push;&font=C29C51F1;&main-color=#89D6FF;URDE DEVELOPMENT TEAM&pop;\n"
|
|
// "&push;&main-color=#89D6FF;LEAD REVERSE ENGINEERING TEAM&pop\n;"
|
|
// "Jack \"Cirrus\" Andersen\n"
|
|
// "Phillip \"Antidote\" Stephens\n"
|
|
// "Luke \"encounter\" Street\n\n"
|
|
// "&push;&main-color=#89D6FF;C++ COMPLIANCE & CLEANUP&pop;\n"
|
|
// "Lioncache\n");
|
|
// x30_text.insert(x30_text.end() - 1, std::move(tmp));
|
|
// x30_text.back().first->SetOutlineColor(gpTweakGui->GetCreditsTextBorderColor());
|
|
}
|
|
|
|
// for (const auto& [text, offset] : x30_text) {
|
|
// if (!text->GetIsTextSupportFinishedLoading()) {
|
|
// return kMR_Exit;
|
|
// }
|
|
// }
|
|
|
|
// int scaleY = 0;
|
|
// for (auto& [text, offset] : x30_text) {
|
|
// auto bounds = text->GetBounds();
|
|
// offset.y = (bounds.second.y - bounds.first.y);
|
|
// offset.x = scaleY;
|
|
// text->SetExtentX(CGraphics::GetViewportWidth() - 1280);
|
|
// text->SetExtentY((bounds.second.y - bounds.first.y));
|
|
// scaleY += (bounds.second.y - bounds.first.y);
|
|
// }
|
|
|
|
// x4c_ = float(scaleY + CGraphics::GetViewportHeight() - 896); // * 0.5f;
|
|
// const float divVal = rstl::max_val(gpTweakGui->x310_, gpTweakGui->x30c_);
|
|
// x50_ = x4c_ / (gpTweakGui->x308_ - divVal);
|
|
x14_ = 1;
|
|
break;
|
|
}
|
|
case 1: {
|
|
if (x28_moviePlayer.null()) {
|
|
x28_moviePlayer = rs_new CMoviePlayer("Video/creditBG.thp", 0.f, true, true);
|
|
}
|
|
x14_ = 2;
|
|
break;
|
|
}
|
|
case 2: {
|
|
// if (x2c_.null()) {
|
|
// x2c_ = rs_new CStaticAudioPlayer("Audio/ending3.rsf", 0, 0x5d7c00);
|
|
// }
|
|
// if (!x2c_->IsReady()) {
|
|
// return kMR_Exit;
|
|
// }
|
|
// x2c_->SetVolume(1.f);
|
|
// x2c_->StartMixing();
|
|
x14_ = 3;
|
|
}
|
|
// [[fallthrough]];
|
|
case 3: {
|
|
// if (!x28_moviePlayer->PumpIndexLoad())
|
|
// break;
|
|
x28_moviePlayer->Update(dt);
|
|
if (x5c_24_) {
|
|
x5c_28_ = true;
|
|
if (x5c_27_) {
|
|
x5c_27_ = false;
|
|
x58_ = gpTweakGui->GetCredits_x310() - x58_;
|
|
}
|
|
}
|
|
if (x5c_27_ || x5c_28_) {
|
|
x58_ = CMath::Clamp(0.f, x58_ + dt, gpTweakGui->GetCredits_x310());
|
|
if (x58_ == gpTweakGui->GetCredits_x310()) {
|
|
if (x5c_27_) {
|
|
x5c_27_ = false;
|
|
x58_ = 0.f;
|
|
} else if (x5c_28_) {
|
|
x5c_25_ = true;
|
|
}
|
|
}
|
|
|
|
if (x58_ != 0.f && x5c_28_) {
|
|
const float volume = CMath::Clamp(0.f, 1.f - x58_ / gpTweakGui->GetCredits_x310(), 1.f);
|
|
// x2c_->SetVolume(volume);
|
|
}
|
|
}
|
|
x48_ = rstl::min_val(x4c_, (dt * x50_) + x48_);
|
|
|
|
if (x48_ == x4c_ || x5c_24_) {
|
|
x5c_24_ = true;
|
|
x54_ = rstl::max_val(0.f, x54_ - dt);
|
|
const float alpha = x54_ / gpTweakGui->GetCredits_x30c();
|
|
// for (const auto& [text, offset] : x30_text) {
|
|
// CColor col = CColor::White();
|
|
// col.a() *= alpha;
|
|
// text->SetGeometryColor(col);
|
|
// }
|
|
if (x54_ <= 0.f) {
|
|
x5c_26_ = true;
|
|
}
|
|
}
|
|
|
|
if (x5c_26_ && x5c_25_) {
|
|
// queue.Push(MakeMsg::CreateCreateIOWin(
|
|
// EArchMsgTarget::IOWinManager, 12, 11,
|
|
// std::make_shared< CPlayMovie >(CPlayMovie::EWhichMovie::AfterCredits)));
|
|
return kMR_RemoveIOWinAndExit;
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return kMR_Exit;
|
|
}
|
|
|
|
CIOWin::EMessageReturn CCredits::ProcessUserInput(const CFinalInput& input) {
|
|
if (input.DA()) {
|
|
x48_ = CMath::Clamp(0.f, x48_ - ((x50_ * input.Time())), x4c_);
|
|
} else {
|
|
float leftY = input.ALAUp();
|
|
float offset = 0.f;
|
|
if (leftY < 0.f) {
|
|
offset = -leftY;
|
|
leftY = 0.f;
|
|
}
|
|
x48_ = CMath::Clamp(0.f, x48_ - (leftY - offset) * 10.f * x50_ * input.Time(), x4c_);
|
|
}
|
|
return kMR_Exit;
|
|
}
|
|
|
|
void CCredits::DrawText(CGuiTextSupport& text, const CVector3f& translation) {
|
|
CGraphics::SetCullMode(kCM_None);
|
|
gpRender->SetViewportOrtho(true, -4096.f, 4096.f);
|
|
gpRender->SetModelMatrix(CTransform4f::Translate(translation));
|
|
gpRender->SetDepthReadWrite(false, false);
|
|
text.Render();
|
|
}
|
|
|
|
void CCredits::Draw() const {
|
|
if (x14_ != 3) {
|
|
return;
|
|
}
|
|
DrawVideo();
|
|
DrawText();
|
|
}
|
|
|
|
void CCredits::DrawText() const {
|
|
// float width = 896.f * CGraphics::GetViewportAspect();
|
|
// CGraphics::SetOrtho(0.f, width, 896.f, 0.f, -4096.f, 4096.f);
|
|
// auto region = std::make_pair(CVector2f{0.f, 0.f}, CVector2f{width, 896.f});
|
|
// CGraphics::SetViewPointMatrix(CTransform4f());
|
|
// CGraphics::SetModelMatrix(CTransform4f::Translate((width - 1280.f) / 2.f, 0.f, 896.f));
|
|
// float dVar5 = (x48_ - (region.second.y() - region.first.y()));
|
|
// for (const auto& [text, offset] : x30_text) {
|
|
// if (offset.y + offset.x >= dVar5 && offset.x <= x48_) {
|
|
// DrawText(*text, {0.5f * (region.second.x() - text->GetExtentX()), 0.f, x48_ - offset.x});
|
|
// }
|
|
// }
|
|
// CCameraFilterPass::DrawFilter(EFilterType::Multiply, EFilterShape::CinemaBars, skBlack,
|
|
// nullptr,
|
|
// 1.f);
|
|
}
|
|
|
|
void CCredits::DrawVideo() const {
|
|
/* Render movie */
|
|
if (x28_moviePlayer.get() && x28_moviePlayer->DrawVideo() && (x5c_27_ || x5c_28_)) {
|
|
float alpha = x58_ / gpTweakGui->GetCredits_x310();
|
|
if (x5c_27_) {
|
|
alpha = 1.f - alpha;
|
|
}
|
|
|
|
alpha = CMath::Clamp(0.f, alpha, 1.f);
|
|
CColor filterCol = CColor::Black().WithAlphaOf(alpha);
|
|
CCameraFilterPass::DrawFilter(CCameraFilterPass::kFT_Blend, CCameraFilterPass::kFS_Fullscreen,
|
|
filterCol, nullptr, 1.f);
|
|
}
|
|
}
|