protected override void DrawLocalGizmos(ref Matrix4x4 matrix)
        {
            base.DrawLocalGizmos(ref matrix);

            if (_previewRotation)
            {
                ValidateSamples();

                int segmentCount = this.segmentCount;
                Location loc;
                Quaternion rot;
                Vector3 pos;

                Handles.color = previewRotationColor;

                for (loc.index = 0; loc.index < segmentCount; loc.index++)
                {
                    int count = Mathf.CeilToInt(node(loc.index).length);

                    for (int t = 0; t <= count; t++)
                    {
                        if (t == count && loc.index != segmentCount - 1) continue;

                        loc.time = (float)t / count;
                        rot = GetRotation(loc, Space.Self);
                        pos = GetPoint(loc, Space.Self);

                        Handles.ArrowHandleCap(0, pos, rot, 0.75f, EventType.Repaint);
                        HandlesKit.DrawAALine(pos, pos + rot * Vector3.up);
                    }
                }
            }
        }
        protected virtual void DrawLocalGizmos(ref Matrix4x4 matrix)
        {
            // 绘制路径

            int count = segmentCount;

            for (int i = 0; i < count; i++)
            {
                this[i].Draw(_segmentColor, _segmentWidth);
            }

            // 绘制箭头

            using (new HandlesColorScope(_arrowColor))
            {
                Vector3 point    = this[count - 1].GetPoint(1f);
                float   scale    = HandleUtility.GetHandleSize(point) / Mathf.Abs(_worldScale);
                Vector3 vector   = new Vector3(0.06f, 0f, -0.2f) * scale;
                var     tangent  = this[count - 1].GetTangent(1f);
                var     rotation = Quaternion.LookRotation(tangent, matrix.inverse.MultiplyPoint(Camera.current.transform.position) - point);
                HandlesKit.DrawAALine(point, point + rotation * vector);
                vector.x = -vector.x;
                HandlesKit.DrawAALine(point, point + rotation * vector);
            }
        }
Exemple #3
0
            protected override void OnRotateToolSceneGUI(CardinalPathWithRotation path)
            {
                int count = path.nodeCount;

                for (int i = 0; i < count; i++)
                {
                    var position = path.GetNodePosition(i);
                    var rotation = path.GetNodeRatation(i);

                    float size = HandleUtility.GetHandleSize(position);

                    Handles.color = new Color(0.6f, 1f, 0.3f);
                    Handles.ArrowHandleCap(0, position, rotation, size, EventType.Repaint);
                    HandlesKit.DrawAALine(position, position + rotation * Vector3.up * size);

                    if (selectedNode == i)
                    {
                        using (var scope = new ChangeCheckScope(path))
                        {
                            if (path.IsNodeLookTangent(i))
                            {
                                rotation = Handles.Disc(rotation, position, rotation * Vector3.forward, size, false, 0.01f);
                            }
                            else
                            {
                                rotation = Handles.RotationHandle(rotation, position);
                            }
                            if (scope.changed)
                            {
                                path.SetNodeRatation(i, rotation);
                            }
                        }
                    }
                    else
                    {
                        Handles.color = capNormalColor;
                        if (Handles.Button(position, Quaternion.identity, size * capSize, size * capSize, Handles.DotHandleCap))
                        {
                            selectedNode = i;
                        }
                    }
                }
            }
            protected override void OnMoveToolSceneGUI(T path)
            {
                int count = path.nodeCount;

                for (int i = 0; i < count; i++)
                {
                    // 获取控制点位置
                    var   middle = path.GetNodePosition(i);
                    float capSize;

                    var back    = path.GetNodeBackControlPoint(i);
                    var forward = path.GetNodeForwardControlPoint(i);

                    // 绘制切线
                    Handles.color = selectedNode == i ? new Color(1f, 1f, 1f, 0.9f) : new Color(1f, 1f, 1f, 0.3f);
                    HandlesKit.DrawAALine(back, middle);
                    HandlesKit.DrawAALine(forward, middle);

                    // 绘制后控制点
                    capSize = HandleUtility.GetHandleSize(back) * FloatingWindow.capSize;

                    if (_selectedType == -1 && selectedNode == i)
                    {
                        using (var scope = new ChangeCheckScope(path))
                        {
                            Handles.color = capSelectedColor;
                            if (selectedTool == 0)
                            {
                                back = Handles.FreeMoveHandle(back, Quaternion.identity, capSize * 2, snap, Handles.RectangleHandleCap);
                            }
                            else if (selectedTool == 1)
                            {
                                back = Handles.PositionHandle(back, path.transform.rotation);
                            }
                            if (scope.changed)
                            {
                                path.SetNodeBackControlPoint(i, back);
                            }
                        }
                    }
                    else
                    {
                        Handles.color = capNormalColor;
                        if (Handles.Button(back, Quaternion.identity, capSize, capSize, Handles.DotHandleCap))
                        {
                            selectedNode  = i;
                            _selectedType = -1;
                        }
                    }


                    // 绘制前控制点
                    capSize = HandleUtility.GetHandleSize(forward) * FloatingWindow.capSize;

                    if (_selectedType == 1 && selectedNode == i)
                    {
                        using (var scope = new ChangeCheckScope(path))
                        {
                            Handles.color = capSelectedColor;
                            if (selectedTool == 0)
                            {
                                forward = Handles.FreeMoveHandle(forward, Quaternion.identity, capSize * 2, snap, Handles.RectangleHandleCap);
                            }
                            else if (selectedTool == 1)
                            {
                                forward = Handles.PositionHandle(forward, path.transform.rotation);
                            }
                            if (scope.changed)
                            {
                                path.SetNodeForwardControlPoint(i, forward);
                            }
                        }
                    }
                    else
                    {
                        Handles.color = capNormalColor;
                        if (Handles.Button(forward, Quaternion.identity, capSize, capSize, Handles.DotHandleCap))
                        {
                            selectedNode  = i;
                            _selectedType = 1;
                        }
                    }

                    // 绘制中控制点
                    capSize = HandleUtility.GetHandleSize(middle) * FloatingWindow.capSize;

                    if (_selectedType == 0 && selectedNode == i)
                    {
                        using (var scope = new ChangeCheckScope(path))
                        {
                            Handles.color = capSelectedColor;
                            if (selectedTool == 0)
                            {
                                middle = Handles.FreeMoveHandle(middle, Quaternion.identity, capSize * 2, snap, Handles.RectangleHandleCap);
                            }
                            else if (selectedTool == 1)
                            {
                                middle = Handles.PositionHandle(middle, path.transform.rotation);
                            }
                            if (scope.changed)
                            {
                                path.SetNodePosition(i, middle);
                            }
                        }
                    }
                    else
                    {
                        Handles.color = capNormalColor;
                        if (Handles.Button(middle, Quaternion.identity, capSize, capSize, Handles.DotHandleCap))
                        {
                            selectedNode  = i;
                            _selectedType = 0;
                        }
                    }
                }
            }
