123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- 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;
- }
- }
- }
|