| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Diagnostics;
 
- namespace LitMotion
 
- {
 
-     /// <summary>
 
-     /// Provides functionality for tracking active motions.
 
-     /// </summary>
 
-     public static class MotionTracker
 
-     {
 
-         public static bool EnableTracking = false;
 
-         public static bool EnableStackTrace = false;
 
-         public static IReadOnlyList<TrackingState> Items => trackings;
 
-         static readonly List<TrackingState> trackings = new(16);
 
-         public static void AddTracking(MotionHandle motionHandle, IMotionScheduler scheduler, int skipFrames = 3)
 
-         {
 
-             var state = TrackingState.Create();
 
-             (state.ValueType, state.OptionsType, state.AdapterType) = MotionStorageManager.GetMotionType(motionHandle);
 
-             state.Scheduler = scheduler;
 
-             state.CreationTime = DateTime.UtcNow;
 
- #if UNITY_EDITOR
 
-             state.CreatedOnEditor = UnityEditor.EditorApplication.isPlaying;
 
- #endif
 
-             if (EnableStackTrace) state.StackTrace = new StackTrace(skipFrames, true);
 
-             ref var callbackData = ref MotionStorageManager.GetMotionCallbackDataRef(motionHandle);
 
-             state.OriginalOnCompleteCallback = callbackData.OnCompleteAction;
 
-             callbackData.OnCompleteAction = state.OnCompleteDelegate;
 
-             state.OriginalOnCancelCallback = callbackData.OnCancelAction;
 
-             callbackData.OnCancelAction = state.OnCancelDelegate;
 
-             trackings.Add(state);
 
-         }
 
-         public static void Clear()
 
-         {
 
-             trackings.Clear();
 
-         }
 
-         public sealed class TrackingState
 
-         {
 
-             static readonly Stack<TrackingState> pool = new(16);
 
-             TrackingState()
 
-             {
 
-                 OnCompleteDelegate = OnComplete;
 
-                 OnCancelDelegate = OnCancel;
 
-             }
 
-             public static TrackingState Create()
 
-             {
 
-                 if (!pool.TryPop(out var state))
 
-                 {
 
-                     state = new();
 
-                 }
 
-                 return state;
 
-             }
 
-             public Type ValueType;
 
-             public Type OptionsType;
 
-             public Type AdapterType;
 
-             public IMotionScheduler Scheduler;
 
-             public DateTime CreationTime;
 
-             public StackTrace StackTrace;
 
-             public bool CreatedOnEditor;
 
-             public Action OriginalOnCompleteCallback;
 
-             public Action OriginalOnCancelCallback;
 
-             public readonly Action OnCompleteDelegate;
 
-             public readonly Action OnCancelDelegate;
 
-             void OnComplete()
 
-             {
 
-                 try
 
-                 {
 
-                     OriginalOnCompleteCallback?.Invoke();
 
-                 }
 
-                 catch (Exception ex)
 
-                 {
 
-                     MotionDispatcher.GetUnhandledExceptionHandler()?.Invoke(ex);
 
-                 }
 
-                 Release();
 
-             }
 
-             void OnCancel()
 
-             {
 
-                 try
 
-                 {
 
-                     OriginalOnCancelCallback?.Invoke();
 
-                 }
 
-                 catch (Exception ex)
 
-                 {
 
-                     MotionDispatcher.GetUnhandledExceptionHandler()?.Invoke(ex);
 
-                 }
 
-                 Release();
 
-             }
 
-             void Release()
 
-             {
 
-                 trackings.Remove(this);
 
-                 ValueType = default;
 
-                 OptionsType = default;
 
-                 AdapterType = default;
 
-                 Scheduler = default;
 
-                 CreationTime = default;
 
-                 StackTrace = default;
 
-                 CreatedOnEditor = default;
 
-                 OriginalOnCompleteCallback = default;
 
-                 OriginalOnCancelCallback = default;
 
-                 pool.Push(this);
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |