#if VISUALSCRIPTING_1_8_OR_NEWER
using System;
using Unity.VisualScripting;
namespace UnityEngine.XR.ARFoundation.VisualScripting
{
///
/// A switch unit that breaks down an and triggers one of multiple
/// control outputs based on the state value.
///
[UnitTitle("Session State Switch")]
[UnitCategory(Constants.k_ARFoundation_Unit_Category)]
[UnitOrder((int)Constants.ARFoundationFeatureOrder.Session)]
[TypeIcon(typeof(ARSessionState))]
public sealed class SessionStateSwitchUnit : Unit
{
///
/// Flow input.
///
[DoNotSerialize]
[PortLabelHidden]
public ControlInput flowIn { get; private set; }
///
/// input.
///
[DoNotSerialize]
[PortLabel("AR Session State")]
public ValueInput sessionStateIn { get; private set; }
///
/// Flow output if AR Session state is .
///
[DoNotSerialize]
public ControlOutput none { get; private set; }
///
/// Flow output if AR Session state is .
///
[DoNotSerialize]
public ControlOutput unsupported { get; private set; }
///
/// Flow output if AR Session state is .
///
[DoNotSerialize]
public ControlOutput checkingAvailability { get; private set; }
///
/// Flow output if AR Session state is .
///
[DoNotSerialize]
public ControlOutput needsInstall { get; private set; }
///
/// Flow output if AR Session state is .
///
[DoNotSerialize]
public ControlOutput installing { get; private set; }
///
/// Flow output if AR Session state is .
///
[DoNotSerialize]
public ControlOutput ready { get; private set; }
///
/// Flow output if AR Session state is .
///
[DoNotSerialize]
public ControlOutput sessionInitializing { get; private set; }
///
/// Flow output if AR Session state is .
///
[DoNotSerialize]
public ControlOutput sessionTracking { get; private set; }
///
/// Unit definition.
///
protected override void Definition()
{
flowIn = ControlInput(nameof(flowIn), ProcessFlow);
sessionStateIn = ValueInput(nameof(sessionStateIn));
none = ControlOutput(nameof(none));
unsupported = ControlOutput(nameof(unsupported));
checkingAvailability = ControlOutput(nameof(checkingAvailability));
needsInstall = ControlOutput(nameof(needsInstall));
installing = ControlOutput(nameof(installing));
ready = ControlOutput(nameof(ready));
sessionInitializing = ControlOutput(nameof(sessionInitializing));
sessionTracking = ControlOutput(nameof(sessionTracking));
Requirement(sessionStateIn, flowIn);
Succession(flowIn, none);
Succession(flowIn, unsupported);
Succession(flowIn, checkingAvailability);
Succession(flowIn, needsInstall);
Succession(flowIn, installing);
Succession(flowIn, ready);
Succession(flowIn, sessionInitializing);
Succession(flowIn, sessionTracking);
}
ControlOutput ProcessFlow(Flow flow)
{
if (!(flow.GetValue(sessionStateIn) is ARSessionState sessionState))
throw new ArgumentException($"{nameof(sessionStateIn)} must be of type {nameof(ARSessionState)}.");
return sessionState switch
{
ARSessionState.None => none,
ARSessionState.Unsupported => unsupported,
ARSessionState.CheckingAvailability => checkingAvailability,
ARSessionState.NeedsInstall => needsInstall,
ARSessionState.Installing => installing,
ARSessionState.Ready => ready,
ARSessionState.SessionInitializing => sessionInitializing,
ARSessionState.SessionTracking => sessionTracking,
_ => throw new ArgumentOutOfRangeException()
};
}
}
}
#endif // VISUALSCRIPTING_1_8_OR_NEWER