/* * Draws the scene view helpers for IKSolverFullBodyBiped * */ public static void AddScene(IKSolverFullBodyBiped solver, Color color, bool modifiable, ref int selectedEffector, Transform root) { if (!solver.IsValid(false)) { return; } float heightF = Vector3.Distance(solver.chain.children[0].nodes[0].transform.position, solver.chain.children[0].nodes[1].transform.position) + Vector3.Distance(solver.chain.children[2].nodes[0].transform.position, solver.chain.children[2].nodes[1].transform.position); float size = Mathf.Clamp(heightF * 0.1f, 0.005f, 0.05f); // Chain if (!Application.isPlaying) { IKSolverFullBodyInspector.AddChain(solver.chain, color, size); Handles.DrawLine(solver.chain.children[0].nodes[0].transform.position, solver.chain.children[1].nodes[0].transform.position); Handles.DrawLine(solver.chain.children[2].nodes[0].transform.position, solver.chain.children[3].nodes[0].transform.position); AddLimbHelper(solver.chain.children[0], size); AddLimbHelper(solver.chain.children[1], size); AddLimbHelper(solver.chain.children[2], size, root); AddLimbHelper(solver.chain.children[3], size, root); } // Effectors IKSolverFullBodyInspector.AddScene(solver, color, modifiable, ref selectedEffector, size); }
// Draws the custom inspector for IKSolverFullBodybiped public static void AddInspector(SerializedProperty prop, bool editHierarchy, bool editWeights) { IKSolverFullBodyInspector.AddInspector(prop, editHierarchy, editWeights); EditorGUILayout.Space(); EditorGUI.indentLevel = 0; AddSolver(prop); }
// Draws the scene view helpers for IKSolverFullBodyBiped public static void AddScene(UnityEngine.Object target, IKSolverFullBodyBiped solver, Color color, ref int selectedEffector, Transform root) { if (Application.isPlaying && !solver.initiated) { return; } if (!Application.isPlaying && !solver.IsValid()) { return; } bool modifiable = solver.initiated; float heightF = Vector3.Distance(solver.chain[1].nodes[0].transform.position, solver.chain[1].nodes[1].transform.position) + Vector3.Distance(solver.chain[3].nodes[0].transform.position, solver.chain[3].nodes[1].transform.position); float size = Mathf.Clamp(heightF * 0.075f, 0.001f, Mathf.Infinity); // Bend goals for (int i = 0; i < solver.chain.Length; i++) { if (solver.chain[i].nodes.Length == 3 && solver.chain[i].bendConstraint.bendGoal != null && solver.chain[i].bendConstraint.weight > 0f) { Color c = color; c.a = solver.chain[i].bendConstraint.weight; Handles.color = c; Handles.DrawLine(solver.chain[i].nodes[1].transform.position, solver.chain[i].bendConstraint.bendGoal.position); Handles.SphereHandleCap(0, solver.chain[i].nodes[1].transform.position, Quaternion.identity, size * 0.5f, EventType.Repaint); Handles.SphereHandleCap(0, solver.chain[i].bendConstraint.bendGoal.position, Quaternion.identity, size * 0.5f, EventType.Repaint); Handles.color = Color.white; } } // Chain if (!modifiable) { for (int i = 0; i < solver.chain.Length; i++) { IKSolverFullBodyInspector.AddChain(solver.chain, i, color, size); } Handles.DrawLine(solver.chain[1].nodes[0].transform.position, solver.chain[2].nodes[0].transform.position); Handles.DrawLine(solver.chain[3].nodes[0].transform.position, solver.chain[4].nodes[0].transform.position); AddLimbHelper(solver.chain[1], size); AddLimbHelper(solver.chain[2], size); AddLimbHelper(solver.chain[3], size, root); AddLimbHelper(solver.chain[4], size, root); } // Effectors IKSolverFullBodyInspector.AddScene(target, solver, color, modifiable, ref selectedEffector, size); }
/* * Returns all solver SeiralizedProperties * */ public static SerializedContent[] FindContent(SerializedProperty prop) { SerializedContent[] c = IKSolverFullBodyInspector.FindContent(prop); Array.Resize(ref c, c.Length + 7); c[c.Length - 1] = new SerializedContent(prop.FindPropertyRelative("pullBodyVertical"), new GUIContent("Pull Body Vertical", "Weight of hand effectors pulling the body vertically.")); c[c.Length - 2] = new SerializedContent(prop.FindPropertyRelative("limbMappings"), GUIContent.none); c[c.Length - 3] = new SerializedContent(prop.FindPropertyRelative("spineMapping"), GUIContent.none); c[c.Length - 4] = new SerializedContent(prop.FindPropertyRelative("boneMappings"), GUIContent.none); c[c.Length - 5] = new SerializedContent(prop.FindPropertyRelative("rootNode"), new GUIContent("Root Node", "Select one of the bones in the (lower) spine.")); c[c.Length - 6] = new SerializedContent(prop.FindPropertyRelative("spineStiffness"), new GUIContent("Spine Stiffness", "The bend resistance of the spine.")); c[c.Length - 7] = new SerializedContent(prop.FindPropertyRelative("pullBodyHorizontal"), new GUIContent("Pull Body Horizontal", "Weight of hand effectors pulling the body horizontally.")); return(c); }
/* * Draws the custom inspector for IKSolverFullBodybiped * */ public static void AddInspector(SerializedProperty prop, bool editHierarchy, bool editWeights, SerializedContent[] content) { IKSolverFullBodyInspector.AddInspector(prop, editHierarchy, editWeights, content); // Spine Iteration AddClampedInt(content[content.Length - 3].prop.FindPropertyRelative("iterations"), new GUIContent("Spine Mapping Iterations", "Iterations of FABRIK solver mapping the spine to the FBIK nodes."), 1, 10); // Spine Stiffness AddClampedFloat(content[content.Length - 6]); // Pull Body AddClampedFloat(content[content.Length - 1], -1f, 1f); AddClampedFloat(content[content.Length - 7], -1f, 1f); // Chain EditorGUILayout.Space(); EditorGUI.indentLevel = 0; EditorGUILayout.PropertyField(content[4].prop, new GUIContent("Chain", "The node chain.")); if (content[4].prop.isExpanded) { AddPulls(content[4].prop); EditorGUILayout.Space(); } // Effectors EditorGUI.indentLevel = 0; EditorGUILayout.PropertyField(content[2].prop, new GUIContent("Effectors", "Effectors for manipulating the node chain.")); if (content[2].prop.isExpanded) { // Body AddEffector(content[2].prop.GetArrayElementAtIndex(0), new GUIContent("Body"), false); // Left Shoulder AddEffector(content[2].prop.GetArrayElementAtIndex(1), new GUIContent("L Shoulder"), false); // Right Shoulder AddEffector(content[2].prop.GetArrayElementAtIndex(2), new GUIContent("R Shoulder"), false); // Left Thigh AddEffector(content[2].prop.GetArrayElementAtIndex(3), new GUIContent("L Thigh"), false); // Right Thigh AddEffector(content[2].prop.GetArrayElementAtIndex(4), new GUIContent("R Thigh"), false); // Left Hand AddEffector(content[2].prop.GetArrayElementAtIndex(5), new GUIContent("L Hand")); // Right Hand AddEffector(content[2].prop.GetArrayElementAtIndex(6), new GUIContent("R Hand")); // Left Foot AddEffector(content[2].prop.GetArrayElementAtIndex(7), new GUIContent("L Foot")); // Right Foot AddEffector(content[2].prop.GetArrayElementAtIndex(8), new GUIContent("R Foot")); EditorGUILayout.Space(); } EditorGUI.indentLevel = 0; // Mappings EditorGUILayout.PropertyField(content[content.Length - 3].prop, new GUIContent("Mapping", "Options for mapping bones to their solver positions.")); if (content[content.Length - 3].prop.isExpanded) { AddSpineMapping(content[content.Length - 3].prop, new GUIContent("Spine")); AddMapping(content[content.Length - 2].prop.GetArrayElementAtIndex(0), new GUIContent("Left Hand")); AddMapping(content[content.Length - 2].prop.GetArrayElementAtIndex(1), new GUIContent("Right Hand")); AddMapping(content[content.Length - 2].prop.GetArrayElementAtIndex(2), new GUIContent("Left Foot")); AddMapping(content[content.Length - 2].prop.GetArrayElementAtIndex(3), new GUIContent("Right Foot")); AddMapping(content[content.Length - 4].prop.GetArrayElementAtIndex(0), new GUIContent("Head")); } }