---@class v3f local v3f = { ---@type number x = 0, ---@type number y = 0, ---@type number z = 0 } ---@overload fun(): v3f ---@overload fun(v: number): v3f ---@overload fun(x: number, y: number, z: number): v3f ---@overload fun(v: v2f, z: number): v3f ---@overload fun(v: v3f): v3f ---@overload fun(v: v4f): v3f ---@return v3f function v3f.new() end ---@return v3f function v3f.zero() end ---@return v3f function v3f.unit() end ---@return v3f function v3f.unit_x() end ---@return v3f function v3f.unit_y() end ---@return v3f function v3f.unit_z() end ---@param l v3f ---@param r v3f ---@return boolean function v3f.approximately(l, r) end ---@param l v3f ---@param r v3f ---@return number function v3f.dot(l, r) end ---@param l v3f ---@param r v3f ---@return number function v3f.abs_dot(l, r) end ---@param l v3f ---@param r v3f ---@return v3f function v3f.cross(l, r) end ---@param v v3f ---@return number function v3f.length_squared(v) end ---@param v v3f ---@return number function v3f.length(v) end ---@param l v3f ---@param r v3f ---@return number function v3f.distance_squared(l, r) end ---@param l v3f ---@param r v3f ---@return number function v3f.distance(l, r) end ---@param v v3f ---@return v3f function v3f.normalized(v) end ---@param v v3f ---@return number function v3f.minimum(v) end ---@param v v3f ---@return number function v3f.maximum(v) end ---@param v v3f ---@param vmin v3f ---@return v3f function v3f.minimized(v,vmin) end ---@param v v3f ---@param vmax v3f ---@return v3f function v3f.maximized(v,vmax) end ---@param v v3f ---@param vmin v3f ---@param vmax v3f ---@return v3f function v3f.clamped(v,vmin,vmax) end ---@param v v3f ---@return v3f function v3f.saturated(v) end ---@param l v3f ---@param r v3f ---@param v number | v3f ---@return v3f function v3f.lerp(l,r,v) end ---@param l v3f ---@param r v3f ---@param v v3f ---@return v3f function v3f.inverse_lerp(l,r,v) end ---@param v v3f ---@return boolean function v3f.contains_nan(v) end ---@type v3f _G.v3f = _G.v3f or v3f