scroll texture interp wrapping

This commit is contained in:
Isaac0-dev 2025-02-24 19:43:38 +10:00
parent 935f871930
commit cf12912bf6

View file

@ -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) { 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)) { for (struct ScrollTarget* scroll = hmap_begin(sScrollTargets); scroll != NULL; scroll = hmap_next(sScrollTargets)) {
if (scroll->needInterp) { if (scroll->needInterp) {
Vtx* *verts = scroll->vertices; Vtx* *verts = scroll->vertices;
if (scroll->bhv < SCROLL_UV_X) { if (scroll->bhv < SCROLL_UV_X) {
u8 bhvIndex = MIN(scroll->bhv, 2); u8 bhvIndex = MIN(scroll->bhv, 2);
for (u16 k = 0; k < scroll->size; k++) { 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 { } else {
u8 bhvIndex = MIN(scroll->bhv-SCROLL_UV_X, 1); u8 bhvIndex = MIN(scroll->bhv-SCROLL_UV_X, 1);
for (u16 k = 0; k < scroll->size; k++) { 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);
} }
} }
} }