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.
116 lines
3.5 KiB
116 lines
3.5 KiB
local FREQUENCY = 0.25;
|
|
local NUM_BLIPS = 10 --math.floor(1.5/FREQUENCY);
|
|
local INDEX = 1;
|
|
|
|
local BLIP_RANGE_Y = 20;
|
|
local FPS_CEILING = 60;
|
|
local FPS_FLOOR = 50;
|
|
local FPS_RANGE = 10;
|
|
|
|
local GetFramerate = GetFramerate;
|
|
|
|
local function GetBlipColor(fps)
|
|
local ratio = (fps - 30)*0.033;
|
|
if ratio >= 1 then
|
|
return 0, 1, 0
|
|
elseif ratio > 0.5 then
|
|
return 1 - (ratio - 0.5)*2, 1, 0
|
|
else
|
|
return 1, ratio*2, 0
|
|
end
|
|
end
|
|
|
|
local function GetOffsetY(fps)
|
|
return fps*2
|
|
end
|
|
|
|
local function GetFPS(offsetY)
|
|
return offsetY*FPS_RANGE/BLIP_RANGE_Y + FPS_FLOOR
|
|
end
|
|
|
|
NarciFramerateIndicatorMixin = {};
|
|
|
|
function NarciFramerateIndicatorMixin:OnLoad()
|
|
self.y0 = 0;
|
|
end
|
|
|
|
function NarciFramerateIndicatorMixin:OnShow()
|
|
self.t = 0;
|
|
INDEX = 1;
|
|
self.lastFPS = GetFramerate();
|
|
self.bottomFPS = self.lastFPS;
|
|
self.offsetY = -GetOffsetY(self.bottomFPS);
|
|
self.RefTexture:SetPoint("CENTER", self, "CENTER", 0, self.offsetY);
|
|
self.fromY = GetOffsetY(self.lastFPS);
|
|
self.toY = self.fromY;
|
|
self.lastY = 0;
|
|
if not self.blips then
|
|
self.blips = {};
|
|
end
|
|
end
|
|
|
|
function NarciFramerateIndicatorMixin:AcquireBlip()
|
|
local blip = self.blips[INDEX];
|
|
if not blip then
|
|
self.blips[INDEX] = self:CreateTexture(nil, "OVERLAY", "NarciFramerateIndictorBlipTemplate");
|
|
blip = self.blips[INDEX];
|
|
end
|
|
blip:ClearAllPoints();
|
|
blip.AnimFade:Stop();
|
|
INDEX = INDEX + 1;
|
|
if INDEX > NUM_BLIPS then
|
|
INDEX = 1;
|
|
end
|
|
return blip
|
|
end
|
|
|
|
function NarciFramerateIndicatorMixin:OnUpdate(elapsed)
|
|
self.t = self.t + elapsed;
|
|
if self.t >= FREQUENCY then
|
|
self.t = self.t - FREQUENCY;
|
|
self.fromY = self.toY;
|
|
else
|
|
--local fps = GetFramerate();
|
|
self.ratio = self.t/FREQUENCY;
|
|
self.y = (1 - self.ratio)*self.fromY + (self.ratio)*self.toY;
|
|
local dY = self.offsetY + self.y;
|
|
--[[
|
|
if dY > 8 or dY < -8 then
|
|
if dY > 0 then
|
|
self.offsetY = self.offsetY - dY + 8;
|
|
else
|
|
self.offsetY = self.offsetY - dY - 8;
|
|
end
|
|
self.RefTexture:SetPoint("CENTER", self, "CENTER", 0, self.offsetY);
|
|
--]]
|
|
if dY > 1 or dY < -1 then
|
|
local d;
|
|
if dY > 16 or -dY < 16 then
|
|
d = 16;
|
|
elseif dY > 8 or -dY < -8 then
|
|
d = 4;
|
|
else
|
|
d = 4;
|
|
end
|
|
self.offsetY = self.offsetY - dY * elapsed * d;
|
|
self.RefTexture:SetPoint("CENTER", self, "CENTER", 0, self.offsetY);
|
|
end
|
|
self.MainBlip:SetPoint("CENTER", self.RefTexture, "BOTTOM", 0, self.y);
|
|
self.MainBlip:SetVertexColor(GetBlipColor(self.y));
|
|
if (self.y - self.lastY) > 4 or (self.y - self.lastY) < -4 then
|
|
local blip = self:AcquireBlip();
|
|
blip:SetPoint("CENTER", self.RefTexture, "BOTTOM", 0, self.y);
|
|
blip:SetVertexColor(GetBlipColor(self.y));
|
|
blip.AnimFade:Play();
|
|
self.lastY = self.y;
|
|
end
|
|
return
|
|
end
|
|
local fps = GetFramerate();
|
|
self.FPSText:SetText(string.format("%.1f", fps));
|
|
self.toY = GetOffsetY(fps);
|
|
local blip = self:AcquireBlip();
|
|
blip:SetPoint("CENTER", self.RefTexture, "BOTTOM", 0, self.fromY);
|
|
blip.AnimFade:Play();
|
|
blip:SetVertexColor(GetBlipColor(self.fromY));
|
|
end
|
|
|