From cf12912bf65dd05901950af7cc2781a3dc706652 Mon Sep 17 00:00:00 2001 From: Isaac0-dev <62234577+Isaac0-dev@users.noreply.github.com> Date: Mon, 24 Feb 2025 19:43:38 +1000 Subject: [PATCH] scroll texture interp wrapping --- src/game/scroll_targets.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/game/scroll_targets.c b/src/game/scroll_targets.c index dcecbcb94..5f34aec21 100644 --- a/src/game/scroll_targets.c +++ b/src/game/scroll_targets.c @@ -116,23 +116,33 @@ void patch_scroll_targets_before(void) { } } -#define SHORT_RANGE 0x7FFF +static inline f32 wrap_f32(f32 val) { + if (val >= 0x8000) { val -= 0x10000; } + if (val <= -0x8000) { val += 0x10000; } + return val; +} + +static inline s32 wrap_s32(s32 val) { + if (val >= 0x8000) { val -= 0x10000; } + if (val <= -0x8000) { val += 0x10000; } + return val; +} void patch_scroll_targets_interpolated(f32 delta) { - f32 antiDelta = 1.0f - delta; - for (struct ScrollTarget* scroll = hmap_begin(sScrollTargets); scroll != NULL; scroll = hmap_next(sScrollTargets)) { if (scroll->needInterp) { Vtx* *verts = scroll->vertices; if (scroll->bhv < SCROLL_UV_X) { u8 bhvIndex = MIN(scroll->bhv, 2); for (u16 k = 0; k < scroll->size; k++) { - verts[k]->n.ob[bhvIndex] = scroll->prevF32[k] * antiDelta + scroll->interpF32[k] * delta; + f32 diff = wrap_f32(scroll->interpF32[k] - scroll->prevF32[k]); + verts[k]->n.ob[bhvIndex] = wrap_f32(scroll->prevF32[k] + diff * delta); } } else { u8 bhvIndex = MIN(scroll->bhv-SCROLL_UV_X, 1); for (u16 k = 0; k < scroll->size; k++) { - verts[k]->n.tc[bhvIndex] = clampf(scroll->prevS16[k] * antiDelta + scroll->interpS16[k] * delta, -SHORT_RANGE, SHORT_RANGE); + s32 diff = wrap_s32(scroll->interpS16[k] - scroll->prevS16[k]); + verts[k]->n.tc[bhvIndex] = wrap_s32(scroll->prevS16[k] + diff * delta); } } }