// Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. using System.Collections.Generic; using UnityEngine; using UnityEngine.Assertions; using static Oculus.Movement.FaceTrackingTooltips; using static OVRFaceExpressions; namespace Meta.XR.Movement.FaceTracking.Samples { /// /// Provides weights from face tracking. /// public class OVRWeightsProvider : WeightsProvider { /// /// The face expressions provider to source from. /// [SerializeField] [Tooltip(OVRWeightsProviderTooltips.OvrFaceExpressions)] protected OVRFaceExpressions _ovrFaceExpressions; /// public OVRFaceExpressions OVRFaceExpressionComp { get => _ovrFaceExpressions; set => _ovrFaceExpressions = value; } float[] _allWeights = null; string[] _weightNames = null; private void Awake() { Assert.IsNotNull(_ovrFaceExpressions); } private void EnsureInitialize() { if (_allWeights == null) { _allWeights = new float[(int)FaceExpression.Max]; } if (_weightNames == null) { _weightNames = new string[(int)FaceExpression.Max]; for (int i = (int)FaceExpression.BrowLowererL; i < (int)FaceExpression.Max; i++) { _weightNames[i] = ((FaceExpression)i).ToString(); } } } /// public override bool IsValid => _ovrFaceExpressions.enabled && _ovrFaceExpressions.FaceTrackingEnabled && _ovrFaceExpressions.ValidExpressions; /// public override float[] GetWeights() { EnsureInitialize(); return _allWeights; } /// public override string[] GetWeightNames() { EnsureInitialize(); return _weightNames; } private void Update() { EnsureInitialize(); if (!IsValid) { return; } for (int i = (int)FaceExpression.BrowLowererL; i < (int)FaceExpression.Max; i++) { _allWeights[i] = _ovrFaceExpressions[(FaceExpression)i]; } } } }