various 'improvements'
This commit is contained in:
82
LightlessSync/Services/Rendering/PctDrawListExtensions.cs
Normal file
82
LightlessSync/Services/Rendering/PctDrawListExtensions.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
using System.Numerics;
|
||||
using System.Reflection;
|
||||
using Dalamud.Bindings.ImGui;
|
||||
using Pictomancy;
|
||||
|
||||
namespace LightlessSync.Services.Rendering;
|
||||
|
||||
internal static class PctDrawListExtensions
|
||||
{
|
||||
private static readonly FieldInfo? DrawListField = typeof(PctDrawList).GetField("_drawList", BindingFlags.Instance | BindingFlags.NonPublic);
|
||||
|
||||
private static bool TryGetImDrawList(PctDrawList drawList, out ImDrawListPtr ptr)
|
||||
{
|
||||
ptr = default;
|
||||
if (DrawListField == null)
|
||||
return false;
|
||||
|
||||
if (DrawListField.GetValue(drawList) is ImDrawListPtr list)
|
||||
{
|
||||
ptr = list;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void AddScreenText(this PctDrawList drawList, Vector2 screenPosition, string text, uint color, float fontSize, Vector2? pivot = null, uint? outlineColor = null, ImFontPtr fontOverride = default)
|
||||
{
|
||||
if (drawList == null || string.IsNullOrEmpty(text))
|
||||
return;
|
||||
|
||||
if (!TryGetImDrawList(drawList, out var imDrawList))
|
||||
return;
|
||||
|
||||
var font = fontOverride.IsNull ? ImGui.GetFont() : fontOverride;
|
||||
if (font.IsNull)
|
||||
return;
|
||||
|
||||
var size = MathF.Max(1f, fontSize);
|
||||
var pivotValue = pivot ?? new Vector2(0.5f, 0.5f);
|
||||
|
||||
Vector2 measured;
|
||||
float calcFontSize;
|
||||
if (!fontOverride.IsNull)
|
||||
{
|
||||
ImGui.PushFont(font);
|
||||
measured = ImGui.CalcTextSize(text);
|
||||
calcFontSize = ImGui.GetFontSize();
|
||||
ImGui.PopFont();
|
||||
}
|
||||
else
|
||||
{
|
||||
measured = ImGui.CalcTextSize(text);
|
||||
calcFontSize = ImGui.GetFontSize();
|
||||
}
|
||||
|
||||
if (calcFontSize > 0f && MathF.Abs(size - calcFontSize) > 0.001f)
|
||||
{
|
||||
measured *= size / calcFontSize;
|
||||
}
|
||||
|
||||
var drawPos = screenPosition - measured * pivotValue;
|
||||
if (outlineColor.HasValue)
|
||||
{
|
||||
var thickness = MathF.Max(1f, size / 24f);
|
||||
Span<Vector2> offsets = stackalloc Vector2[4]
|
||||
{
|
||||
new Vector2(1f, 0f),
|
||||
new Vector2(-1f, 0f),
|
||||
new Vector2(0f, 1f),
|
||||
new Vector2(0f, -1f)
|
||||
};
|
||||
|
||||
foreach (var offset in offsets)
|
||||
{
|
||||
imDrawList.AddText(font, size, drawPos + offset * thickness, outlineColor.Value, text);
|
||||
}
|
||||
}
|
||||
|
||||
imDrawList.AddText(font, size, drawPos, color, text);
|
||||
}
|
||||
}
|
||||
47
LightlessSync/Services/Rendering/PictomancyService.cs
Normal file
47
LightlessSync/Services/Rendering/PictomancyService.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using Dalamud.Plugin;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Pictomancy;
|
||||
|
||||
namespace LightlessSync.Services.Rendering;
|
||||
|
||||
public sealed class PictomancyService : IDisposable
|
||||
{
|
||||
private readonly ILogger<PictomancyService> _logger;
|
||||
private bool _initialized;
|
||||
|
||||
public PictomancyService(ILogger<PictomancyService> logger, IDalamudPluginInterface pluginInterface)
|
||||
{
|
||||
_logger = logger;
|
||||
|
||||
try
|
||||
{
|
||||
PictoService.Initialize(pluginInterface);
|
||||
_initialized = true;
|
||||
if (_logger.IsEnabled(LogLevel.Debug))
|
||||
_logger.LogDebug("Pictomancy initialized");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Failed to initialize Pictomancy");
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (!_initialized)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
PictoService.Dispose();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Failed to dispose Pictomancy");
|
||||
}
|
||||
finally
|
||||
{
|
||||
_initialized = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user