源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
4.1 KiB

  1. local clamp = Mathf.Clamp
  2. local sqrt = Mathf.Sqrt
  3. local min = Mathf.Min
  4. local max = Mathf.Max
  5. local setmetatable = setmetatable
  6. local rawget = rawget
  7. local Vector4 = {}
  8. local get = tolua.initget(Vector4)
  9. Vector4.__index = function(t,k)
  10. local var = rawget(Vector4, k)
  11. if var == nil then
  12. var = rawget(get, k)
  13. if var ~= nil then
  14. return var(t)
  15. end
  16. end
  17. return var
  18. end
  19. Vector4.__call = function(t, x, y, z, w)
  20. return Vector4.New(x, y, z, w)
  21. end
  22. function Vector4.New(x, y, z, w)
  23. local v = {x = 0, y = 0, z = 0, w = 0}
  24. setmetatable(v, Vector4)
  25. v:Set(x,y,z,w)
  26. return v
  27. end
  28. function Vector4:Set(x,y,z,w)
  29. self.x = x or 0
  30. self.y = y or 0
  31. self.z = z or 0
  32. self.w = w or 0
  33. end
  34. function Vector4:Get()
  35. return self.x, self.y, self.z, self.w
  36. end
  37. function Vector4.Lerp(from, to, t)
  38. t = clamp(t, 0, 1)
  39. 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))
  40. end
  41. function Vector4.MoveTowards(current, target, maxDistanceDelta)
  42. local vector = target - current
  43. local magnitude = vector:Magnitude()
  44. if magnitude > maxDistanceDelta and magnitude ~= 0 then
  45. maxDistanceDelta = maxDistanceDelta / magnitude
  46. vector:Mul(maxDistanceDelta)
  47. vector:Add(current)
  48. return vector
  49. end
  50. return target
  51. end
  52. function Vector4.Scale(a, b)
  53. return Vector4.New(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w)
  54. end
  55. function Vector4:SetScale(scale)
  56. self.x = self.x * scale.x
  57. self.y = self.y * scale.y
  58. self.z = self.z * scale.z
  59. self.w = self.w * scale.w
  60. end
  61. function Vector4:Normalize()
  62. local v = vector4.New(self.x, self.y, self.z, self.w)
  63. return v:SetNormalize()
  64. end
  65. function Vector4:SetNormalize()
  66. local num = self:Magnitude()
  67. if num == 1 then
  68. return self
  69. elseif num > 1e-05 then
  70. self:Div(num)
  71. else
  72. self:Set(0,0,0,0)
  73. end
  74. return self
  75. end
  76. function Vector4:Div(d)
  77. self.x = self.x / d
  78. self.y = self.y / d
  79. self.z = self.z / d
  80. self.w = self.w / d
  81. return self
  82. end
  83. function Vector4:Mul(d)
  84. self.x = self.x * d
  85. self.y = self.y * d
  86. self.z = self.z * d
  87. self.w = self.w * d
  88. return self
  89. end
  90. function Vector4:Add(b)
  91. self.x = self.x + b.x
  92. self.y = self.y + b.y
  93. self.z = self.z + b.z
  94. self.w = self.w + b.w
  95. return self
  96. end
  97. function Vector4:Sub(b)
  98. self.x = self.x - b.x
  99. self.y = self.y - b.y
  100. self.z = self.z - b.z
  101. self.w = self.w - b.w
  102. return self
  103. end
  104. function Vector4.Dot(a, b)
  105. return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w
  106. end
  107. function Vector4.Project(a, b)
  108. local s = Vector4.Dot(a, b) / Vector4.Dot(b, b)
  109. return b * s
  110. end
  111. function Vector4.Distance(a, b)
  112. local v = a - b
  113. return Vector4.Magnitude(v)
  114. end
  115. function Vector4.Magnitude(a)
  116. return sqrt(a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w)
  117. end
  118. function Vector4.SqrMagnitude(a)
  119. return a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w
  120. end
  121. function Vector4.Min(lhs, rhs)
  122. return Vector4.New(max(lhs.x, rhs.x), max(lhs.y, rhs.y), max(lhs.z, rhs.z), max(lhs.w, rhs.w))
  123. end
  124. function Vector4.Max(lhs, rhs)
  125. return Vector4.New(min(lhs.x, rhs.x), min(lhs.y, rhs.y), min(lhs.z, rhs.z), min(lhs.w, rhs.w))
  126. end
  127. Vector4.__tostring = function(self)
  128. return string.format("[%f,%f,%f,%f]", self.x, self.y, self.z, self.w)
  129. end
  130. Vector4.__div = function(va, d)
  131. return Vector4.New(va.x / d, va.y / d, va.z / d, va.w / d)
  132. end
  133. Vector4.__mul = function(va, d)
  134. return Vector4.New(va.x * d, va.y * d, va.z * d, va.w * d)
  135. end
  136. Vector4.__add = function(va, vb)
  137. return Vector4.New(va.x + vb.x, va.y + vb.y, va.z + vb.z, va.w + vb.w)
  138. end
  139. Vector4.__sub = function(va, vb)
  140. return Vector4.New(va.x - vb.x, va.y - vb.y, va.z - vb.z, va.w - vb.w)
  141. end
  142. Vector4.__unm = function(va)
  143. return Vector4.New(-va.x, -va.y, -va.z, -va.w)
  144. end
  145. Vector4.__eq = function(va,vb)
  146. local v = va - vb
  147. local delta = Vector4.SqrMagnitude(v)
  148. return delta < 1e-10
  149. end
  150. get.zero = function() return Vector4.New(0, 0, 0, 0) end
  151. get.one = function() return Vector4.New(1, 1, 1, 1) end
  152. get.magnitude = Vector4.Magnitude
  153. get.normalized = Vector4.Normalize
  154. get.sqrMagnitude = Vector4.SqrMagnitude
  155. UnityEngine.Vector4 = Vector4
  156. setmetatable(Vector4, Vector4)
  157. return Vector4