You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			81 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;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |