Fix and properly align font, handle most 3D screen positions.

This commit is contained in:
Skyth 2025-01-04 18:39:23 +03:00
parent 22e5855b7a
commit b0a43559bb
2 changed files with 65 additions and 24 deletions

View file

@ -170,9 +170,6 @@ static void ComputeOffsets(float width, float height)
g_offsetX = 0.0f; g_offsetX = 0.0f;
g_offsetY = 0.5f * (1280.0f / aspectRatio - 720.0f); g_offsetY = 0.5f * (1280.0f / aspectRatio - 720.0f);
} }
*reinterpret_cast<be<float>*>(g_memory.Translate(0x8339C5D0)) = g_offsetX / 1280.0f;
*reinterpret_cast<be<float>*>(g_memory.Translate(0x8339C5D4)) = g_offsetY / 720.0f;
} }
static class SDLEventListenerForCSD : public SDLEventListener static class SDLEventListenerForCSD : public SDLEventListener
@ -180,19 +177,37 @@ static class SDLEventListenerForCSD : public SDLEventListener
public: public:
void OnSDLEvent(SDL_Event* event) override void OnSDLEvent(SDL_Event* event) override
{ {
if (!App::s_isInit || event->type != SDL_WINDOWEVENT || event->window.event != SDL_WINDOWEVENT_RESIZED) if (event->type == SDL_WINDOWEVENT && event->window.event == SDL_WINDOWEVENT_RESIZED)
return; ComputeOffsets(event->window.data1, event->window.data2);
ComputeOffsets(event->window.data1, event->window.data2);
} }
} g_sdlEventListenerForCSD; } g_sdlEventListenerForCSD;
// Chao::CSD::SetOffsets // Chao::CSD::SetOffsets
PPC_FUNC_IMPL(__imp__sub_830C0A78);
PPC_FUNC(sub_830C0A78) PPC_FUNC(sub_830C0A78)
{ {
__imp__sub_830C0A78(ctx, base);
ComputeOffsets(GameWindow::s_width, GameWindow::s_height); ComputeOffsets(GameWindow::s_width, GameWindow::s_height);
} }
// SWA::CGameDocument::ComputeScreenPosition
PPC_FUNC_IMPL(__imp__sub_8250FC70);
PPC_FUNC(sub_8250FC70)
{
__imp__sub_8250FC70(ctx, base);
auto position = reinterpret_cast<be<float>*>(base + ctx.r3.u32);
position[0] = position[0] - g_offsetX;
position[1] = position[1] - g_offsetY;
}
void ComputeScreenPositionMidAsmHook(PPCRegister& f1, PPCRegister& f2)
{
f1.f64 -= g_offsetX;
f2.f64 -= g_offsetY;
}
enum enum
{ {
ALIGN_CENTER = 0 << 0, ALIGN_CENTER = 0 << 0,
@ -419,27 +434,25 @@ static void Draw(PPCContext& ctx, uint8_t* base, PPCFunc* original, uint32_t str
if ((flags & STRETCH_HORIZONTAL) != 0) if ((flags & STRETCH_HORIZONTAL) != 0)
{ {
offsetX = -g_offsetX;
scaleX = backBuffer->width / 1280.0f; scaleX = backBuffer->width / 1280.0f;
} }
else else
{ {
if ((flags & ALIGN_LEFT) != 0) if ((flags & ALIGN_RIGHT) != 0)
offsetX = -g_offsetX; offsetX = g_offsetX * 2.0f;
else if ((flags & ALIGN_RIGHT) != 0) else if ((flags & ALIGN_LEFT) == 0)
offsetX = g_offsetX; offsetX = g_offsetX;
} }
if ((flags & STRETCH_VERTICAL) != 0) if ((flags & STRETCH_VERTICAL) != 0)
{ {
offsetY = -g_offsetY;
scaleY = backBuffer->height / 720.0f; scaleY = backBuffer->height / 720.0f;
} }
else else
{ {
if ((flags & ALIGN_TOP) != 0) if ((flags & ALIGN_BOTTOM) != 0)
offsetY = -g_offsetY; offsetY = g_offsetY * 2.0f;
else if ((flags & ALIGN_BOTTOM) != 0) else if ((flags & ALIGN_TOP) == 0)
offsetY = g_offsetY; offsetY = g_offsetY;
} }
@ -447,8 +460,8 @@ static void Draw(PPCContext& ctx, uint8_t* base, PPCFunc* original, uint32_t str
{ {
auto position = reinterpret_cast<be<float>*>(stack + i * stride); auto position = reinterpret_cast<be<float>*>(stack + i * stride);
float x = (position[0] + offsetX) * scaleX; float x = offsetX + position[0] * scaleX;
float y = (position[1] + offsetY) * scaleY; float y = offsetY + position[1] * scaleY;
position[0] = round(x / backBuffer->width * GameWindow::s_width) / GameWindow::s_width * backBuffer->width; position[0] = round(x / backBuffer->width * GameWindow::s_width) / GameWindow::s_width * backBuffer->width;
position[1] = round(y / backBuffer->height * GameWindow::s_height) / GameWindow::s_height * backBuffer->height; position[1] = round(y / backBuffer->height * GameWindow::s_height) / GameWindow::s_height * backBuffer->height;
@ -473,16 +486,34 @@ PPC_FUNC(sub_825E2E88)
Draw(ctx, base, __imp__sub_825E2E88, 0xC); Draw(ctx, base, __imp__sub_825E2E88, 0xC);
} }
// Hedgehog::MirageDebug::SetScissorRect
PPC_FUNC_IMPL(__imp__sub_82E16C70);
PPC_FUNC(sub_82E16C70)
{
auto backBuffer = Video::GetBackBuffer();
auto scissorRect = reinterpret_cast<GuestRect*>(base + ctx.r4.u32);
scissorRect->left = scissorRect->left + g_offsetX;
scissorRect->top = scissorRect->top + g_offsetY;
scissorRect->right = scissorRect->right + g_offsetX;
scissorRect->bottom = scissorRect->bottom + g_offsetY;
__imp__sub_82E16C70(ctx, base);
}
// Hedgehog::MirageDebug::CPrimitive2D::Draw // Hedgehog::MirageDebug::CPrimitive2D::Draw
PPC_FUNC_IMPL(__imp__sub_830D1EF0); PPC_FUNC_IMPL(__imp__sub_830D1EF0);
PPC_FUNC(sub_830D1EF0) PPC_FUNC(sub_830D1EF0)
{ {
ctx.r1.u32 -= 8;
auto stack = reinterpret_cast<be<uint32_t>*>(base + ctx.r1.u32);
auto backBuffer = Video::GetBackBuffer();
stack[0] = backBuffer->width;
stack[1] = backBuffer->height;
ctx.r5.u32 = ctx.r1.u32;
__imp__sub_830D1EF0(ctx, base); __imp__sub_830D1EF0(ctx, base);
ctx.r1.u32 += 8;
auto backBuffer = Video::GetBackBuffer();
auto position = reinterpret_cast<be<float>*>(base + ctx.r4.u32);
for (size_t i = 0; i < 4; i++)
{
position[0] = position[0] * 1280.0f / backBuffer->width;
position[1] = position[1] * 720.0f / backBuffer->height;
position += 7;
}
} }

View file

@ -610,3 +610,13 @@ registers = ["r10", "r27"]
name = "RenderCsdCastMidAsmHook" name = "RenderCsdCastMidAsmHook"
address = 0x830C6A98 address = 0x830C6A98
registers = ["r4"] registers = ["r4"]
[[midasm_hook]]
name = "ComputeScreenPositionMidAsmHook"
address = 0x82923204
registers = ["f1", "f2"]
[[midasm_hook]]
name = "ComputeScreenPositionMidAsmHook"
address = 0x82AD7914
registers = ["f1", "f2"]