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.

240 lines
6.3 KiB

local sin = math.sin;
local sqrt = math.sqrt;
local abs = math.abs;
local PI = math.pi;
local function outSine(t, b, c, d)
return c * sin(t / d * (PI / 2)) + b
end
local AR = CreateFrame("Frame", "NarciAR");
local TurningFrame = CreateFrame("Frame", nil, AR);
NarciAR.Turning = TurningFrame;
TurningFrame:Hide();
AR:SetScript("OnHide", function(self)
self.Turning:Hide();
end)
local GetFacing = GetPlayerFacing;
if not GetFacing then return; end;
local VirtualLineRight = Narci_VirtualLineRight;
local VirtualLineLeft = Narci_VirtualLineLeft;
local _, _, _, rightBase = VirtualLineRight:GetPoint();
local _, _, _, leftBase = VirtualLineLeft:GetPoint();
local function UpdateReferenceLine(offset, multiplier)
local ScaledOffset = offset * multiplier; --Strengh
VirtualLineRight:ClearAllPoints();
VirtualLineRight:SetPoint("RIGHT", rightBase + ScaledOffset, 0);
VirtualLineLeft:ClearAllPoints();
VirtualLineLeft:SetPoint("LEFT", leftBase + ScaledOffset, 0);
end
AR.UpdateReferenceLine = UpdateReferenceLine;
local VLUF = CreateFrame("Frame", nil, NarciAR); --VirtualLineUpdateFrame
NarciAR.VirtualLineUpdateFrame = VLUF;
VLUF:Hide();
local function VLUF_OnLoad(self)
self.t = 0;
self.duration = 0.25;
end
local function VLUF_OnShow(self)
self.t = 0;
if TurningFrame.offset == 0 then
self:Hide();
return;
end;
self.duration = math.max(0.1, sqrt(abs(TurningFrame.offset /10)) );
--print(TurningFrame.offset);
end
local function VLUF_OnUpdate(self, elapsed)
local startOffset = TurningFrame.offset;
local offset = outSine(self.t, startOffset, 0 - startOffset, self.duration);
self.t = self.t + elapsed;
if self.t >= self.duration then
offset = 0;
self:Hide();
end
UpdateReferenceLine(offset, 5);
TurningFrame.offset = offset;
end
VLUF:SetScript("OnLoad", VLUF_OnLoad);
VLUF:SetScript("OnUpdate", VLUF_OnUpdate);
VLUF:SetScript("OnShow", VLUF_OnShow);
TurningFrame.velocity = 0;
TurningFrame.radian = 0;
TurningFrame.diff = 0;
TurningFrame.offset = 0;
TurningFrame.threshhold = 20;
local function Turning_OnUpdate(self, elapsed)
local radian = GetFacing();
if not radian then return; end;
local diff = radian - self.radian;
self.radian = radian;
--if diff ~= 0 then print(diff); end
if diff > PI then
diff = -2*PI + diff;
elseif diff < - PI then
diff = 2*PI + diff;
end
self.offset = self.offset + diff;
local velocity = (diff) / elapsed;
local acceleration = (velocity - self.velocity) / elapsed;
self.velocity = velocity;
UpdateReferenceLine(self.offset, 5);
if acceleration < self.threshhold and acceleration > -self.threshhold then
--acceleration < 1 and acceleration ~=0 and acceleration > -1
if self.offset ~=0 then
VLUF:Show();
end
else
VLUF:Hide();
end
end
local function Turning_OnHide(self)
--UpdateReferenceLine(0);
VLUF:Show();
end
local function Turning_OnShow(self)
VLUF:Hide();
end
TurningFrame:SetScript("OnUpdate", Turning_OnUpdate);
TurningFrame:SetScript("OnHide", Turning_OnHide);
TurningFrame:SetScript("OnShow", Turning_OnShow);
--GamePad
local GamePadTurning = CreateFrame("Frame", nil, AR);
NarciAR.GamePadTurning = GamePadTurning;
GamePadTurning:Hide();
GamePadTurning.angle = 0;
GamePadTurning.threshhold = 20;
GamePadTurning.offset = 0;
local function GamePadTurning_OnUpdate(self, elapsed)
local newOffset = self.newOffset;
if not newOffset then return; end;
self.offset = self.offset + (newOffset - self.offset)*10*elapsed;
if (newOffset == 0) and (self.offset > -0.01 and self.offset < 0.01) then
self.offset = 0;
self:Hide();
end
UpdateReferenceLine(self.offset, 20);
--print(self.offset);
end
GamePadTurning:SetScript("OnShow", Turning_OnShow);
GamePadTurning:SetScript("OnUpdate", GamePadTurning_OnUpdate);
function GamePadTurning:Start(joyStickOffsetX)
self.newOffset = joyStickOffsetX;
self:Show();
end
--Public
--[[
local function CalculateScale(zoom)
return -0.1486*pow(zoom, 3) + 3.7573*pow(zoom, 2) - 32.864*zoom + 112.36
end
NarciARMixin = {};
function CreateNarciAR(x, y)
local vector = CreateFromMixins(NarciARMixin);
vector:OnLoad(x, y);
return vector;
end
function NarciARMixin:OnLoad(x, y)
self.x = x;
self.y = y;
self.scale = 1;
self.SetScale = SetScale;
self.SetPoint = SetPoint;
end
function NarciARMixin:UpdateScale(scale)
self:SetScale(scale)
self:SetPoint("CENTER", nil, self.x * scale, self.y * scale);
end
local function UpdateScale(frame, scale)
if scale <= 0 then return; end
frame:SetScale(scale)
frame:SetPoint("CENTER", nil, frame.x * sqrt(scale), frame.y * sqrt(scale));
end
--NarciAR = CreateNarciAR(-50, 50);
local function LoadFrame(frame, x, y)
if not frame then return; end
frame.x = x;
frame.y = y;
end
local initialize = CreateFrame("Frame")
initialize:RegisterEvent("VARIABLES_LOADED");
initialize:SetScript("OnEvent",function(self,event,...)
LoadFrame(NarciAR, 0, 40);
end)
local ARFrame = CreateFrame("Frame", "NarciAR_UpdateFrame")
ARFrame:Hide()
ARFrame.t = 0;
ARFrame.TotalTime = 0;
local ZoomLevel, ScaleLevel;
local function ARFrame_OnUpdate(self, elapsed)
self.t = self.t + elapsed
ZoomLevel = GetCameraZoom()
ScaleLevel= CalculateScale(ZoomLevel)/20
UpdateScale(NarciAR, ScaleLevel)
if self.t >= 2 then
self:Hide();
end
end
local function ARFrame_OnHide(self)
self.t = 0;
end
ARFrame:SetScript("OnUpdate", ARFrame_OnUpdate)
ARFrame:SetScript("OnHide", ARFrame_OnHide)
hooksecurefunc("CameraZoomIn", function(increment)
ARFrame.t = 0;
ARFrame:Show();
end)
hooksecurefunc("CameraZoomOut", function(increment)
ARFrame.t = 0;
ARFrame:Show();
end)
hooksecurefunc("MoveViewInStart", function()
print("View In")
end)
function NarciAR_MeasurementSlider_OnValueChanged(self, value, userInput)
self.VirtualThumb:SetPoint("CENTER", self.Thumb, "CENTER", 0, 0)
if value ~= self.oldValue then
self.oldValue = value
self.KeyLabel:SetText(floor(value*100 + 0.5)/100)
end
end
--]]