Files
wnsrc/lua/includes/util/color.lua

142 lines
3.5 KiB
Lua
Raw Normal View History

2024-08-04 22:55:00 +03:00
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local COLOR = {}
COLOR.__index = COLOR
--[[---------------------------------------------------------
Register our metatable to make it accessible using FindMetaTable
-----------------------------------------------------------]]
debug.getregistry().Color = COLOR
--[[---------------------------------------------------------
To easily create a color table
-----------------------------------------------------------]]
function Color( r, g, b, a )
a = a or 255
return setmetatable( { r = math.min( tonumber(r), 255 ), g = math.min( tonumber(g), 255 ), b = math.min( tonumber(b), 255 ), a = math.min( tonumber(a), 255 ) }, COLOR )
end
--[[---------------------------------------------------------
Change the alpha of a color
-----------------------------------------------------------]]
function ColorAlpha( c, a )
return Color( c.r, c.g, c.b, a )
end
--[[---------------------------------------------------------
Checks if the given varible is a color object
-----------------------------------------------------------]]
function IsColor( obj )
return getmetatable(obj) == COLOR
end
--[[---------------------------------------------------------
Returns color as a string
-----------------------------------------------------------]]
function COLOR:__tostring()
return string.format( "%d %d %d %d", self.r, self.g, self.b, self.a )
end
--[[---------------------------------------------------------
Compares two colors
-----------------------------------------------------------]]
function COLOR:__eq( c )
return self.r == c.r and self.g == c.g and self.b == c.b and self.a == c.a
end
--[[---------------------------------------------------------
Converts a color to HSL color space
-----------------------------------------------------------]]
function COLOR:ToHSL()
return ColorToHSL( self )
end
--[[---------------------------------------------------------
Converts a color to HSV
-----------------------------------------------------------]]
function COLOR:ToHSV()
return ColorToHSV( self )
end
--[[---------------------------------------------------------
Converts color to vector - loss of precision / alpha lost
-----------------------------------------------------------]]
function COLOR:ToVector()
return Vector( self.r / 255, self.g / 255, self.b / 255 )
end
--[[---------------------------------------------------------
Unpacks the color into four variables
-----------------------------------------------------------]]
function COLOR:Unpack()
return self.r, self.g, self.b, self.a
end
function COLOR:Lerp( target_clr, frac )
return Color( Lerp( frac, self.r, target_clr.r ), Lerp( frac, self.g, target_clr.g ), Lerp( frac, self.b, target_clr.b ), Lerp( frac, self.a, target_clr.a ) )
end
function COLOR:SetUnpacked( r, g, b, a )
self.r = r or 255
self.g = g or 255
self.b = b or 255
self.a = a or 255
end
function COLOR:ToTable()
return { self.r, self.g, self.b, self.a }
end
local imat = FindMetaTable( "IMaterial" )
if ( imat.GetColor4Part ) then
function imat:GetColor( ... )
return Color( self:GetColor4Part( ... ) )
end
else
-- For those clients that do not have the above function yet
-- TODO: Delete me
local oldGetColor = imat.GetColor
function imat:GetColor( ... )
local tbl = oldGetColor( self, ... )
return Color( tbl.r, tbl.g, tbl.b, tbl.a )
end
end