From 31651dc96a9721db11099aba34dae18d98be46d1 Mon Sep 17 00:00:00 2001 From: Szymon Nowakowski Date: Wed, 7 Jan 2026 13:54:32 +0100 Subject: [PATCH] Integer lerp and unlerp --- packages/vecmath/src/root.zig | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/vecmath/src/root.zig b/packages/vecmath/src/root.zig index 10e49f5..7c22415 100644 --- a/packages/vecmath/src/root.zig +++ b/packages/vecmath/src/root.zig @@ -78,8 +78,34 @@ pub const cossin_x8 = trig.cossin_x8; // ----------------------------------------------------------------------------- -pub inline fn lerp(comptime T: type, a: T, b: T, t: T) T { - return @mulAdd(T, t, b, @mulAdd(T, -t, a, a)); +pub inline fn lerp(a: f32, b: f32, t: f32) f32 { + return @mulAdd(f32, t, b, @mulAdd(f32, -t, a, a)); +} + +pub inline fn lerpInt(a: i32, b: i32, t: f32) i32 { + const ab = b - a; + const ab_float: f32 = @floatFromInt(ab); + const d: i32 = @intFromFloat(@round(t * ab_float)); + return a + d; +} + +pub inline fn lerpInt64(a: i64, b: i64, t: f32) i64 { + const ab = b - a; + const ab_float: f32 = @floatFromInt(ab); + const d: i64 = @intFromFloat(@round(t * ab_float)); + return a + d; +} + +pub inline fn unlerp(a: f32, b: f32, x: f32) f32 { + return (x - a) / (b - a); +} + +pub inline fn unlerpInt(a: i32, b: i32, x: i32) f32 { + return @as(f32, @floatFromInt(x - a)) / @as(f32, @floatFromInt(b - a)); +} + +pub inline fn unlerpInt64(a: i64, b: i64, x: i64) f32 { + return @as(f32, @floatFromInt(x - a)) / @as(f32, @floatFromInt(b - a)); } test "refAllDecls" {