From 666f93843d7118782284b36cffa12fdf6747d55f Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Thu, 16 Jan 2025 15:08:48 +0000 Subject: [PATCH] Calculate movie aspect ratio using vertices (#84) --- UnleashedRecomp/api/SWA/Movie/MovieDisplayer.h | 15 +++++++++++++++ UnleashedRecomp/patches/video_patches.cpp | 12 ++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/UnleashedRecomp/api/SWA/Movie/MovieDisplayer.h b/UnleashedRecomp/api/SWA/Movie/MovieDisplayer.h index 64e13e3..229d23e 100644 --- a/UnleashedRecomp/api/SWA/Movie/MovieDisplayer.h +++ b/UnleashedRecomp/api/SWA/Movie/MovieDisplayer.h @@ -7,8 +7,23 @@ namespace SWA class CMovieDisplayer : public Hedgehog::Universe::CUpdateUnit, public Hedgehog::Mirage::CRenderable { public: + struct SVertexData + { + be X; + be Y; + be Z; + be U; + be V; + }; + SWA_INSERT_PADDING(0x04); be m_MovieWidth; be m_MovieHeight; + SWA_INSERT_PADDING(0x74); + SVertexData m_TopLeft; + SVertexData m_TopRight; + SVertexData m_BottomRight; + SVertexData m_BottomLeft; + SWA_INSERT_PADDING(0xF0); }; } diff --git a/UnleashedRecomp/patches/video_patches.cpp b/UnleashedRecomp/patches/video_patches.cpp index 04fde68..e708319 100644 --- a/UnleashedRecomp/patches/video_patches.cpp +++ b/UnleashedRecomp/patches/video_patches.cpp @@ -8,16 +8,20 @@ using SVertexData = SWA::Sequence::Utility::CPlayMovieWrapper::CRender::SVertexD PPC_FUNC_IMPL(__imp__sub_82AE30D8); PPC_FUNC(sub_82AE30D8) { - auto movieWidth = *(be*)g_memory.Translate(ctx.r4.u32 - 0x10); - auto movieHeight = *(be*)g_memory.Translate(ctx.r4.u32 - 0x0C); - auto movieAspectRatio = movieWidth / movieHeight; - auto windowAspectRatio = (float)GameWindow::s_width / (float)GameWindow::s_height; + auto pViewportWidth = (be*)g_memory.Translate(ctx.r4.u32 + 0x14); + auto pViewportHeight = (be*)g_memory.Translate(ctx.r4.u32 + 0x18); auto pTopLeft = (SVertexData*)g_memory.Translate(ctx.r4.u32 + 0x6C); auto pTopRight = (SVertexData*)g_memory.Translate(ctx.r4.u32 + 0x6C + sizeof(SVertexData)); auto pBottomRight = (SVertexData*)g_memory.Translate(ctx.r4.u32 + 0x6C + sizeof(SVertexData) * 2); auto pBottomLeft = (SVertexData*)g_memory.Translate(ctx.r4.u32 + 0x6C + sizeof(SVertexData) * 3); + auto quadWidth = std::fabs(pTopRight->X - pTopLeft->X) * ((float)*pViewportWidth / 2); + auto quadHeight = std::fabs(pTopLeft->Y - pBottomLeft->Y) * ((float)*pViewportHeight / 2); + + auto movieAspectRatio = quadWidth / quadHeight; + auto windowAspectRatio = (float)GameWindow::s_width / (float)GameWindow::s_height; + auto a = -1.00078f; auto b = 1.00139f; auto scaleU = 1.0f;