Пример #1
0
        private void OnSceneGUI()
        {
            BezierSpline curve = (BezierSpline)target;

            Transform  t = curve.transform;
            Quaternion r = Tools.pivotRotation == PivotRotation.Local ? t.rotation : Quaternion.identity;

            for (int i = 0; i < curve.points.Count; i++)
            {
                Vector3 p = t.TransformPoint(curve.points[i]);

                Handles.color = Color.white;

                float size = HandleUtility.GetHandleSize(p);
                if (Handles.Button(p, r, size * 0.04f, size * 0.06f, Handles.DotCap))
                {
                    selectedIndex = i;
                    Repaint();
                }

                if (selectedIndex == i)
                {
                    EditorGUI.BeginChangeCheck();
                    p = Handles.DoPositionHandle(p, r);
                    if (EditorGUI.EndChangeCheck())
                    {
                        Undo.RecordObject(curve, "Move Point");
                        curve.SetControlPoint(i, t.InverseTransformPoint(p));
                        EditorUtility.SetDirty(curve);
                    }
                }
            }

            Handles.color = curve.tangentColor;
            for (int i = 0; i < curve.points.Count - 1; i++)
            {
                if (i % 3 == 1)
                {
                    continue;
                }

                Vector3 p0 = t.TransformPoint(curve.points[i]);
                Vector3 p1 = t.TransformPoint(curve.points[i + 1]);
                Handles.DrawLine(p0, p1);
            }

            Handles.color = curve.curveColor;
            for (int i = 0; i < curve.points.Count / 3; i++)
            {
                Vector3 p0 = t.TransformPoint(curve.points[3 * i]);
                Vector3 p1 = t.TransformPoint(curve.points[3 * i + 1]);
                Vector3 p2 = t.TransformPoint(curve.points[3 * i + 2]);
                Vector3 p3 = t.TransformPoint(curve.points[3 * i + 3]);

                Handles.DrawBezier(p0, p3, p1, p2, curve.curveColor, null, 2f);
            }

            Handles.color = curve.uniformSamplingColor;
            if (Camera.current)
            {
                Vector3 up    = Camera.current.transform.up;
                Vector3 right = Camera.current.transform.right;

                for (float i = 0; i < curve.points.Count / 3; i += 0.02f)
                {
                    Vector3 p0   = curve.EvaluateUniform(i);
                    float   size = HandleUtility.GetHandleSize(p0) * 0.02f;

                    Vector3[] rect = new Vector3[] { p0 - right * size, p0 - up * size, p0 + right * size, p0 + up * size };

                    Handles.DrawSolidRectangleWithOutline(rect, curve.uniformSamplingColor, curve.uniformSamplingColor);
                }
            }
        }