--[[ The existance of this source file is to allow WIM to run in its own AnimationSystem.lua environment. Until WoW 3.1 is released, this will be needed to avoid taint issues with the Vehicle Unit Frame (VUF). Since the VUF uses the same system, if WIM has an animation executing the same time VUF does, it causes VUF to be tainted and blocked. A poor design on Blizzard's part. Trust me, I don't want un-needed code packaged in WIM either. ]] --[[ animTable = { --Note that only consistent data should be in here. These tables are meant to be shared across "sessions" of animations. Put changing data in the frame. totalTime = number, --Time to complete the animation in seconds. updateFunc = function, --The function called to do the actual change. Takes self, elapsed fraction. Usually frame.SetPoint, frame.SetAlpha, ect. getPosFunc = function, --The function returning the data being passed into updateFunc. For example. might return .18 if updateFunc is frame.SetAlpha. --]] -- imports local WIM = WIM; local _G = _G; local table = table; local type = type; local pairs = pairs; -- set namespace setfenv(1, WIM); local AnimatingFrames = {}; local AnimUpdateFrame = _G.CreateFrame("Frame"); local function Animation_UpdateFrame(self, animElapsed, animTable) local totalTime = animTable.totalTime if ( animElapsed and (animElapsed < totalTime)) then --Should be animating local elapsedFraction = self.animReverse and (1-animElapsed/totalTime) or (animElapsed/totalTime); animTable.updateFunc(self, animTable.getPosFunc(self, elapsedFraction)); else --Just finished animating animTable.updateFunc(self, animTable.getPosFunc(self, self.animReverse and 0 or 1)); self.animating = false; AnimatingFrames[self][animTable.updateFunc] = 0; --We use 0 instead of nil'ing out because we don't want to mess with 'next' (used in pairs) if ( self.animPostFunc ) then self.animPostFunc(self); end end end local totalElapsed = 0; local function Animation_OnUpdate(self, elapsed) totalElapsed = totalElapsed + elapsed; local isAnyFrameAnimating = false; for frame, frameTable in pairs(AnimatingFrames) do for frameTable, animTable in pairs(frameTable) do if ( animTable ~= 0 ) then Animation_UpdateFrame(frame, totalElapsed - frame.animStartTime, animTable); isAnyFrameAnimating = true; end end end if ( not isAnyFrameAnimating ) then table.wipe(AnimatingFrames); AnimUpdateFrame:SetScript("OnUpdate", nil); end end -- WIM API function SetUpAnimation(frame, animTable, postFunc, reverse) if ( type(animTable.updateFunc) == "string" ) then animTable.updateFunc = frame[animTable.updateFunc]; end if ( not AnimatingFrames[frame] ) then AnimatingFrames[frame] = {}; end AnimatingFrames[frame][animTable.updateFunc] = animTable; frame.animStartTime = totalElapsed; frame.animReverse = reverse; frame.animPostFunc = postFunc; frame.animating = true; animTable.updateFunc(frame, animTable.getPosFunc(frame, frame.animReverse and 1 or 0)); AnimUpdateFrame:SetScript("OnUpdate", Animation_OnUpdate); end