| 
						 
							
							
							
						 
					 | 
				
			
			 | 
			 | 
			
				@@ -1,6 +1,8 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using System;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using System.Collections.Generic;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				using Syntriax.Engine.Core.Debug;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				namespace Syntriax.Engine.Core;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				/// <summary>
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -48,6 +50,9 @@ public class Event
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // We use Ascending order because draw calls are running from last to first
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private static readonly Comparer<ListenerData> SortByAscendingPriority = Comparer<ListenerData>.Create((x, y) => x.Priority.CompareTo(y.Priority));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private ILogger _logger = new ConsoleLogger();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    public ILogger Logger { get => _logger; set => _logger = value ?? new ConsoleLogger(); }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private readonly List<ListenerData> listeners = null!;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private readonly List<ListenerData> onceListeners = null!;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -126,7 +131,7 @@ public class Event
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            catch (Exception exception)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                string methodCallRepresentation = $"{listeners[i].Callback.Method.DeclaringType?.FullName}.{listeners[i].Callback.Method.Name}()";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                EventHelpers.LogInvocationException(listeners[i].Callback.Target ?? this, Logger, exception, methodCallRepresentation);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        for (int i = onceListeners.Count - 1; i >= 0; i--)
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -135,7 +140,7 @@ public class Event
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            catch (Exception exception)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                string methodCallRepresentation = $"{onceListeners[i].Callback.Method.DeclaringType?.FullName}.{onceListeners[i].Callback.Method.Name}()";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                EventHelpers.LogInvocationException(onceListeners[i].Callback.Target ?? this, Logger, exception, methodCallRepresentation);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            onceListeners.RemoveAt(i);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -199,11 +204,14 @@ public class Event
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				/// 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				/// </summary>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				/// <typeparam name="TSender">Sender type</typeparam>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				public class Event<TSender>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				public class Event<TSender> where TSender : class
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // We use Ascending order because draw calls are running from last to first
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private static readonly Comparer<ListenerData> SortByAscendingPriority = Comparer<ListenerData>.Create((x, y) => x.Priority.CompareTo(y.Priority));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private ILogger _logger = new ConsoleLogger();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    public ILogger Logger { get => _logger; set => _logger = value ?? new ConsoleLogger(); }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private readonly List<ListenerData> listeners = null!;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private readonly List<ListenerData> onceListeners = null!;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -283,7 +291,7 @@ public class Event<TSender>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            catch (Exception exception)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                string methodCallRepresentation = $"{listeners[i].Callback.Method.DeclaringType?.FullName}.{listeners[i].Callback.Method.Name}({sender})";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                EventHelpers.LogInvocationException(listeners[i].Callback.Target ?? sender, Logger, exception, methodCallRepresentation);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        for (int i = onceListeners.Count - 1; i >= 0; i--)
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -292,7 +300,7 @@ public class Event<TSender>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            catch (Exception exception)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                string methodCallRepresentation = $"{onceListeners[i].Callback.Method.DeclaringType?.FullName}.{onceListeners[i].Callback.Method.Name}({sender})";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                EventHelpers.LogInvocationException(onceListeners[i].Callback.Target ?? sender, Logger, exception, methodCallRepresentation);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            onceListeners.RemoveAt(i);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -363,11 +371,14 @@ public class Event<TSender>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				/// 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				/// </summary>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				/// <typeparam name="TSender">Sender type</typeparam>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				public class Event<TSender, TArguments>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				public class Event<TSender, TArguments> where TSender : class
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // We use Ascending order because draw calls are running from last to first
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private static readonly Comparer<ListenerData> SortByAscendingPriority = Comparer<ListenerData>.Create((x, y) => x.Priority.CompareTo(y.Priority));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private ILogger _logger = new ConsoleLogger();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    public ILogger Logger { get => _logger; set => _logger = value ?? new ConsoleLogger(); }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private readonly List<ListenerData> listeners = null!;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private readonly List<ListenerData> onceListeners = null!;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -447,8 +458,8 @@ public class Event<TSender, TArguments>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            try { listeners[i].Callback.Invoke(sender, args); }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            catch (Exception exception)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                string methodCallRepresentation = $"{listeners[i].Callback.Method.DeclaringType?.FullName}.{listeners[i].Callback.Method.Name}({string.Join(", ", sender, args)})";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                string methodCallRepresentation = $"{listeners[i].Callback.Method.DeclaringType?.FullName}.{listeners[i].Callback.Method.Name}({sender}, {args})";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                EventHelpers.LogInvocationException(listeners[i].Callback.Target ?? sender, Logger, exception, methodCallRepresentation);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        for (int i = onceListeners.Count - 1; i >= 0; i--)
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -456,8 +467,8 @@ public class Event<TSender, TArguments>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            try { onceListeners[i].Callback.Invoke(sender, args); }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            catch (Exception exception)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                string methodCallRepresentation = $"{onceListeners[i].Callback.Method.DeclaringType?.FullName}.{onceListeners[i].Callback.Method.Name}({string.Join(", ", sender, args)})";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                string methodCallRepresentation = $"{onceListeners[i].Callback.Method.DeclaringType?.FullName}.{onceListeners[i].Callback.Method.Name}({sender}, {args})";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                EventHelpers.LogInvocationException(onceListeners[i].Callback.Target ?? sender, Logger, exception, methodCallRepresentation);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            onceListeners.RemoveAt(i);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -478,3 +489,12 @@ public class Event<TSender, TArguments>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    public delegate void EventHandler(TSender sender, TArguments args);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    private record struct ListenerData(EventHandler Callback, int Priority);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				internal static class EventHelpers
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    public static void LogInvocationException(object sender, ILogger logger, Exception exception, string methodCallRepresentation)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        logger.LogException(sender, exception);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        logger.LogError(sender, $"Unexpected exception on invocation of method {methodCallRepresentation}");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
	
		
			
				
					
					| 
						 
							
							
							
						 
					 | 
				
			
			 | 
			 | 
			
				 
 |