Vector4_Tips.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. --------------------------------------------------------------------------------
  2. -- Copyright (c) 2015 , 蒙占志(topameng) topameng@gmail.com
  3. -- All rights reserved.
  4. -- Use, modification and distribution are subject to the "MIT License"
  5. --------------------------------------------------------------------------------
  6. -- added by wsh @ 2017-12-28
  7. -- 注意:
  8. -- 1、已经被修改,别从tolua轻易替换来做升级
  9. local clamp = Mathf.Clamp
  10. local sqrt = Mathf.Sqrt
  11. local min = Mathf.Min
  12. local max = Mathf.Max
  13. local setmetatable = setmetatable
  14. local rawget = rawget
  15. ---@class Vector4
  16. Vector4 = {}
  17. ---@class _getter
  18. local _getter = {}
  19. local unity_vector4 = CS.UnityEngine.Vector4
  20. Vector4.isValueType = true
  21. Vector4.__index = function(t,k)
  22. local var = rawget(Vector4, k)
  23. if var ~= nil then
  24. return var
  25. end
  26. var = rawget(_getter, k)
  27. if var ~= nil then
  28. return var(t)
  29. end
  30. return rawget(unity_vector4, k)
  31. end
  32. Vector4.__call = function(t, x, y, z, w)
  33. return setmetatable({x = x or 0, y = y or 0, z = z or 0, w = w or 0}, Vector4)
  34. end
  35. function Vector4.New(x, y, z, w)
  36. return setmetatable({x = x or 0, y = y or 0, z = z or 0, w = w or 0}, Vector4)
  37. end
  38. function Vector4:Set(x,y,z,w)
  39. self.x = x or 0
  40. self.y = y or 0
  41. self.z = z or 0
  42. self.w = w or 0
  43. end
  44. function Vector4:Get()
  45. return self.x, self.y, self.z, self.w
  46. end
  47. function Vector4.Lerp(from, to, t)
  48. t = clamp(t, 0, 1)
  49. 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))
  50. end
  51. function Vector4.Copy(from,to)
  52. to.x = from.x
  53. to.y = from.y
  54. to.z = from.z
  55. to.w = from.w
  56. end
  57. function Vector4.MoveTowards(current, target, maxDistanceDelta)
  58. local vector = target - current
  59. local magnitude = vector:Magnitude()
  60. if magnitude > maxDistanceDelta and magnitude ~= 0 then
  61. maxDistanceDelta = maxDistanceDelta / magnitude
  62. vector:Mul(maxDistanceDelta)
  63. vector:Add(current)
  64. return vector
  65. end
  66. return target
  67. end
  68. function Vector4.Scale(a, b)
  69. return Vector4.New(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w)
  70. end
  71. function Vector4:SetScale(scale)
  72. self.x = self.x * scale.x
  73. self.y = self.y * scale.y
  74. self.z = self.z * scale.z
  75. self.w = self.w * scale.w
  76. end
  77. function Vector4:Normalize()
  78. local v = vector4.New(self.x, self.y, self.z, self.w)
  79. return v:SetNormalize()
  80. end
  81. function Vector4:SetNormalize()
  82. local num = self:Magnitude()
  83. if num == 1 then
  84. return self
  85. elseif num > 1e-05 then
  86. self:Div(num)
  87. else
  88. self:Set(0,0,0,0)
  89. end
  90. return self
  91. end
  92. function Vector4:Div(d)
  93. self.x = self.x / d
  94. self.y = self.y / d
  95. self.z = self.z / d
  96. self.w = self.w / d
  97. return self
  98. end
  99. function Vector4:Mul(d)
  100. self.x = self.x * d
  101. self.y = self.y * d
  102. self.z = self.z * d
  103. self.w = self.w * d
  104. return self
  105. end
  106. function Vector4:Add(b)
  107. self.x = self.x + b.x
  108. self.y = self.y + b.y
  109. self.z = self.z + b.z
  110. self.w = self.w + b.w
  111. return self
  112. end
  113. function Vector4:Sub(b)
  114. self.x = self.x - b.x
  115. self.y = self.y - b.y
  116. self.z = self.z - b.z
  117. self.w = self.w - b.w
  118. return self
  119. end
  120. function Vector4.Dot(a, b)
  121. return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w
  122. end
  123. function Vector4.Project(a, b)
  124. local s = Vector4.Dot(a, b) / Vector4.Dot(b, b)
  125. return b * s
  126. end
  127. function Vector4.Distance(a, b)
  128. local v = a - b
  129. return Vector4.Magnitude(v)
  130. end
  131. function Vector4.Magnitude(a)
  132. return sqrt(a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w)
  133. end
  134. function Vector4.SqrMagnitude(a)
  135. return a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w
  136. end
  137. function Vector4.Min(lhs, rhs)
  138. return Vector4.New(max(lhs.x, rhs.x), max(lhs.y, rhs.y), max(lhs.z, rhs.z), max(lhs.w, rhs.w))
  139. end
  140. function Vector4.Max(lhs, rhs)
  141. return Vector4.New(min(lhs.x, rhs.x), min(lhs.y, rhs.y), min(lhs.z, rhs.z), min(lhs.w, rhs.w))
  142. end
  143. Vector4.__tostring = function(self)
  144. return string.format("[%f,%f,%f,%f]", self.x, self.y, self.z, self.w)
  145. end
  146. Vector4.__div = function(va, d)
  147. return Vector4.New(va.x / d, va.y / d, va.z / d, va.w / d)
  148. end
  149. Vector4.__mul = function(va, d)
  150. return Vector4.New(va.x * d, va.y * d, va.z * d, va.w * d)
  151. end
  152. Vector4.__add = function(va, vb)
  153. return Vector4.New(va.x + vb.x, va.y + vb.y, va.z + vb.z, va.w + vb.w)
  154. end
  155. Vector4.__sub = function(va, vb)
  156. return Vector4.New(va.x - vb.x, va.y - vb.y, va.z - vb.z, va.w - vb.w)
  157. end
  158. Vector4.__unm = function(va)
  159. return Vector4.New(-va.x, -va.y, -va.z, -va.w)
  160. end
  161. Vector4.__eq = function(va,vb)
  162. if not va.x or not vb.x then
  163. return false
  164. end
  165. local v = va - vb
  166. local delta = Vector4.SqrMagnitude(v)
  167. return delta < 1e-10
  168. end
  169. ---@param vec Vector4
  170. function Vector4:IsSelfMetatable(vec)
  171. return self.x == nil
  172. end
  173. _getter.zero = function() return Vector4.New(0, 0, 0, 0) end
  174. _getter.one = function() return Vector4.New(1, 1, 1, 1) end
  175. _getter.magnitude = Vector4.Magnitude
  176. _getter.normalized = Vector4.Normalize
  177. _getter.sqrMagnitude = Vector4.SqrMagnitude
  178. Vector4.unity_vector4 = CS.UnityEngine.Vector4
  179. CS.UnityEngine.Vector4 = Vector4
  180. setmetatable(Vector4, Vector4)