Exemple #5
0
            protected override void OnMoveToolSceneGUI(T path)
            {
                if (_showTension)
                {
                    for (int i = 0; i < path.segmentCount; i++)
                    {
                        float tension = path.GetSegmentTension(i);

                        var point1 = path.GetNodePosition(i);
                        var point2 = path.GetNodePosition((i + 1) % path.nodeCount);
                        point1 = point1 * 0.75f + point2 * 0.25f;
                        point2 = point1 / 3f + point2 * (2f / 3f);

                        var point = (point2 - point1) * tension + point1;

                        Handles.color = new Color(1f, 1f, 1f, 0.5f);
                        HandlesKit.DrawAALine(point1, point2, 4);

                        float capSize = HandleUtility.GetHandleSize(point) * FloatingWindow.capSize;

                        using (var scope = new ChangeCheckScope(path))
                        {
                            Handles.color = capNormalColor;
                            point         = Handles.FreeMoveHandle(point, Quaternion.identity, capSize, snap, Handles.CircleHandleCap);

                            tension = MathKit.ClosestPointOnSegmentFactor(point, point1, point2);
                            //tension = (float)Math.Round(tension, 2);

                            //using (new HandlesGUIScope(0))
                            //{
                            //    var pos2D = HandleUtility.WorldToGUIPoint(point);
                            //    var rect = new Rect(pos2D.x + 12, pos2D.y - 9, 32, 18);
                            //    EditorGUI.DrawRect(rect, new Color(0, 0, 0, 0.5f));
                            //    using (new GUIContentColorScope(Color.white))
                            //    {
                            //        EditorGUI.LabelField(rect, tension.ToString(), EditorStyles.whiteLabel);
                            //    }
                            //}

                            if (scope.changed)
                            {
                                path.SetSegmentTension(i, tension);
                            }
                        }
                    }
                }

                int count = path.nodeCount;

                for (int i = 0; i < count; i++)
                {
                    var position = path.GetNodePosition(i);

                    float capSize = HandleUtility.GetHandleSize(position) * FloatingWindow.capSize;

                    if (selectedNode == i)
                    {
                        using (var scope = new ChangeCheckScope(path))
                        {
                            Handles.color = capSelectedColor;
                            if (selectedTool == 0)
                            {
                                position = Handles.FreeMoveHandle(position, Quaternion.identity, capSize * 2, snap, Handles.RectangleHandleCap);
                            }
                            else
                            {
                                position = Handles.PositionHandle(position, path.transform.rotation);
                            }
                            if (scope.changed)
                            {
                                path.SetNodePosition(i, position);
                            }
                        }
                    }
                    else
                    {
                        Handles.color = capNormalColor;
                        if (Handles.Button(position, Quaternion.identity, capSize, capSize, Handles.DotHandleCap))
                        {
                            selectedNode = i;
                        }
                    }
                }
            }