204 lines
4.5 KiB
Lua
204 lines
4.5 KiB
Lua
--------------------------------------------------------------------------------
|
|
-- Copyright (c) 2015 , 蒙占志(topameng) topameng@gmail.com
|
|
-- All rights reserved.
|
|
-- Use, modification and distribution are subject to the "MIT License"
|
|
--------------------------------------------------------------------------------
|
|
|
|
local clamp = Mathf.Clamp
|
|
local sqrt = Mathf.Sqrt
|
|
local min = Mathf.Min
|
|
local max = Mathf.Max
|
|
local setmetatable = setmetatable
|
|
local rawget = rawget
|
|
|
|
local Vector4 = {}
|
|
local get = tolua.initget(Vector4)
|
|
|
|
Vector4.__index = function(t,k)
|
|
local var = rawget(Vector4, k)
|
|
|
|
if var == nil then
|
|
var = rawget(get, k)
|
|
|
|
if var ~= nil then
|
|
return var(t)
|
|
end
|
|
end
|
|
|
|
return var
|
|
end
|
|
|
|
Vector4.__call = function(t, x, y, z, w)
|
|
return setmetatable({x = x or 0, y = y or 0, z = z or 0, w = w or 0}, Vector4)
|
|
end
|
|
|
|
function Vector4.New(x, y, z, w)
|
|
return setmetatable({x = x or 0, y = y or 0, z = z or 0, w = w or 0}, Vector4)
|
|
end
|
|
|
|
function Vector4:Set(x,y,z,w)
|
|
self.x = x or 0
|
|
self.y = y or 0
|
|
self.z = z or 0
|
|
self.w = w or 0
|
|
end
|
|
|
|
function Vector4:Get()
|
|
return self.x, self.y, self.z, self.w
|
|
end
|
|
|
|
function Vector4.Lerp(from, to, t)
|
|
t = clamp(t, 0, 1)
|
|
return Vector4.New(from.x + ((to.x - from.x) * t), from.y + ((to.y - from.y) * t), from.z + ((to.z - from.z) * t), from.w + ((to.w - from.w) * t))
|
|
end
|
|
|
|
function Vector4.MoveTowards(current, target, maxDistanceDelta)
|
|
local vector = target - current
|
|
local magnitude = vector:Magnitude()
|
|
|
|
if magnitude > maxDistanceDelta and magnitude ~= 0 then
|
|
maxDistanceDelta = maxDistanceDelta / magnitude
|
|
vector:Mul(maxDistanceDelta)
|
|
vector:Add(current)
|
|
return vector
|
|
end
|
|
|
|
return target
|
|
end
|
|
|
|
function Vector4.Scale(a, b)
|
|
return Vector4.New(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w)
|
|
end
|
|
|
|
function Vector4:SetScale(scale)
|
|
self.x = self.x * scale.x
|
|
self.y = self.y * scale.y
|
|
self.z = self.z * scale.z
|
|
self.w = self.w * scale.w
|
|
end
|
|
|
|
function Vector4:Normalize()
|
|
local v = vector4.New(self.x, self.y, self.z, self.w)
|
|
return v:SetNormalize()
|
|
end
|
|
|
|
function Vector4:SetNormalize()
|
|
local num = self:Magnitude()
|
|
|
|
if num == 1 then
|
|
return self
|
|
elseif num > 1e-05 then
|
|
self:Div(num)
|
|
else
|
|
self:Set(0,0,0,0)
|
|
end
|
|
|
|
return self
|
|
end
|
|
|
|
function Vector4:Div(d)
|
|
self.x = self.x / d
|
|
self.y = self.y / d
|
|
self.z = self.z / d
|
|
self.w = self.w / d
|
|
|
|
return self
|
|
end
|
|
|
|
function Vector4:Mul(d)
|
|
self.x = self.x * d
|
|
self.y = self.y * d
|
|
self.z = self.z * d
|
|
self.w = self.w * d
|
|
|
|
return self
|
|
end
|
|
|
|
function Vector4:Add(b)
|
|
self.x = self.x + b.x
|
|
self.y = self.y + b.y
|
|
self.z = self.z + b.z
|
|
self.w = self.w + b.w
|
|
|
|
return self
|
|
end
|
|
|
|
function Vector4:Sub(b)
|
|
self.x = self.x - b.x
|
|
self.y = self.y - b.y
|
|
self.z = self.z - b.z
|
|
self.w = self.w - b.w
|
|
|
|
return self
|
|
end
|
|
|
|
function Vector4.Dot(a, b)
|
|
return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w
|
|
end
|
|
|
|
function Vector4.Project(a, b)
|
|
local s = Vector4.Dot(a, b) / Vector4.Dot(b, b)
|
|
return b * s
|
|
end
|
|
|
|
function Vector4.Distance(a, b)
|
|
local v = a - b
|
|
return Vector4.Magnitude(v)
|
|
end
|
|
|
|
function Vector4.Magnitude(a)
|
|
return sqrt(a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w)
|
|
end
|
|
|
|
function Vector4.SqrMagnitude(a)
|
|
return a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w
|
|
end
|
|
|
|
function Vector4.Min(lhs, rhs)
|
|
return Vector4.New(max(lhs.x, rhs.x), max(lhs.y, rhs.y), max(lhs.z, rhs.z), max(lhs.w, rhs.w))
|
|
end
|
|
|
|
function Vector4.Max(lhs, rhs)
|
|
return Vector4.New(min(lhs.x, rhs.x), min(lhs.y, rhs.y), min(lhs.z, rhs.z), min(lhs.w, rhs.w))
|
|
end
|
|
|
|
Vector4.__tostring = function(self)
|
|
return string.format("[%f,%f,%f,%f]", self.x, self.y, self.z, self.w)
|
|
end
|
|
|
|
Vector4.__div = function(va, d)
|
|
return Vector4.New(va.x / d, va.y / d, va.z / d, va.w / d)
|
|
end
|
|
|
|
Vector4.__mul = function(va, d)
|
|
return Vector4.New(va.x * d, va.y * d, va.z * d, va.w * d)
|
|
end
|
|
|
|
Vector4.__add = function(va, vb)
|
|
return Vector4.New(va.x + vb.x, va.y + vb.y, va.z + vb.z, va.w + vb.w)
|
|
end
|
|
|
|
Vector4.__sub = function(va, vb)
|
|
return Vector4.New(va.x - vb.x, va.y - vb.y, va.z - vb.z, va.w - vb.w)
|
|
end
|
|
|
|
Vector4.__unm = function(va)
|
|
return Vector4.New(-va.x, -va.y, -va.z, -va.w)
|
|
end
|
|
|
|
Vector4.__eq = function(va,vb)
|
|
local v = va - vb
|
|
local delta = Vector4.SqrMagnitude(v)
|
|
return delta < 1e-10
|
|
end
|
|
|
|
get.zero = function() return Vector4.New(0, 0, 0, 0) end
|
|
get.one = function() return Vector4.New(1, 1, 1, 1) end
|
|
|
|
get.magnitude = Vector4.Magnitude
|
|
get.normalized = Vector4.Normalize
|
|
get.sqrMagnitude = Vector4.SqrMagnitude
|
|
|
|
UnityEngine.Vector4 = Vector4
|
|
setmetatable(Vector4, Vector4)
|
|
return Vector4 |