#if GRAPH_DESIGNER
/// ---------------------------------------------
/// Behavior Designer
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.BehaviorDesigner.Editor.Controls.NodeViews
{
using Opsive.BehaviorDesigner.Runtime;
using Opsive.BehaviorDesigner.Runtime.Components;
using Opsive.BehaviorDesigner.Runtime.Tasks;
using Opsive.BehaviorDesigner.Runtime.Tasks.Composites;
using Unity.Entities;
///
/// Utility methods for converting runtime task state into editor display state.
///
internal static class RuntimeNodeStatusUtility
{
///
/// Returns the task status that should be displayed by editor node views.
///
/// The behavior tree that owns the runtime node.
/// The runtime index of the node.
/// The task status that should be displayed.
public static TaskStatus GetDisplayStatus(BehaviorTree behaviorTree, int runtimeIndex)
{
if (behaviorTree == null) {
return TaskStatus.Inactive;
}
var rawStatus = behaviorTree.GetRuntimeNodeStatus(runtimeIndex);
if (rawStatus != TaskStatus.Queued && rawStatus != TaskStatus.Running) {
return rawStatus;
}
if (IsSelectorEvaluatorReevaluationTask(behaviorTree, runtimeIndex)) {
return TaskStatus.Inactive;
}
return rawStatus;
}
///
/// Returns true if the runtime index belongs to a SelectorEvaluator child that is only being reevaluated.
///
/// The behavior tree that owns the runtime node.
/// The runtime index of the node.
/// True if the runtime index belongs to a SelectorEvaluator reevaluation subtree.
private static bool IsSelectorEvaluatorReevaluationTask(BehaviorTree behaviorTree, int runtimeIndex)
{
if (behaviorTree == null || runtimeIndex < 0 || behaviorTree.Entity == Entity.Null || behaviorTree.World == null || !behaviorTree.World.IsCreated ||
!behaviorTree.World.EntityManager.Exists(behaviorTree.Entity) ||
!behaviorTree.World.EntityManager.HasBuffer(behaviorTree.Entity) ||
!behaviorTree.World.EntityManager.HasBuffer(behaviorTree.Entity)) {
return false;
}
var taskComponents = behaviorTree.World.EntityManager.GetBuffer(behaviorTree.Entity);
if (runtimeIndex >= taskComponents.Length) {
return false;
}
var selectorEvaluatorComponents = behaviorTree.World.EntityManager.GetBuffer(behaviorTree.Entity);
return SelectorEvaluator.IsRuntimeIndexReevaluating((ushort)runtimeIndex, taskComponents, selectorEvaluatorComponents);
}
}
}
#endif