add a barebones vector3 class
This commit is contained in:
parent
fe80231336
commit
a84a9e98bb
116
data/scripts/vector3.lua
Normal file
116
data/scripts/vector3.lua
Normal file
@ -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
|
5
data/scripts/vector3test.lua
Normal file
5
data/scripts/vector3test.lua
Normal file
@ -0,0 +1,5 @@
|
||||
local Vector3 = require "vector3"
|
||||
|
||||
local v1 = Vector3{x = 10, y = 20, z = 30}
|
||||
local v2 = Vector3(5)
|
||||
print(-v2)
|
Reference in New Issue
Block a user