10public static class EnginePluginRegistry
12 private static readonly
object _lock =
new();
13 private static readonly List<IEnginePlugin> _plugins = [];
14 private static readonly HashSet<IEnginePlugin> _disabledPlugins = [];
20 public static IReadOnlyList<IEnginePlugin>
All
35 ArgumentNullException.ThrowIfNull(plugin);
39 if (_plugins.Contains(plugin))
43 _disabledPlugins.Remove(plugin);
44 _snapshot = [.. _plugins];
54 ArgumentNullException.ThrowIfNull(plugin);
58 _plugins.Remove(plugin);
59 _disabledPlugins.Remove(plugin);
60 _snapshot = [.. _plugins];
64 internal static void InvokeInitialize(
Engine engine) =>
65 Invoke(engine, p => p.OnInitialize(engine),
"OnInitialize");
67 internal static void InvokePreCycle(
Engine engine,
double deltaSeconds) =>
68 Invoke(engine, p => p.OnPreCycle(engine, deltaSeconds),
"OnPreCycle");
70 internal static void InvokePreFrameRender(
Engine engine,
double deltaSeconds) =>
71 Invoke(engine, p => p.OnPreFrameRender(engine, deltaSeconds),
"OnPreFrameRender");
73 internal static void InvokePostFrameRender(
Engine engine,
double deltaSeconds) =>
74 Invoke(engine, p => p.OnPostFrameRender(engine, deltaSeconds),
"OnPostFrameRender");
77 Invoke(engine, p => p.OnPostRenderCanvas(engine, host, canvas),
"OnPostRenderCanvas");
79 internal static void InvokePostCycle(
Engine engine,
double deltaSeconds) =>
80 Invoke(engine, p => p.OnPostCycle(engine, deltaSeconds),
"OnPostCycle");
82 internal static void InvokeShutdown(
Engine engine) =>
83 Invoke(engine, p => p.OnShutdown(engine),
"OnShutdown");
85 private static void Invoke(
Engine engine, Action<IEnginePlugin> callback,
string hook)
91 foreach (var plugin
in snapshot)
95 if (_disabledPlugins.Contains(plugin))
106 _disabledPlugins.Add(plugin);
110 "Engine plugin '{PluginName}' ({PluginVersion}) threw in {Hook} and was disabled.",