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.

85 lines
3.1 KiB

--[[
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 _, 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