holopy3/Assets/Plugins/RootMotion/Editor/FinalIK/IKSolverFullBodyInspector.cs
2020-12-10 15:25:12 +01:00

80 lines
2.9 KiB
C#

using UnityEngine;
using UnityEditor;
using System.Collections;
using System;
namespace RootMotion.FinalIK {
/*
* Custom inspector and scene view tools for IKSolverFullBody
* */
public class IKSolverFullBodyInspector : IKSolverInspector {
#region Public methods
/*
* Draws the custom inspector for IKSolverFullBody
* */
public static void AddInspector(SerializedProperty prop, bool editWeights) {
EditorGUILayout.PropertyField(prop.FindPropertyRelative("IKPositionWeight"), new GUIContent("Weight", "Solver weight for smooth blending (ik.solver.IKPositionWeight)."));
EditorGUILayout.PropertyField(prop.FindPropertyRelative("iterations"), new GUIContent("Iterations", "Solver iterations per frame."));
}
/*
* Draws the scene view helpers for IKSolverFullBody
* */
public static void AddScene(UnityEngine.Object target, IKSolverFullBody solver, Color color, bool modifiable, ref int selectedEffector, float size) {
if (!modifiable) return;
if (!solver.initiated) return;
if (!Application.isPlaying && !solver.IsValid()) return;
// Effectors
for (int i = 0; i < solver.effectors.Length; i++) {
bool rotate = solver.effectors[i].isEndEffector;
float weight = rotate? Mathf.Max(solver.effectors[i].positionWeight, solver.effectors[i].rotationWeight): solver.effectors[i].positionWeight;
if (weight > 0 && selectedEffector != i) {
Handles.color = color;
if (rotate) {
if (Inspector.DotButton(solver.effectors[i].position, solver.effectors[i].rotation, size * 0.5f, size * 0.5f)) {
selectedEffector = i;
return;
}
} else {
if (Inspector.SphereButton(solver.effectors[i].position, solver.effectors[i].rotation, size, size)) {
selectedEffector = i;
return;
}
}
}
}
for (int i = 0; i < solver.effectors.Length; i++) IKEffectorInspector.AddScene(solver.effectors[i], color, modifiable && i == selectedEffector, size);
if (GUI.changed) EditorUtility.SetDirty(target);
}
#endregion Public methods
public static void AddChain(FBIKChain[] chain, int index, Color color, float size) {
Handles.color = color;
for (int i = 0; i < chain[index].nodes.Length - 1; i++) {
Handles.DrawLine(GetNodePosition(chain[index].nodes[i]), GetNodePosition(chain[index].nodes[i + 1]));
Inspector.SphereCap(0, GetNodePosition(chain[index].nodes[i]), Quaternion.identity, size);
}
Inspector.SphereCap(0, GetNodePosition(chain[index].nodes[chain[index].nodes.Length - 1]), Quaternion.identity, size);
for (int i = 0; i < chain[index].children.Length; i++) {
Handles.DrawLine(GetNodePosition(chain[index].nodes[chain[index].nodes.Length - 1]), GetNodePosition(chain[chain[index].children[i]].nodes[0]));
}
}
private static Vector3 GetNodePosition(IKSolver.Node node) {
if (Application.isPlaying) return node.solverPosition;
return node.transform.position;
}
}
}