From 1e2a162800d1a818523583ce79a2ab54a0b10e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lera=20Elvo=C3=A9?= Date: Sun, 23 Feb 2025 17:07:56 +0300 Subject: [PATCH] add in-place rotate method to v3 and avoid unnecessary conversion in :rotated() --- data/scripts/types/vector3.lua | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/data/scripts/types/vector3.lua b/data/scripts/types/vector3.lua index 289285a..03a308b 100644 --- a/data/scripts/types/vector3.lua +++ b/data/scripts/types/vector3.lua @@ -225,8 +225,25 @@ function Vector3:rotated(axis, angle) local sina = math.sin(angle) -- __mul is only defined for the left operand (table), numbers don't get metatables. -- as such, the ordering of operations here is specific - local v = (self * cosa) + (vaxis * ((1 - cosa) * self:dot(vaxis))) + (vaxis:cross(self) * sina) - return Vector3(v) + return (self * cosa) + (vaxis * ((1 - cosa) * self:dot(vaxis))) + (vaxis:cross(self) * sina) +end + +---In-place version of rotated. +---@param axis Vector3 +---@param angle number +---@return Vector3 +function Vector3:rotate(axis, angle) + local cosa = math.cos(angle) + local sina = math.sin(angle) + + local dot = self:dot(axis) + local cross = axis:cross(self) + + self.x = self.x * cosa + axis.x * ((1 - cosa) * dot) + cross.x * sina + self.y = self.y * cosa + axis.y * ((1 - cosa) * dot) + cross.y * sina + self.z = self.z * cosa + axis.z * ((1 - cosa) * dot) + cross.z * sina + + return self end ---Returns a copy of this vector.