|
|
|
|
using UnityEngine;
|
|
|
|
|
using System.Collections;
|
|
|
|
|
using UnityEditor;
|
|
|
|
|
|
|
|
|
|
namespace RootMotion.FinalIK {
|
|
|
|
|
|
|
|
|
|
// Custom Scene View handles for the FingerRig.
|
|
|
|
|
[CustomEditor(typeof(FingerRig))]
|
|
|
|
|
public class FingerRigInspector : Editor {
|
|
|
|
|
|
|
|
|
|
private FingerRig script { get { return target as FingerRig; }}
|
|
|
|
|
|
|
|
|
|
private int selected = -1;
|
|
|
|
|
private MonoScript monoScript;
|
|
|
|
|
|
|
|
|
|
void OnEnable() {
|
|
|
|
|
if (serializedObject == null) return;
|
|
|
|
|
|
|
|
|
|
// Changing the script execution order
|
|
|
|
|
if (!Application.isPlaying) {
|
|
|
|
|
monoScript = MonoScript.FromMonoBehaviour(script);
|
|
|
|
|
int currentExecutionOrder = MonoImporter.GetExecutionOrder(monoScript);
|
|
|
|
|
if (currentExecutionOrder != 10000) MonoImporter.SetExecutionOrder(monoScript, 10000);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OnSceneGUI() {
|
|
|
|
|
if (!script.enabled) return;
|
|
|
|
|
string message = string.Empty;
|
|
|
|
|
if (!script.IsValid(ref message)) return;
|
|
|
|
|
if (Application.isPlaying && !script.initiated) return;
|
|
|
|
|
|
|
|
|
|
Color color = Color.cyan;
|
|
|
|
|
color.a = script.weight;
|
|
|
|
|
|
|
|
|
|
Handles.color = color;
|
|
|
|
|
GUI.color = color;
|
|
|
|
|
|
|
|
|
|
// Display the bones
|
|
|
|
|
if (!Application.isPlaying) {
|
|
|
|
|
for (int i = 0; i < script.fingers.Length; i++) {
|
|
|
|
|
Handles.DrawLine(script.fingers[i].bone1.position, script.fingers[i].bone2.position);
|
|
|
|
|
Inspector.SphereCap(0, script.fingers[i].bone1.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].bone1.position) * 0.5f);
|
|
|
|
|
Inspector.SphereCap(0, script.fingers[i].bone2.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].bone2.position) * 0.5f);
|
|
|
|
|
|
|
|
|
|
if (script.fingers[i].bone3 != null) {
|
|
|
|
|
Handles.DrawLine(script.fingers[i].bone2.position, script.fingers[i].bone3.position);
|
|
|
|
|
Handles.DrawLine(script.fingers[i].bone3.position, script.fingers[i].tip.position);
|
|
|
|
|
Inspector.SphereCap(0, script.fingers[i].bone3.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].bone3.position) * 0.5f);
|
|
|
|
|
} else {
|
|
|
|
|
Handles.DrawLine(script.fingers[i].bone2.position, script.fingers[i].tip.position);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Inspector.SphereCap(0, script.fingers[i].tip.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].tip.position) * 0.5f);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Selecting solvers
|
|
|
|
|
if (Application.isPlaying) {
|
|
|
|
|
if (selected >= 0 && selected < script.fingers.Length) {
|
|
|
|
|
if (script.fingers[selected].weight > 0f) {
|
|
|
|
|
color.a = script.weight * script.fingers[selected].weight;
|
|
|
|
|
Handles.color = color;
|
|
|
|
|
|
|
|
|
|
float size = IKSolverInspector.GetHandleSize(script.fingers[selected].IKPosition);
|
|
|
|
|
|
|
|
|
|
Inspector.CubeCap(0, script.fingers[selected].IKPosition, script.fingers[selected].IKRotation, size);
|
|
|
|
|
|
|
|
|
|
if (script.fingers[selected].target == null) {
|
|
|
|
|
switch(Tools.current) {
|
|
|
|
|
case Tool.Move:
|
|
|
|
|
script.fingers[selected].IKPosition = Handles.PositionHandle(script.fingers[selected].IKPosition, Tools.pivotRotation == PivotRotation.Local? script.fingers[selected].IKRotation: Quaternion.identity);
|
|
|
|
|
break;
|
|
|
|
|
case Tool.Rotate:
|
|
|
|
|
script.fingers[selected].IKRotation = Handles.RotationHandle(script.fingers[selected].IKRotation, script.fingers[selected].IKPosition);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < script.fingers.Length; i++) {
|
|
|
|
|
color.a = script.weight * script.fingers[i].weight;
|
|
|
|
|
Handles.color = color;
|
|
|
|
|
Handles.DrawLine(script.fingers[i].tip.position, script.fingers[i].IKPosition);
|
|
|
|
|
|
|
|
|
|
if (script.fingers[i].weight > 0 && selected != i && script.fingers[i].initiated) {
|
|
|
|
|
float size = IKSolverInspector.GetHandleSize(script.fingers[i].IKPosition) * 0.5f;
|
|
|
|
|
|
|
|
|
|
if (Inspector.DotButton(script.fingers[i].IKPosition, Quaternion.identity, size, size)) selected = i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Handles.color = Color.white;
|
|
|
|
|
GUI.color = Color.white;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|