diff --git a/src/render/animation.zig b/src/render/animation.zig index 074f643..dd5205b 100644 --- a/src/render/animation.zig +++ b/src/render/animation.zig @@ -739,6 +739,19 @@ pub const ColorTransition = struct { .a = lerpU8(self.current.a, target.a, t), }; + // EPSILON FIX: Forzar convergencia cuando estamos "suficientemente cerca" + // Sin esto, lerpU8 trunca incrementos <1 y la animación nunca termina. + // Umbral de 1 es imperceptible al ojo pero garantiza convergencia. + const dr = @abs(@as(i16, self.current.r) - @as(i16, target.r)); + const dg = @abs(@as(i16, self.current.g) - @as(i16, target.g)); + const db = @abs(@as(i16, self.current.b) - @as(i16, target.b)); + const da = @abs(@as(i16, self.current.a) - @as(i16, target.a)); + + if (dr <= 1 and dg <= 1 and db <= 1 and da <= 1) { + self.current = target; // Snap al target + return false; // Animación terminada + } + return true; }