Added FinalIK
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user