From d7c550ea62edb5bee51da529d91a704a4a645b48 Mon Sep 17 00:00:00 2001 From: Nunuhara Cabbage Date: Fri, 26 Jul 2024 20:28:55 -0700 Subject: [PATCH] parts: fix GetPartsUpperLeftPos{X,Y} Hitbox is stored in local coordinates. These functions return global coordinates. --- src/parts/input.c | 8 +++----- src/parts/parts.c | 12 ++++++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/parts/input.c b/src/parts/input.c index 767707b..f85f1da 100644 --- a/src/parts/input.c +++ b/src/parts/input.c @@ -178,13 +178,11 @@ bool PE_IsCursorIn(int parts_no, int mouse_x, int mouse_y, int state) if (!parts) return false; - // TODO: this could be cached Rectangle hitbox = parts->states[state].common.hitbox; - for (struct parts *parent = parts->parent; parent; parent = parent->parent) { - hitbox.x += parent->local.pos.x; - hitbox.y += parent->local.pos.y; + if (parts->parent) { + hitbox.x += parts->parent->global.pos.x; + hitbox.y += parts->parent->global.pos.y; } - Point mouse_pos = { mouse_x, mouse_y }; return SDL_PointInRect(&mouse_pos, &hitbox); } diff --git a/src/parts/parts.c b/src/parts/parts.c index f3c7b80..f091c52 100644 --- a/src/parts/parts.c +++ b/src/parts/parts.c @@ -1441,14 +1441,22 @@ int PE_GetPartsUpperLeftPosX(int parts_no, int state) { if (!parts_state_valid(--state)) return 0; - return parts_get(parts_no)->states[state].common.hitbox.x; + struct parts *parts = parts_get(parts_no); + int x = parts->states[state].common.hitbox.x; + if (parts->parent) + x += parts->parent->global.pos.x; + return x; } int PE_GetPartsUpperLeftPosY(int parts_no, int state) { if (!parts_state_valid(--state)) return 0; - return parts_get(parts_no)->states[state].common.hitbox.y; + struct parts *parts = parts_get(parts_no); + int y = parts->states[state].common.hitbox.y; + if (parts->parent) + y += parts->parent->global.pos.y; + return y; } int PE_GetPartsZ(int parts_no)