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();
}
}
}