VRM10SpringBoneJointEditor.ShowSpringInfo to Vrm10InstanceSpringBone.GetEditInfo

共通ロジックとして昇格。.childCount==0 を info.IsLastTail で置き換えるべきところがあるぽい。
This commit is contained in:
ousttrue
2026-09-03 14:09:54 +09:00
parent 2a20b44ab1
commit 5b0f15f9a5
2 changed files with 72 additions and 21 deletions

View File

@@ -63,10 +63,11 @@ namespace UniVRM10
/// spring 情報。readonly。mouse click による hierarchy 参照補助
///
EditorGUI.BeginDisabledGroup(true);
var isLastTail = ShowSpringInfo();
var info = Vrm10InstanceSpringBone.GetEditInfo(m_target, m_root);
ShowSpringInfo(info);
EditorGUI.EndDisabledGroup();
if (isLastTail)
if (info.IsLastTail)
{
EditorGUILayout.HelpBox("末端 joint です。下記の設定は使用されません。", MessageType.Info);
}
@@ -99,7 +100,7 @@ namespace UniVRM10
EditorGUILayout.HelpBox("SpringBoneの角度制限はまだdraft仕様です。将来的に仕様が変更される可能性があります。\nThe angle limit feature for SpringBone is still in draft status. The specifications may change in the future.", MessageType.Warning);
if (isLastTail)
if (info.IsLastTail)
{
EditorGUILayout.HelpBox("末端ノードではAngleLimitは無視されます。", MessageType.Info);
}
@@ -144,52 +145,51 @@ namespace UniVRM10
/// - Springに関連付けられたColliderの情報を表示する
/// </summary>
/// <returns>末端</returns>
bool ShowSpringInfo()
static void ShowSpringInfo(Vrm10InstanceSpringBone.EditInfo info)
{
if (m_root == null)
if (info.Root == null)
{
EditorGUILayout.HelpBox("no vrm-1.0", MessageType.Warning);
return false;
return;
}
EditorGUILayout.ObjectField("Vrm-1.0", m_root, typeof(Vrm10Instance), true, null);
EditorGUILayout.ObjectField("Vrm-1.0", info.Root, typeof(Vrm10Instance), true, null);
var found = m_root.SpringBone.FindJoint(m_target);
if (!found.HasValue)
if (info.Spring == null)
{
EditorGUILayout.HelpBox("This joint not belongs any spring", MessageType.Warning);
return false;
return;
}
var (spring, i, _) = found.Value;
m_showJoints = EditorGUILayout.Foldout(m_showJoints, $"Springs[{i}]({spring.Name})");
// var (spring, i, _) = found.Value;
m_showJoints = EditorGUILayout.Foldout(m_showJoints, $"Springs[{info.SpringIndex}]({info.Spring.Name})");
int? jointIndex = default;
// joints
for (int j = 0; j < spring.Joints.Count; ++j)
for (int j = 0; j < info.Spring.Joints.Count; ++j)
{
var joint = spring.Joints[j];
var joint = info.Spring.Joints[j];
if (m_showJoints)
{
var label = $"Joints[{j}]";
if (joint == m_target)
if (joint == info.Target)
{
label += "★";
}
EditorGUILayout.ObjectField(label, joint, typeof(VRM10SpringBoneJoint), true, null);
}
if (joint == m_target)
if (joint == info.Target)
{
jointIndex = j;
}
}
m_showColliders = EditorGUILayout.Foldout(m_showColliders, "ColliderGroups");
if (m_showColliders && found.HasValue)
if (m_showColliders)
{
// collider groups
for (int j = 0; j < spring.ColliderGroups.Count; ++j)
for (int j = 0; j < info.Spring.ColliderGroups.Count; ++j)
{
var group = spring.ColliderGroups[j];
var group = info.Spring.ColliderGroups[j];
EditorGUILayout.LabelField($"ColliderGroups[{j}]({group.Name})");
for (int k = 0; k < group.Colliders.Count; ++k)
{
@@ -199,8 +199,6 @@ namespace UniVRM10
}
}
}
return jointIndex == (spring.Joints.Count - 1);
}
/// <summary>

View File

@@ -89,5 +89,58 @@ namespace UniVRM10
}
return default;
}
public struct EditInfo
{
public VRM10SpringBoneJoint Target;
public Vrm10Instance Root;
public Spring Spring;
public int SpringIndex;
public int JointIndex;
public bool IsLastTail;
}
/// <summary>
/// Return SprintBone EditInfo.
/// Do not call on runtime play for performance.
/// </summary>
/// <param name="target">On Editor may null.</param>
/// <param name="root">GetComponentInParent cache.</param>
/// <returns></returns>
public static EditInfo GetEditInfo(VRM10SpringBoneJoint target, Vrm10Instance root)
{
EditInfo info = default;
if (target == null)
{
return info;
}
info.Target = target;
if (root == null)
{
root = target.GetComponentInParent<Vrm10Instance>();
}
if (root == null)
{
return info;
}
info.Root = root;
var found = root.SpringBone.FindJoint(target);
if (!found.HasValue)
{
return info;
}
(info.Spring, info.SpringIndex, info.JointIndex) = found.Value;
// ヒエラルキーの末端ではなく、Springの末端である
if (info.Spring.Joints.Count > 0 && info.Spring.Joints[info.Spring.Joints.Count - 1] == target)
{
info.IsLastTail = true;
}
return info;
}
}
}