using System; using System.Collections.Generic; using VRM.FastSpringBones.NativeWrappers; namespace VRM.FastSpringBones.Registries { /// /// 今生きているTransformの一覧を返すクラス /// public sealed class TransformRegistry { private readonly List _transforms = new List(); public IReadOnlyList Transforms => _transforms; private readonly List _pullTargets = new List(); public IReadOnlyList PullTargets => _pullTargets; private readonly List _pushTargets = new List(); public IReadOnlyList PushTargets => _pushTargets; private Action _onValueChanged; public void SubscribeOnValueChanged(Action action) => _onValueChanged += action; public void UnSubscribeOnValueChanged(Action action) => _onValueChanged -= action; public void Register(NativeTransform nativeTransform, TransformSynchronizationType synchronizationType) { _transforms.Add(nativeTransform); switch (synchronizationType) { case TransformSynchronizationType.PullOnly: _pullTargets.Add(nativeTransform); break; case TransformSynchronizationType.PushOnly: _pushTargets.Add(nativeTransform); break; default: throw new ArgumentOutOfRangeException(nameof(synchronizationType), synchronizationType, null); } _onValueChanged?.Invoke(); } public void Unregister(NativeTransform nativeTransform) { _transforms.Remove(nativeTransform); if (_pullTargets.Contains(nativeTransform)) { _pullTargets.Remove(nativeTransform); } if (_pushTargets.Contains(nativeTransform)) { _pushTargets.Remove(nativeTransform); } _onValueChanged?.Invoke(); } } }