metaforce/Runtime/GuiSys/CSplashScreen.cpp

89 lines
2.5 KiB
C++
Raw Normal View History

#include "Runtime/GuiSys/CSplashScreen.hpp"
#include <array>
#include "Runtime/CArchitectureMessage.hpp"
#include "Runtime/CArchitectureQueue.hpp"
#include "Runtime/CSimplePool.hpp"
#include "Runtime/GameGlobalObjects.hpp"
#include "Runtime/Camera/CCameraFilter.hpp"
2016-09-12 22:36:21 -07:00
2021-04-10 01:42:06 -07:00
namespace metaforce {
2016-09-12 22:36:21 -07:00
constexpr std::array SplashTextures{"TXTR_NintendoLogo"sv, "TXTR_RetroLogo"sv, "TXTR_DolbyLogo"sv};
2016-09-12 22:36:21 -07:00
CSplashScreen::CSplashScreen(ESplashScreen which)
2018-12-07 21:30:43 -08:00
: CIOWin("SplashScreen")
, x14_which(which)
2022-02-04 18:23:15 -08:00
, m_texture(g_SimplePool->GetObj(SplashTextures[size_t(which)])) {}
2016-09-12 22:36:21 -07:00
2018-12-07 21:30:43 -08:00
CIOWin::EMessageReturn CSplashScreen::OnMessage(const CArchitectureMessage& msg, CArchitectureQueue& queue) {
switch (msg.GetType()) {
case EArchMsgType::TimerTick: {
if (!x25_textureLoaded) {
2022-02-04 18:23:15 -08:00
if (!m_texture.IsLoaded())
2018-12-07 21:30:43 -08:00
return EMessageReturn::Exit;
x25_textureLoaded = true;
}
2016-09-12 22:36:21 -07:00
2018-12-07 21:30:43 -08:00
float dt = MakeMsg::GetParmTimerTick(msg).x4_parm;
x18_splashTimeout -= dt;
2016-09-12 22:36:21 -07:00
2018-12-07 21:30:43 -08:00
if (x18_splashTimeout <= 0.f) {
/* HACK: If we're not compiling with Intel's IPP library we want to skip the Dolby Pro Logic II logo
* This is purely a URDE addition and does not reflect retro's intentions. - Phil
*/
#if INTEL_IPP
2018-12-07 21:30:43 -08:00
if (x14_which != ESplashScreen::Dolby)
#else
2018-12-07 21:30:43 -08:00
if (x14_which != ESplashScreen::Retro)
#endif
2018-12-07 21:30:43 -08:00
queue.Push(MakeMsg::CreateCreateIOWin(EArchMsgTarget::IOWinManager, 9999, 9999,
std::make_shared<CSplashScreen>(ESplashScreen(int(x14_which) + 1))));
return EMessageReturn::RemoveIOWinAndExit;
2016-09-12 22:36:21 -07:00
}
2018-12-07 21:30:43 -08:00
break;
}
default:
break;
}
return EMessageReturn::Exit;
2016-09-12 22:36:21 -07:00
}
void CSplashScreen::Draw() {
if (!x25_textureLoaded) {
2018-12-07 21:30:43 -08:00
return;
}
2019-07-21 01:42:52 -07:00
SCOPED_GRAPHICS_DEBUG_GROUP("CSplashScreen::Draw", zeus::skGreen);
2016-09-12 22:36:21 -07:00
2018-12-07 21:30:43 -08:00
zeus::CColor color;
if (x14_which == ESplashScreen::Nintendo) {
2018-12-07 21:30:43 -08:00
color = zeus::CColor{0.86f, 0.f, 0.f, 1.f};
}
2016-09-12 22:36:21 -07:00
if (x18_splashTimeout > 1.5f) {
2018-12-07 21:30:43 -08:00
color.a() = 1.f - (x18_splashTimeout - 1.5f) * 2.f;
} else if (x18_splashTimeout < 0.5f) {
2018-12-07 21:30:43 -08:00
color.a() = x18_splashTimeout * 2.f;
}
2016-09-12 22:36:21 -07:00
2018-12-07 21:30:43 -08:00
zeus::CRectangle rect;
2022-02-04 18:23:15 -08:00
rect.size.x() = m_texture->GetWidth() / (480.f * g_Viewport.aspect);
rect.size.y() = m_texture->GetHeight() / 480.f;
2018-12-07 21:30:43 -08:00
rect.position.x() = 0.5f - rect.size.x() / 2.f;
rect.position.y() = 0.5f - rect.size.y() / 2.f;
2016-09-13 22:54:09 -07:00
2022-02-15 21:21:24 -08:00
aurora::gfx::queue_textured_quad(
aurora::gfx::CameraFilterType::Blend,
2022-02-17 16:38:31 -08:00
m_texture->GetTexture(),
2022-02-15 21:21:24 -08:00
aurora::gfx::ZTest::Always,
false,
2022-02-04 18:23:15 -08:00
color,
1.f,
rect,
0.f
);
2016-09-12 22:36:21 -07:00
}
2021-04-10 01:42:06 -07:00
} // namespace metaforce