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.

117 lines
3.5 KiB

4 years ago
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