public bool DrawScene(SplineUser user)
        {
            bool         changed = false;
            bool         is2D    = user.rootUser.computer.is2D;
            SplineResult result  = new SplineResult();

            for (int i = 0; i < group.keys.Count; i++)
            {
                if (selected >= 0 && i != selected)
                {
                    continue;
                }
                user.Evaluate(result, group.keys[i].position);
                matrix.SetTRS(result.position, Quaternion.LookRotation(result.direction, result.normal), Vector3.one * result.size);
                Vector3 pos = matrix.MultiplyPoint(group.keys[i].offset);
                if (is2D)
                {
                    Handles.DrawLine(result.position, result.position + result.right * group.keys[i].offset.x * result.size);
                    Handles.DrawLine(result.position, result.position - result.right * group.keys[i].offset.x * result.size);
                }
                else
                {
                    Handles.DrawWireDisc(result.position, result.direction, group.keys[i].offset.magnitude * result.size);
                }
                Handles.DrawLine(result.position, pos);
            }

            if (selected >= 0 && selected < group.keys.Count)
            {
                double value = group.keys[selected].position;
                user.Evaluate(result, value);
                matrix.SetTRS(result.position, Quaternion.LookRotation(result.direction, result.normal), Vector3.one * result.size);
                Vector3 pos = matrix.MultiplyPoint(group.keys[selected].offset);
                if (editOffset)
                {
                    Vector3 lastPos = pos;
                    pos = SplineEditorHandles.FreeMoveRectangle(pos, HandleUtility.GetHandleSize(pos) * 0.1f);
                    if (pos != lastPos)
                    {
                        pos   = matrix.inverse.MultiplyPoint(pos);
                        pos.z = 0f;
                        if (is2D)
                        {
                            group.keys[selected].offset = Vector2.right * pos.x;
                        }
                        else
                        {
                            group.keys[selected].offset = pos;
                        }
                        changed = true;
                    }
                }
                else
                {
                    double lastValue = value;
                    SplineEditorHandles.Slider(user, ref value, user.rootUser.computer.editorPathColor, "Center", SplineEditorHandles.SplineSliderGizmo.Circle, 0.6f);
                    if (value != lastValue)
                    {
                        changed = true;
                    }
                    if (group.keys[selected].from > group.keys[selected].to)
                    {
                        double fromToEndDistance     = 1.0 - group.keys[selected].from;
                        double toToBeginningDistance = group.keys[selected].to;
                        double totalDistance         = fromToEndDistance + toToBeginningDistance;
                        if (value > group.keys[selected].from)
                        {
                            group.keys[selected].center = DMath.InverseLerp(group.keys[selected].from, group.keys[selected].from + totalDistance, value);
                        }
                        else if (value < group.keys[selected].to)
                        {
                            group.keys[selected].center = DMath.InverseLerp(-fromToEndDistance, group.keys[selected].to, value);
                        }
                    }
                    else
                    {
                        group.keys[selected].center = DMath.InverseLerp(group.keys[selected].from, group.keys[selected].to, value);
                    }
                }
                value = group.keys[selected].from;
                SplineEditorHandles.Slider(user, ref value, user.rootUser.computer.editorPathColor, "Start", SplineEditorHandles.SplineSliderGizmo.ForwardTriangle, 1f);
                if (group.keys[selected].from != value)
                {
                    group.keys[selected].from = value;
                    changed = true;
                }

                value = group.keys[selected].to;
                SplineEditorHandles.Slider(user, ref value, user.rootUser.computer.editorPathColor, "End", SplineEditorHandles.SplineSliderGizmo.BackwardTriangle, 1f);
                if (group.keys[selected].to != value)
                {
                    group.keys[selected].to = value;
                    changed = true;
                }
            }
            return(changed);
        }
