1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 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);
- }
- }
- }
- }
|