Files
FlaxEngine/Source/Editor/Surface/Elements/SkeletonBoneIndexSelectElement.cs
2024-02-26 19:00:48 +01:00

87 lines
2.7 KiB
C#

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
using System;
using System.Text;
using FlaxEngine;
namespace FlaxEditor.Surface.Elements
{
/// <summary>
/// The Visject surface node element used to pick a skeleton bone index with a combo box.
/// </summary>
[HideInEditor]
public class SkeletonBoneIndexSelectElement : ComboBoxElement
{
/// <inheritdoc />
public SkeletonBoneIndexSelectElement(SurfaceNode parentNode, NodeElementArchetype archetype)
: base(parentNode, archetype)
{
_isAutoSelect = true;
if (Surface == null)
return;
UpdateComboBox();
// Select saved value
_selectedIndices.Clear();
if (Archetype.ValueIndex != -1)
{
var selectedIndex = (int)ParentNode.Values[Archetype.ValueIndex];
if (selectedIndex > -1 && selectedIndex < _items.Count)
SelectedIndex = selectedIndex;
ParentNode.ValuesChanged += OnNodeValuesChanged;
}
}
private void OnNodeValuesChanged()
{
_selectedIndices.Clear();
_selectedIndices.Add((int)ParentNode.Values[Archetype.ValueIndex]);
OnSelectedIndexChanged();
}
/// <summary>
/// Updates the Combo Box items list from the current skeleton nodes hierarchy.
/// </summary>
protected void UpdateComboBox()
{
// Prepare
var selectedBone = SelectedItem;
_items.Clear();
// Get the skeleton
var surfaceParam = Surface.GetParameter(Windows.Assets.AnimationGraphWindow.BaseModelId);
var skeleton = surfaceParam != null ? FlaxEngine.Content.LoadAsync<SkinnedModel>((Guid)surfaceParam.Value) : null;
if (skeleton == null || skeleton.WaitForLoaded())
{
SelectedIndex = -1;
return;
}
// Update the items
var nodes = skeleton.Nodes;
var bones = skeleton.Bones;
_items.Capacity = Mathf.Max(_items.Capacity, bones.Length);
StringBuilder sb = new StringBuilder(64);
for (int i = 0; i < bones.Length; i++)
{
sb.Clear();
int parent = bones[i].ParentIndex;
while (parent != -1)
{
sb.Append(" ");
parent = bones[parent].ParentIndex;
}
sb.Append("> ");
sb.Append(nodes[bones[i].NodeIndex].Name);
_items.Add(sb.ToString());
}
// Restore the selected bone
SelectedItem = selectedBone;
}
}
}