Ejemplo n.º 2
0
        public override bool SceneEdit(ref SplinePoint[] points, ref List <int> selected)
        {
            bool      change       = false;
            Transform camTransform = SceneView.currentDrawingSceneView.camera.transform;

            if (focused)
            {
                if (!drag)
                {
                    if (finalize)
                    {
                        if (rect.width > 0f && rect.height > 0f)
                        {
                            if (!additive)
                            {
                                ClearSelection(ref selected);
                            }
                            for (int i = 0; i < points.Length; i++)
                            {
                                Vector2 guiPoint = HandleUtility.WorldToGUIPoint(points[i].position);
                                if (rect.Contains(guiPoint))
                                {
                                    Vector3 local = camTransform.InverseTransformPoint(points[i].position);
                                    if (local.z >= 0f)
                                    {
                                        AddPointSelection(i, ref selected);
                                        change = true;
                                    }
                                }
                            }
                        }
                        finalize = false;
                    }
                }
                else
                {
                    rectEnd = Event.current.mousePosition;
                    rect    = new Rect(Mathf.Min(rectStart.x, rectEnd.x), Mathf.Min(rectStart.y, rectEnd.y), Mathf.Abs(rectEnd.x - rectStart.x), Mathf.Abs(rectEnd.y - rectStart.y));
                    if (rect.width >= minimumRectSize && rect.height >= minimumRectSize)
                    {
                        Color col = SplinePrefs.highlightColor;
                        if (deleteMode)
                        {
                            col = Color.red;
                        }
                        col.a     = 0.4f;
                        GUI.color = col;
                        Handles.BeginGUI();
                        GUI.Box(rect, "", SplineEditorGUI.whiteBox);
                        GUI.color = Color.white;
                        Handles.EndGUI();
                        SceneView.RepaintAll();
                    }
                }
            }
            TextAnchor originalAlignment = GUI.skin.label.alignment;
            Color      originalColor     = GUI.skin.label.normal.textColor;

            GUI.skin.label.alignment        = TextAnchor.MiddleCenter;
            GUI.skin.label.normal.textColor = computer.editorPathColor;

            for (int i = 0; i < points.Length; i++)
            {
                if (computer.isClosed && i == points.Length - 1)
                {
                    break;
                }
                bool    moved      = false;
                bool    isSelected = selected.Contains(i);
                Vector3 lastPos    = points[i].position;
                Handles.color = Color.clear;
                if (SplinePrefs.showPointNumbers && camTransform.InverseTransformPoint(points[i].position).z > 0f)
                {
                    Handles.Label(points[i].position + Camera.current.transform.up * HandleUtility.GetHandleSize(points[i].position) * 0.3f, (i + 1).ToString());
                }
                if (excludeSelected && isSelected)
                {
                    SplineEditorHandles.FreeMoveRectangle(points[i].position, HandleUtility.GetHandleSize(points[i].position) * 0.1f);
                }
                else
                {
                    points[i].SetPosition(SplineEditorHandles.FreeMoveRectangle(points[i].position, HandleUtility.GetHandleSize(points[i].position) * 0.1f));
                }

                if (!change)
                {
                    if (lastPos != points[i].position)
                    {
                        moved  = true;
                        change = true;
                        if (isSelected)
                        {
                            for (int n = 0; n < selected.Count; n++)
                            {
                                if (selected[n] == i)
                                {
                                    continue;
                                }
                                points[selected[n]].SetPosition(points[selected[n]].position + (points[i].position - lastPos));
                            }
                        }
                        else if (selectOnMove)
                        {
                            selected.Clear();
                            selected.Add(i);
                            SceneView.RepaintAll();
                        }
                    }
                }

                if (!moved)
                {
                    if (SplineEditorHandles.HoverArea(points[i].position, 0.12f) && click)
                    {
                        if (shift)
                        {
                            ShiftSelect(i, points.Length, ref selected);
                        }
                        else if (additive)
                        {
                            AddPointSelection(i, ref selected);
                        }
                        else
                        {
                            SelectPoint(i, ref selected);
                        }
                        SceneView.RepaintAll();
                        change = true;
                    }
                }
                if (!excludeSelected || !isSelected)
                {
                    Handles.color = computer.editorPathColor;
                    if (deleteMode)
                    {
                        Handles.color = Color.red;
                    }
                    else if (isSelected)
                    {
                        Handles.color = SplinePrefs.highlightColor;
                    }
                    SplineEditorHandles.DrawRectangle(points[i].position, Quaternion.LookRotation(-SceneView.currentDrawingSceneView.camera.transform.forward), HandleUtility.GetHandleSize(points[i].position) * 0.1f);
                }
                moved = false;
            }
            GUI.skin.label.alignment        = originalAlignment;
            GUI.skin.label.normal.textColor = originalColor;

            if (computer.type == Spline.Type.Bezier)
            {
                Handles.color = computer.editorPathColor;
                for (int i = 0; i < selected.Count; i++)
                {
                    Handles.DrawDottedLine(points[selected[i]].position, points[selected[i]].tangent, 6f);
                    Handles.DrawDottedLine(points[selected[i]].position, points[selected[i]].tangent2, 6f);
                    Vector3 lastPos = points[selected[i]].tangent;
                    points[selected[i]].SetTangentPosition(SplineEditorHandles.FreeMoveCircle(points[selected[i]].tangent, HandleUtility.GetHandleSize(points[selected[i]].tangent) * 0.1f));
                    if (lastPos != points[selected[i]].tangent)
                    {
                        change = true;
                    }
                    lastPos = points[selected[i]].tangent2;
                    points[selected[i]].SetTangent2Position(SplineEditorHandles.FreeMoveCircle(points[selected[i]].tangent2, HandleUtility.GetHandleSize(points[selected[i]].tangent2) * 0.1f));
                    if (lastPos != points[selected[i]].tangent2)
                    {
                        change = true;
                    }
                }
            }
            return(change);
        }