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" {