In porting some vector use cases from shaders to PD my observations were it'd be good to have these vector helpers as standard, albeir they're simple enough:
a function for componentwise min or max i.e. (min(v1.x,v2.x),min(v1.y,v2.y))
a function for Hadamard product (componentwise multiplication) i.e. (v1.x * v2.x, v1.y * v2.y)
scalar * vector2D not just vector2D * scalar
clamping of vector2D components i.e. (clamp(v.x),clamp(v.y))
I'm not sure the componentwise functions are generally useful enough to devote firmware space to them, but they're easy enough to implement yourself:
local vect = playdate.geometry.vector2D
function vect.apply1(a,f)
return vect.new(f(a.x),f(a.y))
end
function vect.apply2(a,b,f)
return vect.new(f(a.x,b.x),f(a.y,b.y))
end
function vect.min(a,b) return vect.apply2(a,b,math.min) end
function vect.max(a,b) return vect.apply2(a,b,math.max) end
function vect.hadamard(a,b) return vect.apply2(a,b,function(x,y) return x*y end) end
local function clamp(x) return x<0 and 0 or x>1 and 1 or x end
function vect.clamp(a) return vect.apply1(a,clamp) end
And I'm pretty sure Lua can't handle scalar * vector2D Nope, I'm wrong! It looks like if the left operand doesn't have a metatable and the right one does, it'll use the right side's __mul function. I'll file that, will definitely be handy. Thanks!
As for vectors with dimension > 2.. I'd thought about it, but decided it's not a common enough need to warrant including in the main firmware. It'd be pretty straightforward to implement it via the C API, though. The Array example in the C API/Examples folder in the SDK would give you a solid head start there.