#include "CSplashScreen.hpp" #include "CArchitectureMessage.hpp" #include "CArchitectureQueue.hpp" #include "CSimplePool.hpp" #include "GameGlobalObjects.hpp" namespace urde { static const char* SplashTextures[] { "TXTR_NintendoLogo", "TXTR_RetroLogo", "TXTR_DolbyLogo" }; CSplashScreen::CSplashScreen(ESplashScreen which) : CIOWin("SplashScreen"), x14_which(which), m_quad(EFilterType::Blend, g_SimplePool->GetObj(SplashTextures[int(which)])) { } CIOWin::EMessageReturn CSplashScreen::OnMessage(const CArchitectureMessage& msg, CArchitectureQueue& queue) { switch (msg.GetType()) { case EArchMsgType::TimerTick: { if (!x25_textureLoaded) { if (!m_quad.GetTex().IsLoaded()) return EMessageReturn::Exit; x25_textureLoaded = true; } float dt = MakeMsg::GetParmTimerTick(msg).x4_parm; x18_splashTimeout -= dt; if (x18_splashTimeout <= 0.f) { if (x14_which != ESplashScreen::Retro) queue.Push(MakeMsg::CreateCreateIOWin(EArchMsgTarget::IOWinManager, 9999, 9999, std::make_shared(ESplashScreen(int(x14_which) + 1)))); return EMessageReturn::RemoveIOWinAndExit; } break; } default: break; } return EMessageReturn::Exit; } void CSplashScreen::Draw() const { if (!x25_textureLoaded) return; zeus::CColor color; if (x14_which == ESplashScreen::Nintendo) color = zeus::CColor{0.86f, 0.f, 0.f, 1.f}; if (x18_splashTimeout > 1.5f) color.a = 1.f - (x18_splashTimeout - 1.5f) * 2.f; else if (x18_splashTimeout < 0.5f) color.a = x18_splashTimeout * 2.f; zeus::CRectangle rect; float aspect = g_Viewport.x8_width / float(g_Viewport.xc_height); rect.size.x = m_quad.GetTex()->GetWidth() / (480.f * aspect); rect.size.y = m_quad.GetTex()->GetHeight() / 480.f; rect.position.x = 0.5f - rect.size.x / 2.f; rect.position.y = 0.5f - rect.size.y / 2.f; const_cast(m_quad).draw(color, 1.f, rect); } }