From b9f696675bd91ef1f08c3aac35b8be1d476197cb Mon Sep 17 00:00:00 2001 From: Sumsebrum Date: Sun, 31 Jul 2022 06:04:50 +0200 Subject: [PATCH] cooldown glow --- Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.lua | 711 +++++++++++++++++++ Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.toc | 12 + Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.xml | 4 + Libs/LibCustomGlow-1.0/README.md | 51 ++ Modules/Cooldowns.lua | 49 +- Util.lua | 13 + embeds.xml | 1 + 7 files changed, 838 insertions(+), 3 deletions(-) create mode 100644 Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.lua create mode 100644 Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.toc create mode 100644 Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.xml create mode 100644 Libs/LibCustomGlow-1.0/README.md diff --git a/Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.lua b/Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.lua new file mode 100644 index 0000000..401ed5d --- /dev/null +++ b/Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.lua @@ -0,0 +1,711 @@ +--[[ +This library contains work of Hendrick "nevcairiel" Leppkes +https://www.wowace.com/projects/libbuttonglow-1-0 +]] + +-- luacheck: globals CreateFromMixins ObjectPoolMixin CreateTexturePool CreateFramePool + +local MAJOR_VERSION = "LibCustomGlow-1.0" +local MINOR_VERSION = 16 +if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end +local lib, oldversion = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION) +if not lib then return end +local Masque = LibStub("Masque", true) + +local isRetail = WOW_PROJECT_ID == WOW_PROJECT_MAINLINE +local textureList = { + empty = [[Interface\AdventureMap\BrokenIsles\AM_29]], + white = [[Interface\BUTTONS\WHITE8X8]], + shine = [[Interface\ItemSocketingFrame\UI-ItemSockets]] +} + +local shineCoords = {0.3984375, 0.4453125, 0.40234375, 0.44921875} +if isRetail then + textureList.shine = [[Interface\Artifacts\Artifacts]] + shineCoords = {0.8115234375,0.9169921875,0.8798828125,0.9853515625} +end + +function lib.RegisterTextures(texture,id) + textureList[id] = texture +end + +lib.glowList = {} +lib.startList = {} +lib.stopList = {} + +local GlowParent = UIParent + +local GlowMaskPool = CreateFromMixins(ObjectPoolMixin) +lib.GlowMaskPool = GlowMaskPool +local function MaskPoolFactory(maskPool) + return maskPool.parent:CreateMaskTexture() +end + +local MaskPoolResetter = function(maskPool,mask) + mask:Hide() + mask:ClearAllPoints() +end + +ObjectPoolMixin.OnLoad(GlowMaskPool,MaskPoolFactory,MaskPoolResetter) +GlowMaskPool.parent = GlowParent + +local TexPoolResetter = function(pool,tex) + local maskNum = tex:GetNumMaskTextures() + for i = maskNum,1 do + tex:RemoveMaskTexture(tex:GetMaskTexture(i)) + end + tex:Hide() + tex:ClearAllPoints() +end +local GlowTexPool = CreateTexturePool(GlowParent ,"ARTWORK",7,nil,TexPoolResetter) +lib.GlowTexPool = GlowTexPool + +local FramePoolResetter = function(framePool,frame) + frame:SetScript("OnUpdate",nil) + local parent = frame:GetParent() + if parent[frame.name] then + parent[frame.name] = nil + end + if frame.textures then + for _, texture in pairs(frame.textures) do + GlowTexPool:Release(texture) + end + end + if frame.bg then + GlowTexPool:Release(frame.bg) + frame.bg = nil + end + if frame.masks then + for _,mask in pairs(frame.masks) do + GlowMaskPool:Release(mask) + end + frame.masks = nil + end + frame.textures = {} + frame.info = {} + frame.name = nil + frame.timer = nil + frame:Hide() + frame:ClearAllPoints() +end +local GlowFramePool = CreateFramePool("Frame",GlowParent,nil,FramePoolResetter) +lib.GlowFramePool = GlowFramePool + +local function addFrameAndTex(r,color,name,key,N,xOffset,yOffset,texture,texCoord,desaturated,frameLevel) + key = key or "" + frameLevel = frameLevel or 8 + if not r[name..key] then + r[name..key] = GlowFramePool:Acquire() + r[name..key]:SetParent(r) + r[name..key].name = name..key + end + local f = r[name..key] + f:SetFrameLevel(r:GetFrameLevel()+frameLevel) + f:SetPoint("TOPLEFT",r,"TOPLEFT",-xOffset+0.05,yOffset+0.05) + f:SetPoint("BOTTOMRIGHT",r,"BOTTOMRIGHT",xOffset,-yOffset+0.05) + f:Show() + + if not f.textures then + f.textures = {} + end + + for i=1,N do + if not f.textures[i] then + f.textures[i] = GlowTexPool:Acquire() + f.textures[i]:SetTexture(texture) + f.textures[i]:SetTexCoord(texCoord[1],texCoord[2],texCoord[3],texCoord[4]) + f.textures[i]:SetDesaturated(desaturated) + f.textures[i]:SetParent(f) + f.textures[i]:SetDrawLayer("ARTWORK",7) + if not isRetail and name == "_AutoCastGlow" then + f.textures[i]:SetBlendMode("ADD") + end + end + f.textures[i]:SetVertexColor(color[1],color[2],color[3],color[4]) + f.textures[i]:Show() + end + while #f.textures>N do + GlowTexPool:Release(f.textures[#f.textures]) + table.remove(f.textures) + end +end + + +--Pixel Glow Functions-- +local pCalc1 = function(progress,s,th,p) + local c + if progress>p[3] or progressp[2] then + c =s-th-(progress-p[2])/(p[3]-p[2])*(s-th) + elseif progress>p[1] then + c =s-th + else + c = (progress-p[0])/(p[1]-p[0])*(s-th) + end + return math.floor(c+0.5) +end + +local pCalc2 = function(progress,s,th,p) + local c + if progress>p[3] then + c = s-th-(progress-p[3])/(p[0]+1-p[3])*(s-th) + elseif progress>p[2] then + c = s-th + elseif progress>p[1] then + c = (progress-p[1])/(p[2]-p[1])*(s-th) + elseif progress>p[0] then + c = 0 + else + c = s-th-(progress+1-p[3])/(p[0]+1-p[3])*(s-th) + end + return math.floor(c+0.5) +end + +local pUpdate = function(self,elapsed) + self.timer = self.timer+elapsed/self.info.period + if self.timer>1 or self.timer <-1 then + self.timer = self.timer%1 + end + local progress = self.timer + local width,height = self:GetSize() + if width ~= self.info.width or height ~= self.info.height then + local perimeter = 2*(width+height) + if not (perimeter>0) then + return + end + self.info.width = width + self.info.height = height + self.info.pTLx = { + [0] = (height+self.info.length/2)/perimeter, + [1] = (height+width+self.info.length/2)/perimeter, + [2] = (2*height+width-self.info.length/2)/perimeter, + [3] = 1-self.info.length/2/perimeter + } + self.info.pTLy ={ + [0] = (height-self.info.length/2)/perimeter, + [1] = (height+width+self.info.length/2)/perimeter, + [2] = (height*2+width+self.info.length/2)/perimeter, + [3] = 1-self.info.length/2/perimeter + } + self.info.pBRx ={ + [0] = self.info.length/2/perimeter, + [1] = (height-self.info.length/2)/perimeter, + [2] = (height+width-self.info.length/2)/perimeter, + [3] = (height*2+width+self.info.length/2)/perimeter + } + self.info.pBRy ={ + [0] = self.info.length/2/perimeter, + [1] = (height+self.info.length/2)/perimeter, + [2] = (height+width-self.info.length/2)/perimeter, + [3] = (height*2+width-self.info.length/2)/perimeter + } + end + if self:IsShown() then + if not (self.masks[1]:IsShown()) then + self.masks[1]:Show() + self.masks[1]:SetPoint("TOPLEFT",self,"TOPLEFT",self.info.th,-self.info.th) + self.masks[1]:SetPoint("BOTTOMRIGHT",self,"BOTTOMRIGHT",-self.info.th,self.info.th) + end + if self.masks[2] and not(self.masks[2]:IsShown()) then + self.masks[2]:Show() + self.masks[2]:SetPoint("TOPLEFT",self,"TOPLEFT",self.info.th+1,-self.info.th-1) + self.masks[2]:SetPoint("BOTTOMRIGHT",self,"BOTTOMRIGHT",-self.info.th-1,self.info.th+1) + end + if self.bg and not(self.bg:IsShown()) then + self.bg:Show() + end + for k,line in pairs(self.textures) do + line:SetPoint("TOPLEFT",self,"TOPLEFT",pCalc1((progress+self.info.step*(k-1))%1,width,self.info.th,self.info.pTLx),-pCalc2((progress+self.info.step*(k-1))%1,height,self.info.th,self.info.pTLy)) + line:SetPoint("BOTTOMRIGHT",self,"TOPLEFT",self.info.th+pCalc2((progress+self.info.step*(k-1))%1,width,self.info.th,self.info.pBRx),-height+pCalc1((progress+self.info.step*(k-1))%1,height,self.info.th,self.info.pBRy)) + end + end +end + +function lib.PixelGlow_Start(r,color,N,frequency,length,th,xOffset,yOffset,border,key,frameLevel) + if not r then + return + end + if not color then + color = {0.95,0.95,0.32,1} + end + + if not(N and N>0) then + N = 8 + end + + local period + if frequency then + if not(frequency>0 or frequency<0) then + period = 4 + else + period = 1/frequency + end + else + period = 4 + end + local width,height = r:GetSize() + length = length or math.floor((width+height)*(2/N-0.1)) + length = min(length,min(width,height)) + th = th or 1 + xOffset = xOffset or 0 + yOffset = yOffset or 0 + key = key or "" + + addFrameAndTex(r,color,"_PixelGlow",key,N,xOffset,yOffset,textureList.white,{0,1,0,1},nil,frameLevel) + local f = r["_PixelGlow"..key] + if not f.masks then + f.masks = {} + end + if not f.masks[1] then + f.masks[1] = GlowMaskPool:Acquire() + f.masks[1]:SetTexture(textureList.empty, "CLAMPTOWHITE","CLAMPTOWHITE") + f.masks[1]:Show() + end + f.masks[1]:SetPoint("TOPLEFT",f,"TOPLEFT",th,-th) + f.masks[1]:SetPoint("BOTTOMRIGHT",f,"BOTTOMRIGHT",-th,th) + + if not(border==false) then + if not f.masks[2] then + f.masks[2] = GlowMaskPool:Acquire() + f.masks[2]:SetTexture(textureList.empty, "CLAMPTOWHITE","CLAMPTOWHITE") + end + f.masks[2]:SetPoint("TOPLEFT",f,"TOPLEFT",th+1,-th-1) + f.masks[2]:SetPoint("BOTTOMRIGHT",f,"BOTTOMRIGHT",-th-1,th+1) + + if not f.bg then + f.bg = GlowTexPool:Acquire() + f.bg:SetColorTexture(0.1,0.1,0.1,0.8) + f.bg:SetParent(f) + f.bg:SetAllPoints(f) + f.bg:SetDrawLayer("ARTWORK",6) + f.bg:AddMaskTexture(f.masks[2]) + end + else + if f.bg then + GlowTexPool:Release(f.bg) + f.bg = nil + end + if f.masks[2] then + GlowMaskPool:Release(f.masks[2]) + f.masks[2] = nil + end + end + for _,tex in pairs(f.textures) do + if tex:GetNumMaskTextures() < 1 then + tex:AddMaskTexture(f.masks[1]) + end + end + f.timer = f.timer or 0 + f.info = f.info or {} + f.info.step = 1/N + f.info.period = period + f.info.th = th + if f.info.length ~= length then + f.info.width = nil + f.info.length = length + end + pUpdate(f, 0) + f:SetScript("OnUpdate",pUpdate) +end + +function lib.PixelGlow_Stop(r,key) + if not r then + return + end + key = key or "" + if not r["_PixelGlow"..key] then + return false + else + GlowFramePool:Release(r["_PixelGlow"..key]) + end +end + +table.insert(lib.glowList, "Pixel Glow") +lib.startList["Pixel Glow"] = lib.PixelGlow_Start +lib.stopList["Pixel Glow"] = lib.PixelGlow_Stop + + +--Autocast Glow Funcitons-- +local function acUpdate(self,elapsed) + local width,height = self:GetSize() + if width ~= self.info.width or height ~= self.info.height then + if width*height == 0 then return end -- Avoid division by zero + self.info.width = width + self.info.height = height + self.info.perimeter = 2*(width+height) + self.info.bottomlim = height*2+width + self.info.rightlim = height+width + self.info.space = self.info.perimeter/self.info.N + end + + local texIndex = 0; + for k=1,4 do + self.timer[k] = self.timer[k]+elapsed/(self.info.period*k) + if self.timer[k] > 1 or self.timer[k] <-1 then + self.timer[k] = self.timer[k]%1 + end + for i = 1,self.info.N do + texIndex = texIndex+1 + local position = (self.info.space*i+self.info.perimeter*self.timer[k])%self.info.perimeter + if position>self.info.bottomlim then + self.textures[texIndex]: SetPoint("CENTER",self,"BOTTOMRIGHT",-position+self.info.bottomlim,0) + elseif position>self.info.rightlim then + self.textures[texIndex]: SetPoint("CENTER",self,"TOPRIGHT",0,-position+self.info.rightlim) + elseif position>self.info.height then + self.textures[texIndex]: SetPoint("CENTER",self,"TOPLEFT",position-self.info.height,0) + else + self.textures[texIndex]: SetPoint("CENTER",self,"BOTTOMLEFT",0,position) + end + end + end +end + +function lib.AutoCastGlow_Start(r,color,N,frequency,scale,xOffset,yOffset,key,frameLevel) + if not r then + return + end + + if not color then + color = {0.95,0.95,0.32,1} + end + + if not(N and N>0) then + N = 4 + end + + local period + if frequency then + if not(frequency>0 or frequency<0) then + period = 8 + else + period = 1/frequency + end + else + period = 8 + end + scale = scale or 1 + xOffset = xOffset or 0 + yOffset = yOffset or 0 + key = key or "" + + addFrameAndTex(r,color,"_AutoCastGlow",key,N*4,xOffset,yOffset,textureList.shine,shineCoords, true, frameLevel) + local f = r["_AutoCastGlow"..key] + local sizes = {7,6,5,4} + for k,size in pairs(sizes) do + for i = 1,N do + f.textures[i+N*(k-1)]:SetSize(size*scale,size*scale) + end + end + f.timer = f.timer or {0,0,0,0} + f.info = f.info or {} + f.info.N = N + f.info.period = period + f:SetScript("OnUpdate",acUpdate) +end + +function lib.AutoCastGlow_Stop(r,key) + if not r then + return + end + + key = key or "" + if not r["_AutoCastGlow"..key] then + return false + else + GlowFramePool:Release(r["_AutoCastGlow"..key]) + end +end + +table.insert(lib.glowList, "Autocast Shine") +lib.startList["Autocast Shine"] = lib.AutoCastGlow_Start +lib.stopList["Autocast Shine"] = lib.AutoCastGlow_Stop + +--Action Button Glow-- +local function ButtonGlowResetter(framePool,frame) + frame:SetScript("OnUpdate",nil) + local parent = frame:GetParent() + if parent._ButtonGlow then + parent._ButtonGlow = nil + end + frame:Hide() + frame:ClearAllPoints() +end +local ButtonGlowPool = CreateFramePool("Frame",GlowParent,nil,ButtonGlowResetter) +lib.ButtonGlowPool = ButtonGlowPool + +local function CreateScaleAnim(group, target, order, duration, x, y, delay) + local scale = group:CreateAnimation("Scale") + scale:SetChildKey(target) + scale:SetOrder(order) + scale:SetDuration(duration) + scale:SetScale(x, y) + + if delay then + scale:SetStartDelay(delay) + end +end + +local function CreateAlphaAnim(group, target, order, duration, fromAlpha, toAlpha, delay, appear) + local alpha = group:CreateAnimation("Alpha") + alpha:SetChildKey(target) + alpha:SetOrder(order) + alpha:SetDuration(duration) + alpha:SetFromAlpha(fromAlpha) + alpha:SetToAlpha(toAlpha) + if delay then + alpha:SetStartDelay(delay) + end + if appear then + table.insert(group.appear, alpha) + else + table.insert(group.fade, alpha) + end +end + +local function AnimIn_OnPlay(group) + local frame = group:GetParent() + local frameWidth, frameHeight = frame:GetSize() + frame.spark:SetSize(frameWidth, frameHeight) + frame.spark:SetAlpha(not(frame.color) and 1.0 or 0.3*frame.color[4]) + frame.innerGlow:SetSize(frameWidth / 2, frameHeight / 2) + frame.innerGlow:SetAlpha(not(frame.color) and 1.0 or frame.color[4]) + frame.innerGlowOver:SetAlpha(not(frame.color) and 1.0 or frame.color[4]) + frame.outerGlow:SetSize(frameWidth * 2, frameHeight * 2) + frame.outerGlow:SetAlpha(not(frame.color) and 1.0 or frame.color[4]) + frame.outerGlowOver:SetAlpha(not(frame.color) and 1.0 or frame.color[4]) + frame.ants:SetSize(frameWidth * 0.85, frameHeight * 0.85) + frame.ants:SetAlpha(0) + frame:Show() +end + +local function AnimIn_OnFinished(group) + local frame = group:GetParent() + local frameWidth, frameHeight = frame:GetSize() + frame.spark:SetAlpha(0) + frame.innerGlow:SetAlpha(0) + frame.innerGlow:SetSize(frameWidth, frameHeight) + frame.innerGlowOver:SetAlpha(0.0) + frame.outerGlow:SetSize(frameWidth, frameHeight) + frame.outerGlowOver:SetAlpha(0.0) + frame.outerGlowOver:SetSize(frameWidth, frameHeight) + frame.ants:SetAlpha(not(frame.color) and 1.0 or frame.color[4]) +end + +local function AnimIn_OnStop(group) + local frame = group:GetParent() + local frameWidth, frameHeight = frame:GetSize() + frame.spark:SetAlpha(0) + frame.innerGlow:SetAlpha(0) + frame.innerGlowOver:SetAlpha(0.0) + frame.outerGlowOver:SetAlpha(0.0) +end + +local function bgHide(self) + if self.animOut:IsPlaying() then + self.animOut:Stop() + ButtonGlowPool:Release(self) + end +end + +local function bgUpdate(self, elapsed) + AnimateTexCoords(self.ants, 256, 256, 48, 48, 22, elapsed, self.throttle); + local cooldown = self:GetParent().cooldown; + if(cooldown and cooldown:IsShown() and cooldown:GetCooldownDuration() > 3000) then + self:SetAlpha(0.5); + else + self:SetAlpha(1.0); + end +end + +local function configureButtonGlow(f,alpha) + f.spark = f:CreateTexture(nil, "BACKGROUND") + f.spark:SetPoint("CENTER") + f.spark:SetAlpha(0) + f.spark:SetTexture([[Interface\SpellActivationOverlay\IconAlert]]) + f.spark:SetTexCoord(0.00781250, 0.61718750, 0.00390625, 0.26953125) + + -- inner glow + f.innerGlow = f:CreateTexture(nil, "ARTWORK") + f.innerGlow:SetPoint("CENTER") + f.innerGlow:SetAlpha(0) + f.innerGlow:SetTexture([[Interface\SpellActivationOverlay\IconAlert]]) + f.innerGlow:SetTexCoord(0.00781250, 0.50781250, 0.27734375, 0.52734375) + + -- inner glow over + f.innerGlowOver = f:CreateTexture(nil, "ARTWORK") + f.innerGlowOver:SetPoint("TOPLEFT", f.innerGlow, "TOPLEFT") + f.innerGlowOver:SetPoint("BOTTOMRIGHT", f.innerGlow, "BOTTOMRIGHT") + f.innerGlowOver:SetAlpha(0) + f.innerGlowOver:SetTexture([[Interface\SpellActivationOverlay\IconAlert]]) + f.innerGlowOver:SetTexCoord(0.00781250, 0.50781250, 0.53515625, 0.78515625) + + -- outer glow + f.outerGlow = f:CreateTexture(nil, "ARTWORK") + f.outerGlow:SetPoint("CENTER") + f.outerGlow:SetAlpha(0) + f.outerGlow:SetTexture([[Interface\SpellActivationOverlay\IconAlert]]) + f.outerGlow:SetTexCoord(0.00781250, 0.50781250, 0.27734375, 0.52734375) + + -- outer glow over + f.outerGlowOver = f:CreateTexture(nil, "ARTWORK") + f.outerGlowOver:SetPoint("TOPLEFT", f.outerGlow, "TOPLEFT") + f.outerGlowOver:SetPoint("BOTTOMRIGHT", f.outerGlow, "BOTTOMRIGHT") + f.outerGlowOver:SetAlpha(0) + f.outerGlowOver:SetTexture([[Interface\SpellActivationOverlay\IconAlert]]) + f.outerGlowOver:SetTexCoord(0.00781250, 0.50781250, 0.53515625, 0.78515625) + + -- ants + f.ants = f:CreateTexture(nil, "OVERLAY") + f.ants:SetPoint("CENTER") + f.ants:SetAlpha(0) + f.ants:SetTexture([[Interface\SpellActivationOverlay\IconAlertAnts]]) + + f.animIn = f:CreateAnimationGroup() + f.animIn.appear = {} + f.animIn.fade = {} + CreateScaleAnim(f.animIn, "spark", 1, 0.2, 1.5, 1.5) + CreateAlphaAnim(f.animIn, "spark", 1, 0.2, 0, alpha, nil, true) + CreateScaleAnim(f.animIn, "innerGlow", 1, 0.3, 2, 2) + CreateScaleAnim(f.animIn, "innerGlowOver", 1, 0.3, 2, 2) + CreateAlphaAnim(f.animIn, "innerGlowOver", 1, 0.3, alpha, 0, nil, false) + CreateScaleAnim(f.animIn, "outerGlow", 1, 0.3, 0.5, 0.5) + CreateScaleAnim(f.animIn, "outerGlowOver", 1, 0.3, 0.5, 0.5) + CreateAlphaAnim(f.animIn, "outerGlowOver", 1, 0.3, alpha, 0, nil, false) + CreateScaleAnim(f.animIn, "spark", 1, 0.2, 2/3, 2/3, 0.2) + CreateAlphaAnim(f.animIn, "spark", 1, 0.2, alpha, 0, 0.2, false) + CreateAlphaAnim(f.animIn, "innerGlow", 1, 0.2, alpha, 0, 0.3, false) + CreateAlphaAnim(f.animIn, "ants", 1, 0.2, 0, alpha, 0.3, true) + f.animIn:SetScript("OnPlay", AnimIn_OnPlay) + f.animIn:SetScript("OnStop", AnimIn_OnStop) + f.animIn:SetScript("OnFinished", AnimIn_OnFinished) + + f.animOut = f:CreateAnimationGroup() + f.animOut.appear = {} + f.animOut.fade = {} + CreateAlphaAnim(f.animOut, "outerGlowOver", 1, 0.2, 0, alpha, nil, true) + CreateAlphaAnim(f.animOut, "ants", 1, 0.2, alpha, 0, nil, false) + CreateAlphaAnim(f.animOut, "outerGlowOver", 2, 0.2, alpha, 0, nil, false) + CreateAlphaAnim(f.animOut, "outerGlow", 2, 0.2, alpha, 0, nil, false) + f.animOut:SetScript("OnFinished", function(self) ButtonGlowPool:Release(self:GetParent()) end) + + f:SetScript("OnHide", bgHide) +end + +local function updateAlphaAnim(f,alpha) + for _,anim in pairs(f.animIn.appear) do + anim:SetToAlpha(alpha) + end + for _,anim in pairs(f.animIn.fade) do + anim:SetFromAlpha(alpha) + end + for _,anim in pairs(f.animOut.appear) do + anim:SetToAlpha(alpha) + end + for _,anim in pairs(f.animOut.fade) do + anim:SetFromAlpha(alpha) + end +end + +local ButtonGlowTextures = {["spark"] = true,["innerGlow"] = true,["innerGlowOver"] = true,["outerGlow"] = true,["outerGlowOver"] = true,["ants"] = true} + +function lib.ButtonGlow_Start(r,color,frequency,frameLevel) + if not r then + return + end + frameLevel = frameLevel or 8; + local throttle + if frequency and frequency > 0 then + throttle = 0.25/frequency*0.01 + else + throttle = 0.01 + end + if r._ButtonGlow then + local f = r._ButtonGlow + local width,height = r:GetSize() + f:SetFrameLevel(r:GetFrameLevel()+frameLevel) + f:SetSize(width*1.4 , height*1.4) + f:SetPoint("TOPLEFT", r, "TOPLEFT", -width * 0.2, height * 0.2) + f:SetPoint("BOTTOMRIGHT", r, "BOTTOMRIGHT", width * 0.2, -height * 0.2) + f.ants:SetSize(width*1.4*0.85, height*1.4*0.85) + AnimIn_OnFinished(f.animIn) + if f.animOut:IsPlaying() then + f.animOut:Stop() + f.animIn:Play() + end + + if not(color) then + for texture in pairs(ButtonGlowTextures) do + f[texture]:SetDesaturated(nil) + f[texture]:SetVertexColor(1,1,1) + f[texture]:SetAlpha(f[texture]:GetAlpha()/(f.color and f.color[4] or 1)) + updateAlphaAnim(f, 1) + end + f.color = false + else + for texture in pairs(ButtonGlowTextures) do + f[texture]:SetDesaturated(1) + f[texture]:SetVertexColor(color[1],color[2],color[3]) + f[texture]:SetAlpha(f[texture]:GetAlpha()/(f.color and f.color[4] or 1)*color[4]) + updateAlphaAnim(f,color and color[4] or 1) + end + f.color = color + end + f.throttle = throttle + else + local f, new = ButtonGlowPool:Acquire() + if new then + configureButtonGlow(f,color and color[4] or 1) + else + updateAlphaAnim(f,color and color[4] or 1) + end + r._ButtonGlow = f + local width,height = r:GetSize() + f:SetParent(r) + f:SetFrameLevel(r:GetFrameLevel()+frameLevel) + f:SetSize(width * 1.4, height * 1.4) + f:SetPoint("TOPLEFT", r, "TOPLEFT", -width * 0.2, height * 0.2) + f:SetPoint("BOTTOMRIGHT", r, "BOTTOMRIGHT", width * 0.2, -height * 0.2) + if not(color) then + f.color = false + for texture in pairs(ButtonGlowTextures) do + f[texture]:SetDesaturated(nil) + f[texture]:SetVertexColor(1,1,1) + end + else + f.color = color + for texture in pairs(ButtonGlowTextures) do + f[texture]:SetDesaturated(1) + f[texture]:SetVertexColor(color[1],color[2],color[3]) + end + end + f.throttle = throttle + f:SetScript("OnUpdate", bgUpdate) + + f.animIn:Play() + + if Masque and Masque.UpdateSpellAlert and (not r.overlay or not issecurevariable(r, "overlay")) then + local old_overlay = r.overlay + r.overlay = f + Masque:UpdateSpellAlert(r) + r.overlay = old_overlay + end + end +end + +function lib.ButtonGlow_Stop(r) + if r._ButtonGlow then + if r._ButtonGlow.animIn:IsPlaying() then + r._ButtonGlow.animIn:Stop() + ButtonGlowPool:Release(r._ButtonGlow) + elseif r:IsVisible() then + r._ButtonGlow.animOut:Play() + else + ButtonGlowPool:Release(r._ButtonGlow) + end + end +end + +table.insert(lib.glowList, "Action Button Glow") +lib.startList["Action Button Glow"] = lib.ButtonGlow_Start +lib.stopList["Action Button Glow"] = lib.ButtonGlow_Stop diff --git a/Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.toc b/Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.toc new file mode 100644 index 0000000..a98553b --- /dev/null +++ b/Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.toc @@ -0,0 +1,12 @@ +## Interface: 80200 +## Title: Lib: CustomGlow +## Notes: Creates custom glow functions +## Author: deezo +## X-Category: Library +## X-License: BSD +## Version: f15e6de +## OptionalDeps: Masque + +LibStub\LibStub.lua + +LibCustomGlow-1.0.xml diff --git a/Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.xml b/Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.xml new file mode 100644 index 0000000..c93a784 --- /dev/null +++ b/Libs/LibCustomGlow-1.0/LibCustomGlow-1.0.xml @@ -0,0 +1,4 @@ + +