/************************************************************************************ Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. Your use of this SDK or tool is subject to the Oculus SDK License Agreement, available at https://developer.oculus.com/licenses/oculussdk/ Unless required by applicable law or agreed to in writing, the Utilities SDK distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ************************************************************************************/ using Oculus.Interaction.Input; using System; using System.Collections.Generic; using UnityEngine; namespace Oculus.Interaction.PoseDetection { [CreateAssetMenu(menuName = "Oculus/Interaction/SDK/Pose Detection/Shape")] public class ShapeRecognizer : ScriptableObject { [Serializable] public class FingerFeatureConfigList { [SerializeField] private List _value; public IReadOnlyList Value => _value; public FingerFeatureConfigList() { } public FingerFeatureConfigList(List value) { _value = value; } } [Serializable] public class FingerFeatureConfig : FeatureConfigBase { } [SerializeField] private string _shapeName; [SerializeField] private FingerFeatureConfigList _thumbFeatureConfigs = new FingerFeatureConfigList(); [SerializeField] private FingerFeatureConfigList _indexFeatureConfigs = new FingerFeatureConfigList(); [SerializeField] private FingerFeatureConfigList _middleFeatureConfigs = new FingerFeatureConfigList(); [SerializeField] private FingerFeatureConfigList _ringFeatureConfigs = new FingerFeatureConfigList(); [SerializeField] private FingerFeatureConfigList _pinkyFeatureConfigs = new FingerFeatureConfigList(); public IReadOnlyList ThumbFeatureConfigs => _thumbFeatureConfigs.Value; public IReadOnlyList IndexFeatureConfigs => _indexFeatureConfigs.Value; public IReadOnlyList MiddleFeatureConfigs => _middleFeatureConfigs.Value; public IReadOnlyList RingFeatureConfigs => _ringFeatureConfigs.Value; public IReadOnlyList PinkyFeatureConfigs => _pinkyFeatureConfigs.Value; public string ShapeName => _shapeName; public IReadOnlyList GetFingerFeatureConfigs(HandFinger finger) { switch (finger) { case HandFinger.Thumb: return ThumbFeatureConfigs; case HandFinger.Index: return IndexFeatureConfigs; case HandFinger.Middle: return MiddleFeatureConfigs; case HandFinger.Ring: return RingFeatureConfigs; case HandFinger.Pinky: return PinkyFeatureConfigs; default: throw new ArgumentException("must be a HandFinger enum value", nameof(finger)); } } public IEnumerable>> GetFingerFeatureConfigs() { for (var fingerIdx = 0; fingerIdx < Constants.NUM_FINGERS; ++fingerIdx) { HandFinger finger = (HandFinger)fingerIdx; var configs = GetFingerFeatureConfigs(finger); if (configs.Count == 0) { continue; } yield return new ValueTuple>(finger, configs); } } #region Inject public void InjectAllShapeRecognizer(IDictionary fingerFeatureConfigs) { FingerFeatureConfigList ReadFeatureConfigs(HandFinger finger) { if (!fingerFeatureConfigs.TryGetValue(finger, out FingerFeatureConfig[] configs)) { configs = Array.Empty(); } return new FingerFeatureConfigList(new List(configs)); } _thumbFeatureConfigs = ReadFeatureConfigs(HandFinger.Thumb); _indexFeatureConfigs = ReadFeatureConfigs(HandFinger.Index); _middleFeatureConfigs = ReadFeatureConfigs(HandFinger.Middle); _ringFeatureConfigs = ReadFeatureConfigs(HandFinger.Ring); _pinkyFeatureConfigs = ReadFeatureConfigs(HandFinger.Pinky); } public void InjectThumbFeatureConfigs(FingerFeatureConfig[] configs) { _thumbFeatureConfigs = new FingerFeatureConfigList(new List(configs)); } public void InjectIndexFeatureConfigs(FingerFeatureConfig[] configs) { _indexFeatureConfigs = new FingerFeatureConfigList(new List(configs)); } public void InjectMiddleFeatureConfigs(FingerFeatureConfig[] configs) { _middleFeatureConfigs = new FingerFeatureConfigList(new List(configs)); } public void InjectRingFeatureConfigs(FingerFeatureConfig[] configs) { _ringFeatureConfigs = new FingerFeatureConfigList(new List(configs)); } public void InjectPinkyFeatureConfigs(FingerFeatureConfig[] configs) { _pinkyFeatureConfigs = new FingerFeatureConfigList(new List(configs)); } public void InjectShapeName(string shapeName) { _shapeName = shapeName; } #endregion } }