/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* Licensed under the Oculus SDK License Agreement (the "License");
* you may not use the Oculus SDK except in compliance with the License,
* which is provided at the time of installation or download, or which
* otherwise accompanies this software in either electronic or hard copy form.
*
* You may obtain a copy of the License at
*
* https://developer.oculus.com/licenses/oculussdk/
*
* Unless required by applicable law or agreed to in writing, the Oculus 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 System.Collections.Generic;
using System.Threading.Tasks;
using Oculus.Interaction.PoseDetection.Debug;
using UnityEngine;
namespace Oculus.Interaction.PoseDetection
{
///
/// Wraps a component and adds several additional conditions to
/// its logic.
///
public class SequenceActiveState : MonoBehaviour, IActiveState
{
[Tooltip("The Sequence that will drive this component.")]
[SerializeField]
private Sequence _sequence;
[Tooltip("If true, this ActiveState will become Active as soon " +
"as the first sequence step becomes Active.")]
[SerializeField]
private bool _activateIfStepsStarted;
[Tooltip("If true, this ActiveState will be active when " +
"the supplied Sequence is Active.")]
[SerializeField]
private bool _activateIfStepsComplete = true;
protected virtual void Start()
{
this.AssertField(_sequence, nameof(_sequence));
}
///
/// Implementation of ;
/// for details, please refer to the related documentation provided for that interface.
///
public bool Active
{
get
{
return (_activateIfStepsStarted && _sequence.CurrentActivationStep > 0 && !_sequence.Active) ||
(_activateIfStepsComplete && _sequence.Active);
}
}
static SequenceActiveState()
{
ActiveStateDebugTree.RegisterModel(new DebugModel());
}
private class DebugModel : ActiveStateModel
{
protected override Task> GetChildrenAsync(SequenceActiveState activeState)
{
return Task.FromResult>(new[] { activeState._sequence });
}
}
#region Inject
///
/// Injects all required dependencies for a dynamically instantiated
/// .
/// This method exists to support Interaction SDK's dependency injection pattern and is not
/// needed for typical Unity Editor-based usage.
///
public void InjectAllSequenceActiveState(Sequence sequence,
bool activateIfStepsStarted, bool activateIfStepsComplete)
{
InjectSequence(sequence);
InjectActivateIfStepsStarted(activateIfStepsStarted);
InjectActivateIfStepsComplete(activateIfStepsComplete);
}
///
/// Sets the underlying for a dynamically instantiated
/// .
/// This method exists to support Interaction SDK's dependency injection pattern and is not
/// needed for typical Unity Editor-based usage.
///
public void InjectSequence(Sequence sequence)
{
_sequence = sequence;
}
///
/// Sets ActivateIfStepsStarted for a dynamically instantiated
/// .
/// This method exists to support Interaction SDK's dependency injection pattern and is not
/// needed for typical Unity Editor-based usage.
///
public void InjectActivateIfStepsStarted(bool activateIfStepsStarted)
{
_activateIfStepsStarted = activateIfStepsStarted;
}
///
/// Sets ActivateIfStepsComplete for a dynamically instantiated
/// .
/// This method exists to support Interaction SDK's dependency injection pattern and is not
/// needed for typical Unity Editor-based usage.
///
public void InjectActivateIfStepsComplete(bool activateIfStepsComplete)
{
_activateIfStepsComplete = activateIfStepsComplete;
}
#endregion
}
}