diff --git a/data/scripts/vector3.lua b/data/scripts/vector3.lua new file mode 100644 index 0000000..7e2e691 --- /dev/null +++ b/data/scripts/vector3.lua @@ -0,0 +1,116 @@ +local Vector3 = { + x = 0, + y = 0, + z = 0, + + _CLASS_ = "Vector3" +} + +setmetatable(Vector3, Vector3) + +local function is_weak_vector3(t) + if type(t) ~= "table" then return false end + + local haskeys = t.x ~= nil and t.y ~= nil and t.z ~= nil + if not haskeys then + return type(t[1]) == "number" and type(t[2]) == "number" and type(t[3]) == "number" + else + return type(t.x) == "number" and type(t.y) == "number" and type(t.z) == "number" + end +end + +function Vector3:__mul(b) + if type(b) == "number" then + return Vector3{ + x = self.x * b, + y = self.y * b, + z = self.z * b, + } + elseif type(b) == "table" and is_weak_vector3(b) then + local other = Vector3(b) + return Vector3{ + self.x * other.x, + self.y * other.y, + self.z * other.z, + } + end + + error("Vector3: other must be either a number or a Vector3-like table.") + return Vector3() +end + +function Vector3:__div(b) + if type(b) == "number" then + return Vector3{ + x = self.x / b, + y = self.y / b, + z = self.z / b, + } + elseif type(b) == "table" and is_weak_vector3(b) then + local other = Vector3(b) + return Vector3{ + self.x / other.x, + self.y / other.y, + self.z / other.z, + } + end + + error("Vector3: other must be either a number or a Vector3-like table.") + return Vector3() +end + +function Vector3:__add(b) + if not is_weak_vector3(b) then + error("Vector3: other must be a Vector3-like table.") + return self + end + local other = Vector3(b) + return Vector3{ + self.x + other.x, + self.y + other.y, + self.z + other.z, + } +end + +function Vector3:__sub(b) + if not is_weak_vector3(b) then + error("Vector3: other must be a Vector3-like table.") + return self + end + local other = Vector3(b) + return Vector3{ + self.x - other.x, + self.y - other.y, + self.z - other.z, + } +end + +function Vector3:__unm() + return Vector3{ + -self.x, + -self.y, + -self.z, + } +end + +function Vector3:__call(...) + local args = ... + local nv = {x = 0, y = 0, z = 0} + setmetatable(nv, Vector3) + if type(args) == "number" then + nv.x, nv.y, nv.z = args, args, args + elseif type(args) == "table" then + if args.x ~= nil then + nv.x, nv.y, nv.z = args.x, args.y, args.z + else + nv.x, nv.y, nv.z = args[1], args[2], args[3] + end + end + return nv +end + +function Vector3:__tostring() + return "Vector3(" .. tostring(self.x) .. ", " .. tostring(self.y) .. ", " .. tostring(self.z) .. ")" +end + +return Vector3 \ No newline at end of file diff --git a/data/scripts/vector3test.lua b/data/scripts/vector3test.lua new file mode 100644 index 0000000..741b961 --- /dev/null +++ b/data/scripts/vector3test.lua @@ -0,0 +1,5 @@ +local Vector3 = require "vector3" + +local v1 = Vector3{x = 10, y = 20, z = 30} +local v2 = Vector3(5) +print(-v2)