2025-06-04 05:02:57 +08:00

423 lines
9.5 KiB
Plaintext

local setmetatable=setmetatable
local getmetatable=getmetatable
local type=type
local clamp=clamp
local acos=math.acos
local sin=math.sin
local cos=math.cos
local sqrt=math.sqrt
local error=error
local min=math.min
local max=math.max
local abs=math.abs
local pow=math.pow
local Time=UnityEngine.Time
local ToAngle=57.29578
local ToRad=0.01745329
local Epsilon=0.00001
local Infinite=1/0
local Sqrt2=0.7071067811865475244008443621048490
local PI=3.14159265358979323846264338327950
local destroy = ReusableTable.DestroyVector2
local function clamp(v,min,max)
return v>max and max or (v<min and min or v)
end
local function lerpf(a,b,t)
t=clamp(t,0,1)
return a+(b-a)*t
end
local LuaVector2={__typename='Vector2'}
local T=LuaVector2
local I={__typename='Vector2',__typeReuse = true}
_G['LuaVector2']=LuaVector2
local get={}
local set={}
LuaVector2.__index = function(t,k)
local f=rawget(LuaVector2,k)
if f then return f end
local f=rawget(get,k)
if f then return f(t) end
error('Not found '..k)
end
LuaVector2.__newindex = function(t,k,v)
local f=rawget(set,k)
if f then return f(t,v) end
error('Not found '..k)
end
local creator = ReusableTable.CreateVector2
function LuaVector2.New(x,y)
local v,newCreate = creator()
if(newCreate) then
v[1],v[2] = x or 0,y or 0
setmetatable(v,I)
else
v:Set(x,y)
end
-- local v = {x or 0,y or 0}
-- setmetatable(v,I)
return v
end
LuaVector2.__call = function(t,x,y)
return LuaVector2.New(x,y)
end
I.__tostring = function(self)
return string.format('LuaVector2(%f, %f)',self[1],self[2])
end
I.__index = function(t,k)
local f=rawget(I,k)
if f then return f end
local f=rawget(get,k)
if f then return f(t) end
error('Not found '..k)
end
I.__newindex = function(t,k,v)
local f=rawget(set,k)
if f then return f(t,v) end
error('Not found '..k)
end
I.__add = function( a,b )
return LuaVector2.New(a[1]+b[1],a[2]+b[2])
end
I.__sub = function( a,b )
return LuaVector2.New(a[1]-b[1],a[2]-b[2])
end
I.__mul = function( a,b )
return LuaVector2.New(a[1]*b,a[2]*b)
end
I.__div = function( a,b )
return LuaVector2.New(a[1]/b,a[2]/b)
end
I.__unm = function( a )
return LuaVector2.New(-a[1],-a[2])
end
function I:ToString()
return self:__tostring()
end
function I:Clone()
return LuaVector2.New(self[1],self[2])
end
function I:Set(x,y)
self[1],self[2]=x or 0,y or 0
end
function LuaVector2.Equal(a,b)
return abs(a[1]-b[1])<Epsilon
and abs(a[2]-b[2])<Epsilon
end
function I:Equal(b)
return abs(self[1]-b[1])<Epsilon
and abs(self[2]-b[2])<Epsilon
end
function LuaVector2.Mul(self,b)
self[1],self[2]=self[1]*b,self[2]*b
end
function LuaVector2.Better_Mul(a,b,t)
t[1],t[2]=a[1]*b,a[2]*b
end
function I:Mul(b)
self[1],self[2]=self[1]*b,self[2]*b
end
function LuaVector2.Add(self,b)
self[1],self[2]=self[1]+b[1],self[2]+b[2]
end
function LuaVector2.Better_Add(a,b,t)
t[1],t[2]=a[1]+b[1],a[2]+b[2]
end
function I:Add(b)
self[1],self[2]=self[1]+b[1],self[2]+b[2]
end
function LuaVector2.Sub(self,b)
self[1],self[2]=self[1]-b[1],self[2]-b[2]
end
function LuaVector2.Better_Sub(a,b,t)
t[1],t[2]=a[1]-b[1],a[2]-b[2]
end
function I:Sub(b)
self[1],self[2]=self[1]-b[1],self[2]-b[2]
end
function LuaVector2.Div(self,b)
self[1],self[2]=self[1]/b,self[2]/b
end
function LuaVector2.Better_Div(a,b,t)
t[1],t[2]=a[1]/b,a[2]/b
end
function I:Div(b)
self[1],self[2]=self[1]/b,self[2]/b
end
function LuaVector2.MulVector(self,a,b)
self[1],self[2]=a[1]*b[1],a[2]*b[2]
end
function LuaVector2.AddVector(self,a,b)
self[1],self[2]=a[1]+b[1],a[2]+b[2]
end
function LuaVector2.SubVector(self,a,b)
self[1],self[2]=a[1]-b[1],a[2]-b[2]
end
function LuaVector2.DivVector(self,a,b)
self[1],self[2]=a[1]/b[1],a[2]/b[2]
end
function get.one() return LuaVector2.New(1,1) end
function get.zero() return LuaVector2.New(0,0) end
function get.up() return LuaVector2.New(0,1) end
function get.right() return LuaVector2.New(1,0) end
function get:magnitude() return sqrt(self[1]^2+self[2]^2) end
function get:sqrMagnitude() return self[1]^2+self[2]^2 end
function get:normalized()
local m = self.magnitude
return LuaVector2.New(self[1]/m,self[2]/m)
end
function get:x() return self[1] end
function get:y() return self[2] end
function set:x(v) self[1]=v end
function set:y(v) self[2]=v end
-- inherite(Vector2,Raw)
function LuaVector2:Clone()
return LuaVector2.New(self[1],self[2])
end
function LuaVector2.Magnitude(v)
return sqrt(v[1]^2+v[2]^2)
end
function LuaVector2.SqrMagnitude(v)
return v[1]^2+v[2]^2
end
function LuaVector2.Angle(a,b)
local mab = sqrt(a[1]^2+a[2]^2)*sqrt(b[1]^2+b[2]^2)
return acos(clamp(a[1]*b[1]/mab + a[2]*b[2]/mab,-1,1))*ToAngle
-- return Vector2.Angle(a,b)
end
function LuaVector2.Normalized(v)
local m = sqrt(v[1]^2+v[2]^2)
if m==1 then
return v
elseif m>Epsilon then
v[1],v[2]=v[1]/m,v[2]/m
else
v:Set(0,0)
end
return v
end
function LuaVector2.Normalize(v)
local v=LuaVector2.Clone(v)
LuaVector2.Normalized(v)
return v
end
function LuaVector2.ClampMagnitude(vector,maxLength)
if vector.sqrMagnitude > (maxLength^2) then
return vector.normalized * maxLength
end
return LuaVector2.Clone(vector)
end
function LuaVector2.ClampMagnitudeQuick(target,vector,maxLength)
if vector.sqrMagnitude > (maxLength^2) then
local m = maxLength / vector.magnitude
target:Set(vector[1]*m,vector[2]*m)
else
target:Set(vector[1],vector[2])
end
return target
end
function LuaVector2.Dot(a,b)
return a[1]*b[1] + a[2]*b[2]
end
function LuaVector2.Distance(a,b)
local x = a[1]-b[1]
local y = a[2]-b[2]
return math.sqrt(x ^ 2 + y ^ 2)
end
function LuaVector2.Lerp(a,b,t)
t = clamp(t,0,1)
return LuaVector2.New(a[1]+(b[1]-a[1])*t
,a[2]+(b[2]-a[2])*t
)
end
function LuaVector2.Better_Lerp(a,b,c,t)
t = clamp(t,0,1)
c[1],c[2] = a[1]+(b[1]-a[1])*t,a[2]+(b[2]-a[2])*t
return c
end
function I:LerpTo(b,t)
t = clamp(t,0,1)
self[1],self[2]= self[1]+(b[1]-self[1])*t,self[2]+(b[2]-self[2])*t
end
function LuaVector2.LerpUnclamped(a,b,t)
return LuaVector2.New(a[1]+(b[1]-a[1])*t
,a[2]+(b[2]-a[2])*t
)
end
function LuaVector2.Better_LerpUnclamped(a,b,c,t)
c[1],c[2] = a[1]+(b[1]-a[1])*t,a[2]+(b[2]-a[2])*t
return c
end
function I:LerpUnclampedTo(b,t)
self[1],self[2]= self[1]+(b[1]-self[1])*t,self[2]+(b[2]-self[2])*t
end
function LuaVector2.Min(a,b)
return LuaVector2.New(min(a[1],b[1]),min(a[2],b[2]))
end
function LuaVector2.Better_Min(a,b,c)
c[1],c[2] = min(a[1],b[1]),min(a[2],b[2])
return c
end
function LuaVector2.Max(a,b)
return LuaVector2.New(max(a[1],b[1]),max(a[2],b[2]))
end
function LuaVector2.Better_Max(a,b,c)
c[1],c[2] = max(a[1],b[1]),max(a[2],b[2])
return c
end
function LuaVector2.MoveTowards(a,b,adv)
local v = b - a
local m = sqrt(v[1]^2+v[2]^2)
if m>adv and m~=0 then
v[1],v[2] = v[1]/m,v[2]/m
v[1],v[2] = v[1]*adv,v[2]*adv
v[1],v[2] = v[1]+a[1],v[2]+a[2]
return v
end
return LuaVector2.Clone(b)
end
local towardHelper = LuaVector2.New(0,0,0)
function LuaVector2.SelfMoveTowards(self,b,adv)
LuaVector2.Better_Sub(b,self,towardHelper)
local m = sqrt(towardHelper[1]^2+towardHelper[2]^2)
if m>adv and m~=0 then
towardHelper[1],towardHelper[2] = towardHelper[1]/m,towardHelper[2]/m
towardHelper[1],towardHelper[2] = towardHelper[1]*adv,towardHelper[2]*adv
self[1],self[2] = towardHelper[1]+self[1],towardHelper[2]+self[2]
return self
end
self[1],self[2] = b[1],b[2]
return self
end
function LuaVector2.Better_MoveTowards(a,b,t,adv)
LuaVector2.Better_Sub(b,a,t)
local m = sqrt(t[1]^2+t[2]^2)
if m>adv and m~=0 then
t[1],t[2] = t[1]/m,t[2]/m
t[1],t[2] = t[1]*adv,t[2]*adv
t[1],t[2] = t[1]+a[1],t[2]+a[2]
return t
end
t[1],t[2] = b[1],b[2]
return t
end
local cSmoothDamp = VectorHelper.Vector2SmoothDamp
function LuaVector2._SmoothDamp(current,target,currentVelocity,smoothTime,maxSpeed,deltaTime)
if(maxSpeed) then
if(deltaTime) then
return cSmoothDamp(current,target,currentVelocity,smoothTime,maxSpeed,deltaTime,0,0,0,0)
else
return cSmoothDamp(current,target,currentVelocity,smoothTime,maxSpeed,0,0,0,0)
end
end
return cSmoothDamp(current,target,currentVelocity,smoothTime,0,0,0,0)
end
local _SmoothDamp = LuaVector2._SmoothDamp
function LuaVector2.SmoothDamp(current,target,currentVelocity,smoothTime,maxSpeed,deltaTime)
--may be fast
-- local x,y
-- if(maxSpeed) then
-- if(deltaTime) then
-- x,y = cSmoothDamp(current,target,currentVelocity[1],currentVelocity[2],smoothTime,maxSpeed,deltaTime,0,0)
-- else
-- x,y = cSmoothDamp(current,target,currentVelocity[1],currentVelocity[2],smoothTime,maxSpeed,0,0)
-- end
-- return LuaVector2(x,y)
-- end
-- x,y = cSmoothDamp(current,target,currentVelocity[1],currentVelocity[2],smoothTime,0,0)
-- return LuaVector2(x,y)
return LuaVector2(_SmoothDamp(current,target,currentVelocity,smoothTime,maxSpeed,deltaTime))
end
function LuaVector2.SelfSmoothDamp(self,target,currentVelocity,smoothTime,maxSpeed,deltaTime)
currentVelocity[1],currentVelocity[2],self[1],self[2] = _SmoothDamp(self,target,currentVelocity,smoothTime,maxSpeed,deltaTime)
return self
end
function LuaVector2.Better_SmoothDamp(current,target,t,currentVelocity,smoothTime,maxSpeed,deltaTime)
currentVelocity[1],currentVelocity[2],t[1],t[2] = _SmoothDamp(current,target,currentVelocity,smoothTime,maxSpeed,deltaTime)
return t
end
function LuaVector2.Magnitude( v )
return sqrt(v[1]^2+v[2]^2)
end
function LuaVector2:Set( x,y )
self[1],self[2]=x,y
end
function LuaVector2:ToString( )
return LuaVector2.__tostring(self)
end
local destroyer = ReusableTable.DestroyVector2
function I:Destroy()
destroyer(self)
end
setmetatable(LuaVector2,LuaVector2)