private void DoIkPoseGUI(Solver2D solver, IKChain2D chain) { int controlId = GUIUtility.GetControlID(kTargetHashCode, FocusType.Passive); var color = FadeFromChain(Color.white, chain); if (!isDragging && (color.a == 0f || !IsVisible(chain.effector.position))) { return; } if (HandleUtility.nearestControl == controlId && Event.current.type == EventType.MouseDown && Event.current.button == 0) { StoreSolverPositionOverrides(solver); } EditorGUI.BeginChangeCheck(); Handles.color = color; Vector3 newPosition = Handles.Slider2D(controlId, chain.effector.position, chain.effector.forward, chain.effector.up, chain.effector.right, HandleUtility.GetHandleSize(chain.effector.position) * kCircleHandleRadius, Handles.CircleHandleCap, Vector2.zero); if (EditorGUI.EndChangeCheck()) { if (!isDragging) { isDragging = true; } IKEditorManager.instance.Record(solver, "IK Pose"); SetSolverPositionOverrides(); IKEditorManager.instance.SetChainPositionOverride(chain, newPosition); IKEditorManager.instance.UpdateSolverImmediate(solver, true); } }
public void Setup() { go = new GameObject(); var childGO = new GameObject(); childGO.transform.parent = go.transform; var targetGO = new GameObject(); targetGO.transform.parent = childGO.transform; go.transform.position = Vector3.zero; childGO.transform.position = new Vector3(1.0f, 0.0f, 0.0f); targetGO.transform.position = new Vector3(3.0f, 0.0f, 0.0f); ikGO = new GameObject(); manager = ikGO.AddComponent <IKManager2D>(); var lsGO = new GameObject(); solver = lsGO.AddComponent <LimbSolver2D>(); lsGO.transform.parent = ikGO.transform; effectorGO = new GameObject(); effectorGO.transform.parent = solver.transform; chain = solver.GetChain(0); chain.target = targetGO.transform; chain.effector = effectorGO.transform; solver.Initialize(); manager.AddSolver(solver); }
private void DoTargetGUI(Solver2D solver, IKChain2D chain) { int controlId = GUIUtility.GetControlID(kTargetHashCode, FocusType.Passive); var color = FadeFromChain(Color.white, chain); if (!isDragging && (color.a == 0f || !IsVisible(chain.target.position))) { return; } EditorGUI.BeginChangeCheck(); Handles.color = color; var newPosition = Handles.Slider2D(controlId, chain.target.position, chain.target.forward, chain.target.up, chain.target.right, HandleUtility.GetHandleSize(chain.effector.position) * kCircleHandleRadius, Handles.CircleHandleCap, Vector2.zero); if (EditorGUI.EndChangeCheck()) { if (!isDragging) { isDragging = true; IKEditorManager.instance.RegisterUndo(solver, "Move Target"); } Undo.RecordObject(chain.target, "Move Target"); chain.target.position = newPosition; } }
private void DrawChain(IKChain2D chain, Color solverColor, bool solverHasTargets) { Handles.matrix = Matrix4x4.identity; Color color = FadeFromChain(solverColor, chain); if (color.a == 0f) { return; } Transform currentTransform = chain.effector; for (int i = 0; i < chain.transformCount - 1; ++i) { var parentPosition = currentTransform.parent.position; var position = currentTransform.position; Vector3 projectedLocalPosition = Vector3.Project(currentTransform.localPosition, Vector3.right); Vector3 projectedEndPoint = currentTransform.parent.position + currentTransform.parent.TransformVector(projectedLocalPosition); var visible = IsVisible(projectedEndPoint) || IsVisible(position); if (visible && currentTransform.localPosition.sqrMagnitude != projectedLocalPosition.sqrMagnitude) { Color red = Color.red; red.a = color.a; Handles.color = red; Handles.DrawDottedLine(projectedEndPoint, position, kDottedLineLength); } visible = IsVisible(parentPosition) || IsVisible(projectedEndPoint); Handles.color = color; if (visible) { Handles.DrawDottedLine(parentPosition, projectedEndPoint, kDottedLineLength); } currentTransform = currentTransform.parent; } Handles.color = color; currentTransform = chain.effector; for (int i = 0; i < chain.transformCount; ++i) { var position = currentTransform.position; var size = HandleUtility.GetHandleSize(position); if (IsVisible(position)) { Handles.DrawSolidDisc(position, currentTransform.forward, kNodeRadius * size); } currentTransform = currentTransform.parent; } Handles.color = Color.white; }
private Color FadeFromChain(Color color, IKChain2D chain) { var size = HandleUtility.GetHandleSize(chain.effector.position); var scaleFactor = 1f; var lengths = chain.lengths; foreach (var length in lengths) { scaleFactor = Mathf.Max(scaleFactor, length); } return(FadeFromSize(color, size, kFadeStart * scaleFactor, kFadeEnd * scaleFactor)); }
public override void OnInspectorGUI() { IKChain2D chain = m_Solver.GetChain(0); serializedObject.Update(); EditorGUILayout.PropertyField(m_EffectorProperty, Contents.effectorLabel); EditorGUILayout.PropertyField(m_TargetProperty, Contents.targetLabel); EditorGUILayout.IntSlider(m_TransformCountProperty, 0, IKUtility.GetMaxChainCount(chain), Contents.chainLengthLabel); EditorGUILayout.PropertyField(m_IterationsProperty, Contents.iterationsLabel); EditorGUILayout.PropertyField(m_ToleranceProperty, Contents.toleranceLabel); DrawCommonSolverInspector(); serializedObject.ApplyModifiedProperties(); }
public void Setup() { editorManager = IKEditorManager.instance; go = new GameObject(); var child1GO = new GameObject(); child1GO.transform.parent = go.transform; var child2GO = new GameObject(); child2GO.transform.parent = child1GO.transform; var child3GO = new GameObject(); child3GO.transform.parent = child2GO.transform; targetGO = new GameObject(); targetGO.transform.parent = child3GO.transform; go.transform.position = Vector3.zero; child1GO.transform.position = new Vector3(1.0f, 0.0f, 0.0f); child2GO.transform.position = new Vector3(3.0f, 0.0f, 0.0f); child3GO.transform.position = new Vector3(6.0f, 0.0f, 0.0f); targetGO.transform.position = new Vector3(10.0f, 0.0f, 0.0f); ikGO = new GameObject(); manager = ikGO.AddComponent <IKManager2D>(); var lsGO = new GameObject(); solver = lsGO.AddComponent <FabrikSolver2D>(); lsGO.transform.parent = ikGO.transform; effectorGO = new GameObject(); effectorGO.transform.parent = solver.transform; effectorGO.transform.position = new Vector3(10.0f, 0.0f, 0.0f); chain = solver.GetChain(0); chain.target = targetGO.transform; chain.effector = effectorGO.transform; chain.transformCount = 5; solver.Initialize(); manager.AddSolver(solver); editorManager.Initialize(); }
public void SetChainPositionOverride(IKChain2D chain, Vector3 position) { m_ChainPositionOverrides[chain] = position; }
private bool IsTargetTransformSelected(IKChain2D chain) { Debug.Assert(chain.target != null); return(Selection.Contains(chain.target.gameObject)); }
private bool IsEffectorTransformSelected(IKChain2D chain) { Debug.Assert(chain.effector != null); return(Selection.Contains(chain.effector.gameObject)); }