138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| namespace Fusion.Addons.AnimationController
 | |
| {
 | |
| 	using System.Collections.Generic;
 | |
| 
 | |
| 	public unsafe interface IAnimationPropertyProvider
 | |
| 	{
 | |
| 		int WordCount { get; }
 | |
| 
 | |
| 		void Initialize(AnimationController controller);
 | |
| 		void Deinitialize();
 | |
| 		void Read(AnimationReadWriteInfo readWriteInfo);
 | |
| 		void Write(AnimationReadWriteInfo readWriteInfo);
 | |
| 		void Interpolate(ref AnimationInterpolationInfo interpolationInfo);
 | |
| 	}
 | |
| 
 | |
| 	/// <summary>
 | |
| 	/// AnimationPropertyProvider handles synchronization and interpolation of animation properties.
 | |
| 	/// Animation properties are provided by type T which can be implemented by AnimationController, AnimationLayer or AnimationState.
 | |
| 	/// T can be implemented only once by a single controller/layer/state type.
 | |
| 	/// All animation property providers must be registered in <c>AnimationController.AddAnimationPropertyProviders()</c>.
 | |
| 	/// </summary>
 | |
| 	public abstract unsafe class AnimationPropertyProvider<T> : IAnimationPropertyProvider where T : class
 | |
| 	{
 | |
| 		// PRIVATE MEMBERS
 | |
| 
 | |
| 		private T[] _items;
 | |
| 		private int _wordCount;
 | |
| 
 | |
| 		// IAnimationPropertyProvider INTERFACE
 | |
| 
 | |
| 		int IAnimationPropertyProvider.WordCount => _wordCount;
 | |
| 
 | |
| 		void IAnimationPropertyProvider.Initialize(AnimationController controller)
 | |
| 		{
 | |
| 			List<T> items = new List<T>();
 | |
| 
 | |
| 			AddController(controller, items);
 | |
| 
 | |
| 			_items = items.ToArray();
 | |
| 
 | |
| 			_wordCount = default;
 | |
| 
 | |
| 			for (int i = 0, count = _items.Length; i < count; ++i)
 | |
| 			{
 | |
| 				_wordCount += GetWordCount(_items[i]);
 | |
| 			}
 | |
| 
 | |
| 			OnInitialize(controller);
 | |
| 		}
 | |
| 
 | |
| 		void IAnimationPropertyProvider.Deinitialize()
 | |
| 		{
 | |
| 			OnDeinitialize();
 | |
| 
 | |
| 			_items     = default;
 | |
| 			_wordCount = default;
 | |
| 		}
 | |
| 
 | |
| 		void IAnimationPropertyProvider.Read(AnimationReadWriteInfo readWriteInfo)
 | |
| 		{
 | |
| 			for (int i = 0, count = _items.Length; i < count; ++i)
 | |
| 			{
 | |
| 				Read(_items[i], readWriteInfo);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		void IAnimationPropertyProvider.Write(AnimationReadWriteInfo readWriteInfo)
 | |
| 		{
 | |
| 			for (int i = 0, count = _items.Length; i < count; ++i)
 | |
| 			{
 | |
| 				Write(_items[i], readWriteInfo);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		void IAnimationPropertyProvider.Interpolate(ref AnimationInterpolationInfo interpolationInfo)
 | |
| 		{
 | |
| 			for (int i = 0, count = _items.Length; i < count; ++i)
 | |
| 			{
 | |
| 				Interpolate(_items[i], ref interpolationInfo);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// PROTECTED METHODS
 | |
| 
 | |
| 		protected abstract int  GetWordCount(T item);
 | |
| 		protected abstract void Read(T item, AnimationReadWriteInfo info);
 | |
| 		protected abstract void Write(T item, AnimationReadWriteInfo info);
 | |
| 		protected abstract void Interpolate(T item, ref AnimationInterpolationInfo interpolationInfo);
 | |
| 
 | |
| 		protected virtual void OnInitialize(AnimationController controller) {}
 | |
| 		protected virtual void OnDeinitialize()                             {}
 | |
| 
 | |
| 		// PRIVATE METHODS
 | |
| 
 | |
| 		private void AddController(AnimationController controller, List<T> items)
 | |
| 		{
 | |
| 			if (controller is T item)
 | |
| 			{
 | |
| 				items.Add(item);
 | |
| 			}
 | |
| 
 | |
| 			IList<AnimationLayer> layers = controller.Layers;
 | |
| 			for (int i = 0, count = layers.Count; i < count; ++i)
 | |
| 			{
 | |
| 				AddLayer(layers[i], items);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void AddLayer(AnimationLayer layer, List<T> items)
 | |
| 		{
 | |
| 			if (layer is T item)
 | |
| 			{
 | |
| 				items.Add(item);
 | |
| 			}
 | |
| 
 | |
| 			IList<AnimationState> states = layer.States;
 | |
| 			for (int i = 0, count = states.Count; i < count; ++i)
 | |
| 			{
 | |
| 				AddState(states[i], items);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void AddState(AnimationState state, List<T> items)
 | |
| 		{
 | |
| 			if (state is T item)
 | |
| 			{
 | |
| 				items.Add(item);
 | |
| 			}
 | |
| 
 | |
| 			IList<AnimationState> states = state.States;
 | |
| 			for (int i = 0, count = states.Count; i < count; ++i)
 | |
| 			{
 | |
| 				AddState(states[i], items);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |