diff --git a/imports/getRelativeCoords/shared.lua b/imports/getRelativeCoords/shared.lua new file mode 100644 index 000000000..271ee1964 --- /dev/null +++ b/imports/getRelativeCoords/shared.lua @@ -0,0 +1,30 @@ +local glm_sincos = require 'glm'.sincos +local glm_rad = require 'glm'.rad + +---Get the relative coordinates of a vector3 based on a heading and offset +---@overload fun(coords: vector3, heading: number, offset: vector3): vector3 +---@overload fun(coords: vector4, offset: vector3): vector4 +---@param coords vector3 | vector4 +---@param heading number +---@param offset vector3 +---@return vector3 +function lib.getRelativeCoords(coords, heading, offset) + offset = offset or heading + local x, y, z, w = coords.x, coords.y, coords.z, type(heading) == 'number' and heading or coords.w + local sin, cos = glm_sincos --[[@as fun(n: number): number, number]](glm_rad(w)) + local relativeX = offset.x * cos - offset.y * sin + local relativeY = offset.x * sin + offset.y * cos + + return coords.w and vec4( + x + relativeX, + y + relativeY, + z + offset.z, + w + ) or vec3( + x + relativeX, + y + relativeY, + z + offset.z + ) +end + +return lib.getRelativeCoords