Color_Tips.lua 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. --------------------------------------------------------------------------------
  2. -- Copyright (c) 2015 - 2016 , 蒙占志(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 rawget = rawget
  10. local setmetatable = setmetatable
  11. local type = type
  12. local Mathf = Mathf
  13. ---@class Color
  14. ---@field red Color
  15. ---@field green Color
  16. ---@field blue Color
  17. ---@field white Color
  18. ---@field whiteNonAlloc Color
  19. ---@field black Color
  20. ---@field yellow Color
  21. ---@field cyan Color
  22. ---@field magenta Color
  23. ---@field gray Color
  24. ---@field clear Color
  25. ---@field purple Color
  26. ---@field orange Color
  27. Color = {}
  28. local _getter = {}
  29. local unity_color = CS.UnityEngine.Color
  30. Color.isValueType = true
  31. Color.__index = function(t,k)
  32. local var = rawget(Color, k)
  33. if var ~= nil then
  34. return var
  35. end
  36. var = rawget(_getter, k)
  37. if var ~= nil then
  38. return var(t)
  39. end
  40. return rawget(unity_color, k)
  41. end
  42. Color.__call = function(t, r, g, b, a)
  43. return setmetatable({r = r or 0, g = g or 0, b = b or 0, a = a or 1}, Color)
  44. end
  45. function Color.New(r, g, b, a)
  46. return setmetatable({r = r or 0, g = g or 0, b = b or 0, a = a or 1}, Color)
  47. end
  48. function Color.Copy(from,to)
  49. to.r = from.r
  50. to.g = from.g
  51. to.b = from.b
  52. to.a = from.a
  53. end
  54. function Color:Set(r, g, b, a)
  55. self.r = r
  56. self.g = g
  57. self.b = b
  58. self.a = a or 1
  59. end
  60. function Color:Get()
  61. return self.r, self.g, self.b, self.a
  62. end
  63. function Color.Lerp(a, b, t)
  64. t = Mathf.Clamp01(t)
  65. return Color.New(a.r + t * (b.r - a.r), a.g + t * (b.g - a.g), a.b + t * (b.b - a.b), a.a + t * (b.a - a.a))
  66. end
  67. function Color:LerpNonAlloc(a, b, t)
  68. t = Mathf.Clamp01(t)
  69. return self:Set(a.r + t * (b.r - a.r), a.g + t * (b.g - a.g), a.b + t * (b.b - a.b), a.a + t * (b.a - a.a))
  70. end
  71. function Color.LerpUnclamped(a, b, t)
  72. return Color.New(a.r + t * (b.r - a.r), a.g + t * (b.g - a.g), a.b + t * (b.b - a.b), a.a + t * (b.a - a.a))
  73. end
  74. function Color:LerpUnclampedNonAlloc(a, b, t)
  75. return self:Set(a.r + t * (b.r - a.r), a.g + t * (b.g - a.g), a.b + t * (b.b - a.b), a.a + t * (b.a - a.a))
  76. end
  77. function Color:HSVToRGBNonAlloc(H, S, V, hdr)
  78. Color.HSVToRGB(H,S,V,hdr,self)
  79. end
  80. function Color.HSVToRGB(H, S, V, hdr,target)
  81. hdr = hdr and false or true
  82. local white =target or Color.New(1,1,1,1)
  83. if S == 0 then
  84. white.r = V
  85. white.g = V
  86. white.b = V
  87. return white
  88. end
  89. if V == 0 then
  90. white.r = 0
  91. white.g = 0
  92. white.b = 0
  93. return white
  94. end
  95. white.r = 0
  96. white.g = 0
  97. white.b = 0
  98. local num = S
  99. local num2 = V
  100. local f = H * 6
  101. local num4 = Mathf.Floor(f)
  102. local num5 = f - num4
  103. local num6 = num2 * (1 - num)
  104. local num7 = num2 * (1 - (num * num5))
  105. local num8 = num2 * (1 - (num * (1 - num5)))
  106. local num9 = num4
  107. local flag = num9 + 1
  108. if flag == 0 then
  109. white.r = num2
  110. white.g = num6
  111. white.b = num7
  112. elseif flag == 1 then
  113. white.r = num2
  114. white.g = num8
  115. white.b = num6
  116. elseif flag == 2 then
  117. white.r = num7
  118. white.g = num2
  119. white.b = num6
  120. elseif flag == 3 then
  121. white.r = num6
  122. white.g = num2
  123. white.b = num8
  124. elseif flag == 4 then
  125. white.r = num6
  126. white.g = num7
  127. white.b = num2
  128. elseif flag == 5 then
  129. white.r = num8
  130. white.g = num6
  131. white.b = num2
  132. elseif flag == 6 then
  133. white.r = num2
  134. white.g = num6
  135. white.b = num7
  136. elseif flag == 7 then
  137. white.r = num2
  138. white.g = num8
  139. white.b = num6
  140. end
  141. if not hdr then
  142. white.r = Mathf.Clamp(white.r, 0, 1)
  143. white.g = Mathf.Clamp(white.g, 0, 1)
  144. white.b = Mathf.Clamp(white.b, 0, 1)
  145. end
  146. return white
  147. end
  148. local function RGBToHSVHelper(offset, dominantcolor, colorone, colortwo)
  149. local V = dominantcolor
  150. if V ~= 0 then
  151. local num = 0
  152. if colorone > colortwo then
  153. num = colortwo
  154. else
  155. num = colorone
  156. end
  157. local num2 = V - num
  158. local H = 0
  159. local S = 0
  160. if num2 ~= 0 then
  161. S = num2 / V
  162. H = offset + (colorone - colortwo) / num2
  163. else
  164. S = 0
  165. H = offset + (colorone - colortwo)
  166. end
  167. H = H / 6
  168. if H < 0 then H = H + 1 end
  169. return H, S, V
  170. end
  171. return 0, 0, V
  172. end
  173. function Color.RGBToHSV(rgbColor)
  174. if rgbColor.b > rgbColor.g and rgbColor.b > rgbColor.r then
  175. return RGBToHSVHelper(4, rgbColor.b, rgbColor.r, rgbColor.g)
  176. elseif rgbColor.g > rgbColor.r then
  177. return RGBToHSVHelper(2, rgbColor.g, rgbColor.b, rgbColor.r)
  178. else
  179. return RGBToHSVHelper(0, rgbColor.r, rgbColor.g, rgbColor.b)
  180. end
  181. end
  182. ---@param rgbColor Color
  183. function Color.HashValue(rgbColor)
  184. local r = math.floor(rgbColor.r)
  185. local g = math.floor(rgbColor.g)
  186. local b = math.floor(rgbColor.b)
  187. local a = math.floor(rgbColor.a)
  188. return r<<24|g<<16|b<<8|a
  189. end
  190. function Color.GrayScale(a)
  191. return 0.299 * a.r + 0.587 * a.g + 0.114 * a.b
  192. end
  193. ---@param vec Vector4
  194. function Color:IsSelfMetatable(vec)
  195. return self.r == nil
  196. end
  197. Color.__tostring = function(self)
  198. return string.format("RGBA(%f,%f,%f,%f)", self.r, self.g, self.b, self.a)
  199. end
  200. Color.__add = function(a, b)
  201. return Color.New(a.r + b.r, a.g + b.g, a.b + b.b, a.a + b.a)
  202. end
  203. function Color:Add(a)
  204. self.r = self.r+a.r
  205. self.g = self.g+a.g
  206. self.b = self.b+a.b
  207. self.a = self.a+a.a
  208. end
  209. Color.__sub = function(a, b)
  210. return Color.New(a.r - b.r, a.g - b.g, a.b - b.b, a.a - b.a)
  211. end
  212. function Color:Sub(a)
  213. self.r = self.r-a.r
  214. self.g = self.g-a.g
  215. self.b = self.b-a.b
  216. self.a = self.a-a.a
  217. end
  218. Color.__mul = function(a, b)
  219. if type(b) == "number" then
  220. return Color.New(a.r * b, a.g * b, a.b * b, a.a * b)
  221. elseif getmetatable(b) == Color then
  222. return Color.New(a.r * b.r, a.g * b.g, a.b * b.b, a.a * b.a)
  223. end
  224. end
  225. function Color:Mul(b)
  226. if type(b) == "number" then
  227. self.Set(self.r * b, self.g * b, self.b * b, self.a * b)
  228. elseif getmetatable(b) == Color then
  229. self.Set(self.r * b.r, self.g * b.g, self.b * b.b, self.a * b.a)
  230. end
  231. end
  232. Color.__div = function(a, d)
  233. return Color.New(a.r / d, a.g / d, a.b / d, a.a / d)
  234. end
  235. function Color:Div(d)
  236. self:Set(self.r / d, self.g / d, self.b / d, self.a / d)
  237. end
  238. Color.__eq = function(a,b)
  239. if not a.r then
  240. return false
  241. end
  242. return a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a
  243. end
  244. function Color:Equals(other)
  245. return self.r == other.r and self.g == other.g and self.b == other.b and self.a == other.a
  246. end
  247. _getter.red = function() return Color.New(1,0,0,1) end
  248. _getter.green = function() return Color.New(0,1,0,1) end
  249. _getter.blue = function() return Color.New(0,0,1,1) end
  250. _getter.white = function() return Color.New(1,1,1,1) end
  251. _getter.black = function() return Color.New(0,0,0,1) end
  252. _getter.yellow = function() return Color.New(1, 0.9215686, 0.01568628, 1) end
  253. _getter.cyan = function() return Color.New(0,1,1,1) end
  254. _getter.magenta = function() return Color.New(1,0,1,1) end
  255. _getter.gray = function() return Color.New(0.5,0.5,0.5,1) end
  256. _getter.clear = function() return Color.New(0,0,0,0) end
  257. _getter.purple = function() return Color.New(160,32,240) end
  258. _getter.orange = function() return Color.New(255,165,0) end
  259. _getter.gamma = function(c)
  260. return Color.New(Mathf.LinearToGammaSpace(c.r), Mathf.LinearToGammaSpace(c.g), Mathf.LinearToGammaSpace(c.b), c.a)
  261. end
  262. _getter.linear = function(c)
  263. return Color.New(Mathf.GammaToLinearSpace(c.r), Mathf.GammaToLinearSpace(c.g), Mathf.GammaToLinearSpace(c.b), c.a)
  264. end
  265. _getter.maxColorComponent = function(c)
  266. return Mathf.Max(Mathf.Max(c.r, c.g), c.b)
  267. end
  268. _getter.grayscale = Color.GrayScale
  269. Color.unity_color = CS.UnityEngine.Color
  270. CS.UnityEngine.Color = Color
  271. setmetatable(Color, Color)
  272. Color.redNonAlloc = Color.New(1,0,0,1)
  273. Color.greenNonAlloc = Color.New(0,1,0,1)
  274. Color.blueNonAlloc = Color.New(0,0,1,1)
  275. Color.whiteNonAlloc = Color.New(1,1,1,1)
  276. Color.blackNonAlloc = Color.New(0,0,0,1)
  277. Color.yellowNonAlloc = Color.New(1, 0.9215686, 0.01568628, 1)
  278. Color.cyanNonAlloc = Color.New(0,1,1,1)
  279. Color.magentaNonAlloc = Color.New(1,0,1,1)
  280. Color.grayNonAlloc = Color.New(0.5,0.5,0.5,1)
  281. Color.clearNonAlloc = Color.New(0,0,0,0)
  282. Color.purpleNonAlloc = Color.New(160,32,240)
  283. Color.orangeNonAlloc = Color.New(255,165,0)
  284. ---@param c Color
  285. Color.gammaNonAlloc = function(c)
  286. return c:Set(Mathf.LinearToGammaSpace(c.r), Mathf.LinearToGammaSpace(c.g), Mathf.LinearToGammaSpace(c.b), c.a)
  287. end
  288. ---@param c Color
  289. Color.linearNonAlloc = function(c)
  290. return c:Set(Mathf.GammaToLinearSpace(c.r), Mathf.GammaToLinearSpace(c.g), Mathf.GammaToLinearSpace(c.b), c.a)
  291. end