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.
		
		
		
		
		
			
		
			
	
	
		
			98 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using UnityEditor;
							 | 
						||
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace RootMotion.FinalIK {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*
							 | 
						||
| 
								 | 
							
									 * Custom inspector and scene view tools for IKSolverTrigonometric
							 | 
						||
| 
								 | 
							
									 * */
							 | 
						||
| 
								 | 
							
									public class IKSolverTrigonometricInspector: IKSolverInspector {
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										#region Public methods
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										/*
							 | 
						||
| 
								 | 
							
										 * Draws the custom inspector for IKSolverTrigonometric
							 | 
						||
| 
								 | 
							
										 * */
							 | 
						||
| 
								 | 
							
										public static void AddInspector(SerializedProperty prop, bool editHierarchy, bool showReferences) {
							 | 
						||
| 
								 | 
							
											EditorGUI.indentLevel = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// Bone references
							 | 
						||
| 
								 | 
							
											if (showReferences) {
							 | 
						||
| 
								 | 
							
												EditorGUILayout.Space();
							 | 
						||
| 
								 | 
							
												AddObjectReference(prop.FindPropertyRelative("bone1.transform"), new GUIContent("Bone 1", "The first bone in the hierarchy (thigh or upper arm)."), editHierarchy, 100);
							 | 
						||
| 
								 | 
							
												AddObjectReference(prop.FindPropertyRelative("bone2.transform"), new GUIContent("Bone 2", "The second bone in the hierarchy (calf or forearm)."), editHierarchy, 100);
							 | 
						||
| 
								 | 
							
												AddObjectReference(prop.FindPropertyRelative("bone3.transform"), new GUIContent("Bone 3", "The last bone in the hierarchy (foot or hand)."), editHierarchy, 100);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												EditorGUILayout.Space();
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											EditorGUILayout.PropertyField(prop.FindPropertyRelative("target"), new GUIContent("Target", "The target Transform. Solver IKPosition will be automatically set to the position of the target."));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											EditorGUILayout.PropertyField(prop.FindPropertyRelative("IKPositionWeight"), new GUIContent("Position Weight", "Solver weight for smooth blending."));
							 | 
						||
| 
								 | 
							
											EditorGUILayout.PropertyField(prop.FindPropertyRelative("IKRotationWeight"), new GUIContent("Rotation Weight", "Weight of last bone's rotation to IKRotation."));
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											if (showReferences) {
							 | 
						||
| 
								 | 
							
												EditorGUILayout.PropertyField(prop.FindPropertyRelative("bendNormal"), new GUIContent("Bend Normal", "Bend plane normal."));
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										public static void AddTestInspector(SerializedObject obj) {
							 | 
						||
| 
								 | 
							
											SerializedProperty solver = obj.FindProperty("solver");
							 | 
						||
| 
								 | 
							
											EditorGUILayout.PropertyField(solver.FindPropertyRelative("bendNormal"));
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										/*
							 | 
						||
| 
								 | 
							
										 * Draws the scene view helpers for IKSolverTrigonometric
							 | 
						||
| 
								 | 
							
										 * */
							 | 
						||
| 
								 | 
							
										public static void AddScene(IKSolverTrigonometric solver, Color color, bool modifiable) {
							 | 
						||
| 
								 | 
							
											if (Application.isPlaying && !solver.initiated) return;
							 | 
						||
| 
								 | 
							
											if (!Application.isPlaying && !solver.IsValid()) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											//float length = Vector3.Distance(solver.bone1.transform.position, solver.bone2.transform.position) + Vector3.Distance(solver.bone2.transform.position, solver.bone3.transform.position);
							 | 
						||
| 
								 | 
							
											//float size = length * 0.05f;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											Handles.color = color;
							 | 
						||
| 
								 | 
							
											GUI.color = color;
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											Vector3 bendPosition = solver.bone2.transform.position;
							 | 
						||
| 
								 | 
							
											Vector3 endPosition = solver.bone3.transform.position;
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Chain lines
							 | 
						||
| 
								 | 
							
											Handles.DrawLine(solver.bone1.transform.position, bendPosition);
							 | 
						||
| 
								 | 
							
											Handles.DrawLine(bendPosition, endPosition);
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Joints
							 | 
						||
| 
								 | 
							
											Inspector.SphereCap(0, solver.bone1.transform.position, Quaternion.identity, GetHandleSize(solver.bone1.transform.position));
							 | 
						||
| 
								 | 
							
											Inspector.SphereCap(0, bendPosition, Quaternion.identity, GetHandleSize(bendPosition));
							 | 
						||
| 
								 | 
							
											Inspector.SphereCap(0, endPosition, Quaternion.identity, GetHandleSize(endPosition));
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											if (Application.isPlaying && (solver.IKPositionWeight > 0 || solver.IKRotationWeight > 0)) {
							 | 
						||
| 
								 | 
							
												if (modifiable) {
							 | 
						||
| 
								 | 
							
													Inspector.CubeCap(0, solver.IKPosition, solver.IKRotation, GetHandleSize(solver.IKPosition));
							 | 
						||
| 
								 | 
							
														
							 | 
						||
| 
								 | 
							
													// Manipulating position and rotation
							 | 
						||
| 
								 | 
							
													switch(Tools.current) {
							 | 
						||
| 
								 | 
							
													case Tool.Move:
							 | 
						||
| 
								 | 
							
														if (solver.target == null) solver.IKPosition = Handles.PositionHandle(solver.IKPosition, Quaternion.identity);
							 | 
						||
| 
								 | 
							
														break;
							 | 
						||
| 
								 | 
							
													case Tool.Rotate:
							 | 
						||
| 
								 | 
							
														if (solver.target == null) solver.IKRotation = Handles.RotationHandle(solver.IKRotation, solver.IKPosition);
							 | 
						||
| 
								 | 
							
														break;
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												
							 | 
						||
| 
								 | 
							
												// Target
							 | 
						||
| 
								 | 
							
												Handles.color = new Color(color.r, color.g, color.b, color.a * Mathf.Max(solver.IKPositionWeight, solver.IKRotationWeight));
							 | 
						||
| 
								 | 
							
												Handles.DrawLine(endPosition, solver.IKPosition);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											Handles.color = Color.white;
							 | 
						||
| 
								 | 
							
											GUI.color = Color.white;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										#endregion Public methods
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |