95 lines
3.4 KiB
C#
95 lines
3.4 KiB
C#
|
using UnityEngine;
|
|||
|
using UnityEditor;
|
|||
|
using System.Collections;
|
|||
|
|
|||
|
namespace RootMotion.FinalIK {
|
|||
|
|
|||
|
/*
|
|||
|
* Custom inspector and scene view tools for IKSolverFABRIKRoot
|
|||
|
* */
|
|||
|
public class IKSolverFABRIKRootInspector : IKSolverInspector {
|
|||
|
|
|||
|
#region Public methods
|
|||
|
|
|||
|
/*
|
|||
|
* Draws the custom inspector for IKSolverFABRIKRoot
|
|||
|
* */
|
|||
|
public static void AddInspector(SerializedProperty prop, bool editHierarchy) {
|
|||
|
AddClampedInt(prop.FindPropertyRelative("iterations"), new GUIContent("Iterations", "Solver iterations."), 0, int.MaxValue);
|
|||
|
|
|||
|
EditorGUILayout.PropertyField(prop.FindPropertyRelative("IKPositionWeight"), new GUIContent("Weight", "Solver weight."));
|
|||
|
EditorGUILayout.PropertyField(prop.FindPropertyRelative("rootPin"), new GUIContent("Root Pin", "Weight of keeping all FABRIK Trees pinned to the root position."));
|
|||
|
|
|||
|
EditorGUILayout.Space();
|
|||
|
|
|||
|
EditorGUI.indentLevel = 0;
|
|||
|
EditorGUILayout.PropertyField(prop.FindPropertyRelative("chains"), new GUIContent("Chains", "FABRIK chains."), true);
|
|||
|
|
|||
|
EditorGUILayout.Space();
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Draws the scene view helpers for IKSolverFABRIKRoot
|
|||
|
* */
|
|||
|
public static void AddScene(IKSolverFABRIKRoot solver, Color color, bool modifiable, ref FABRIKChain selected) {
|
|||
|
// Protect from null reference errors
|
|||
|
if (Application.isPlaying && !solver.initiated) return;
|
|||
|
if (!Application.isPlaying) {
|
|||
|
string message = string.Empty;
|
|||
|
if (!solver.IsValid(ref message)) return;
|
|||
|
}
|
|||
|
Handles.color = color;
|
|||
|
|
|||
|
// Selecting solvers
|
|||
|
if (Application.isPlaying) {
|
|||
|
SelectChain(solver.chains, ref selected, color);
|
|||
|
}
|
|||
|
|
|||
|
AddSceneChain(solver.chains, color, selected);
|
|||
|
|
|||
|
// Root pin
|
|||
|
Handles.color = new Color(Mathf.Lerp(1f, color.r, solver.rootPin), Mathf.Lerp(1f, color.g, solver.rootPin), Mathf.Lerp(1f, color.b, solver.rootPin), Mathf.Lerp(0.5f, 1f, solver.rootPin));
|
|||
|
if (solver.GetRoot() != null) {
|
|||
|
Handles.DrawLine(solver.chains[0].ik.solver.bones[0].transform.position, solver.GetRoot().position);
|
|||
|
Inspector.CubeCap(0, solver.GetRoot().position, Quaternion.identity, GetHandleSize(solver.GetRoot().position));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion Public methods
|
|||
|
|
|||
|
private static Color col, midColor, endColor;
|
|||
|
|
|||
|
private static void SelectChain(FABRIKChain[] chain, ref FABRIKChain selected, Color color) {
|
|||
|
foreach (FABRIKChain c in chain) {
|
|||
|
if (c.ik.solver.IKPositionWeight > 0 && selected != c) {
|
|||
|
Handles.color = GetChainColor(c, color);
|
|||
|
|
|||
|
if (Inspector.DotButton(c.ik.solver.GetIKPosition(), Quaternion.identity, GetHandleSize(c.ik.solver.GetIKPosition()), GetHandleSize(c.ik.solver.GetIKPosition()))) {
|
|||
|
selected = c;
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static Color GetChainColor(FABRIKChain chain, Color color) {
|
|||
|
float midWeight = chain.pin;
|
|||
|
midColor = new Color(Mathf.Lerp(1f, color.r, midWeight), Mathf.Lerp(1f, color.g, midWeight), Mathf.Lerp(1f, color.b, midWeight), Mathf.Lerp(0.5f, 1f, midWeight));
|
|||
|
|
|||
|
float endWeight = chain.pull;
|
|||
|
endColor = new Color(Mathf.Lerp(1f, color.r, endWeight), Mathf.Lerp(0f, color.g, endWeight), Mathf.Lerp(0f, color.b, endWeight), Mathf.Lerp(0.5f, 1f, endWeight));
|
|||
|
|
|||
|
return chain.children.Length == 0? endColor: midColor;
|
|||
|
}
|
|||
|
|
|||
|
private static void AddSceneChain(FABRIKChain[] chain, Color color, FABRIKChain selected) {
|
|||
|
foreach (FABRIKChain c in chain) {
|
|||
|
col = GetChainColor(c, color);
|
|||
|
|
|||
|
IKSolverHeuristicInspector.AddScene(c.ik.solver as IKSolverHeuristic, col, selected == c);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|