Exemplo n.º 1
0
    private void InitBezier()
    {
        if (BezierSpline == null)
        {
            BezierSpline = new GameObject().AddComponent <CatlikeBezierSpline>();
            BezierSpline.transform.parent   = null;//SpaceTimeParrametrs.Center;
            BezierSpline.transform.position = Vector3.zero;
        }
        if (BezierInitied)
        {
            return;
        }
        Debug.LogError("InitBezier");
        BezierInitied       = true;
        BezierSpline.points = new Vector3[Positions.Count * 3 - 2];
        BezierSpline.modes  = new CatlikeBezierControlPointMode[(int)Mathf.Ceil((BezierSpline.points.Length + 1) / 3f)];

        for (int i = 0; i < Positions.Count; i++)
        {
            BezierSpline.SetControlPoint(i * 3, Positions[i].Position);
            Vector3 currenControllPointPos = Positions[i].Position;

            if (i != 0)
            {
                Vector3 preDirPos = BezierSpline.points[(i - 1) * 3 + 1];
                BezierSpline.points[i * 3 - 1] = Vector3.Lerp(preDirPos, currenControllPointPos, 0.66f);
            }
            if (i != 0 && i != Positions.Count - 1)
            {
                Vector3 toNextCPDistance = Positions[i + 1].Position - currenControllPointPos;
                Vector3 prev             = (currenControllPointPos - BezierSpline.points[i * 3 - 1]).normalized;
                BezierSpline.points[i * 3 + 1] = currenControllPointPos + (prev * (toNextCPDistance.magnitude / 3));
            }
        }
    }
    public override void OnInspectorGUI()
    {
        spline = target as CatlikeBezierSpline;
        EditorGUI.BeginChangeCheck();
        bool loop = EditorGUILayout.Toggle("Loop", spline.Loop);

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(spline, "Toggle Loop");
            EditorUtility.SetDirty(spline);
            spline.Loop = loop;
        }
        if (selectedIndex >= 0 && selectedIndex < spline.ControlPointCount)
        {
            DrawSelectedPointInspector();
        }
        if (GUILayout.Button("Add Curve"))
        {
            Undo.RecordObject(spline, "Add Curve");
            spline.AddCurve();
            EditorUtility.SetDirty(spline);
        }
    }
    private void OnSceneGUI()
    {
        spline          = target as CatlikeBezierSpline;
        handleTransform = spline.transform;
        handleRotation  = Tools.pivotRotation == PivotRotation.Local ?
                          handleTransform.rotation : Quaternion.identity;

        Vector3 p0 = ShowPoint(0);

        for (int i = 1; i < spline.ControlPointCount; i += 3)
        {
            Vector3 p1 = ShowPoint(i);
            Vector3 p2 = ShowPoint(i + 1);
            Vector3 p3 = ShowPoint(i + 2);

            Handles.color = Color.gray;
            Handles.DrawLine(p0, p1);
            Handles.DrawLine(p2, p3);

            Handles.DrawBezier(p0, p3, p1, p2, Color.white, null, 2f);
            p0 = p3;
        }
        ShowDirections();
    }