You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.9 KiB
C#
102 lines
2.9 KiB
C#
using ImGuiNET;
|
|
using ImGuiScene;
|
|
using System;
|
|
using System.Numerics;
|
|
|
|
namespace Expedience
|
|
{
|
|
public class PluginUI : IDisposable
|
|
{
|
|
private enum AnimPhase
|
|
{
|
|
None,
|
|
Appear,
|
|
Keep,
|
|
Disappear,
|
|
}
|
|
|
|
public TextureWrap overlayImage;
|
|
|
|
private AnimPhase anim = AnimPhase.None;
|
|
private static readonly float[] animDuration = new float[] { 0.0f, 1.0f, 1.0f, 1.0f };
|
|
private float animTimeRemaining = 0.0f;
|
|
|
|
public void Show()
|
|
{
|
|
SetAnim(AnimPhase.Appear);
|
|
}
|
|
|
|
public void Draw()
|
|
{
|
|
if (anim == AnimPhase.None || overlayImage == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
float animPct = 1.0f - Math.Max(0.0f, animTimeRemaining / animDuration[(int)anim]);
|
|
|
|
// draw image
|
|
{
|
|
var viewport = ImGui.GetMainViewport();
|
|
var viewportCenter = viewport.GetCenter();
|
|
var drawHalfSize = new Vector2(overlayImage.Width * 0.5f, overlayImage.Height * 0.5f);
|
|
|
|
if (drawHalfSize.X > viewportCenter.X || drawHalfSize.Y > viewportCenter.Y)
|
|
{
|
|
drawHalfSize.Y = viewportCenter.Y * 3 / 4;
|
|
drawHalfSize.X = overlayImage.Width * drawHalfSize.Y / overlayImage.Height;
|
|
}
|
|
|
|
if (anim == AnimPhase.Appear)
|
|
{
|
|
drawHalfSize *= AnimElastic(animPct);
|
|
}
|
|
|
|
var drawAlpha =
|
|
(anim == AnimPhase.Appear) ? 1 - Math.Pow(1 - animPct, 4) :
|
|
(anim == AnimPhase.Disappear) ? (1.0f - animPct) :
|
|
1.0f;
|
|
|
|
uint drawColor = 0xffffff | (uint)(drawAlpha * 255) << 24;
|
|
|
|
var drawList = ImGui.GetForegroundDrawList();
|
|
drawList.AddImage(overlayImage.ImGuiHandle, viewportCenter - drawHalfSize, viewportCenter + drawHalfSize, Vector2.Zero, Vector2.One, drawColor);
|
|
}
|
|
|
|
// state transitions
|
|
animTimeRemaining -= ImGui.GetIO().DeltaTime;
|
|
if (animTimeRemaining <= 0.0f)
|
|
{
|
|
if (anim == AnimPhase.Disappear)
|
|
{
|
|
SetAnim(AnimPhase.None);
|
|
}
|
|
else
|
|
{
|
|
SetAnim(anim + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
private float AnimElastic(float alpha)
|
|
{
|
|
const float c4 = (float)(2 * Math.PI) / 3.0f;
|
|
|
|
return (alpha == 0) ? 0.0f :
|
|
(alpha == 1) ? 1.0f :
|
|
(float)(Math.Pow(2, -10 * alpha) * Math.Sin((alpha * 10 - 0.75) * c4) + 1);
|
|
}
|
|
|
|
private void SetAnim(AnimPhase anim)
|
|
{
|
|
this.anim = anim;
|
|
animTimeRemaining = animDuration[(int)anim];
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
overlayImage.Dispose();
|
|
}
|
|
}
|
|
}
|