Example #1
0
 public static void CreateBezierPath()
 {
     GameObject go = new GameObject("BezierPath");
     BezierPath path = go.AddComponent<BezierPath>();
     BezierPath.PathPoint p = new BezierPath.PathPoint();
     path.points.Add(p);
 }
Example #2
0
 void addPoint(BezierPath path, BezierPath.PathPoint point)
 {
     Undo.RegisterUndo(path, "create bezier point");
     // if lsat point, add new. if middle point, add point inbetween
     if(path.points.Count - 1 == path.points.IndexOf(point))
     {
         // add at end
         BezierPath.PathPoint p = new BezierPath.PathPoint();
         if(point.h1.magnitude < Mathf.Epsilon)
             p.p1 = point.p1 + (Vector3.right) * 2;
         else
             p.p1 = point.p1 + (point.h1).normalized * 2;
         p.h1 = point.h1;
         path.points.Add(p);
         selectedPoint = p;
     }
     else
     {
         // add in middle
         BezierPath.PathPoint point2 = path.points[path.points.IndexOf(point) + 1];
         Bezier b = new Bezier(point.p1, point.h1, -point2.h1, point2.p1);
         BezierPath.PathPoint p = new BezierPath.PathPoint();
         p.p1 = b.GetPointAtTime(0.5f);
         p.h1 = b.GetPointAtTime(0.6f) - p.p1;
         path.points.Insert(path.points.IndexOf(point) + 1, p);
     }
 }
Example #3
0
 void addPoint(BezierPath path, BezierPath.PathPoint point)
 {
     Undo.RegisterUndo(path, "create bezier point");
     // if lsat point, add new. if middle point, add point inbetween
     if (path.points.Count - 1 == path.points.IndexOf(point))
     {
         // add at end
         BezierPath.PathPoint p = new BezierPath.PathPoint();
         if (point.h1.magnitude < Mathf.Epsilon)
         {
             p.p1 = point.p1 + (Vector3.right) * 2;
         }
         else
         {
             p.p1 = point.p1 + (point.h1).normalized * 2;
         }
         p.h1 = point.h1;
         path.points.Add(p);
         selectedPoint = p;
     }
     else
     {
         // add in middle
         BezierPath.PathPoint point2 = path.points[path.points.IndexOf(point) + 1];
         Bezier b = new Bezier(point.p1, point.h1, -point2.h1, point2.p1);
         BezierPath.PathPoint p = new BezierPath.PathPoint();
         p.p1 = b.GetPointAtTime(0.5f);
         p.h1 = b.GetPointAtTime(0.6f) - p.p1;
         path.points.Insert(path.points.IndexOf(point) + 1, p);
     }
 }
Example #4
0
    public static void CreateBezierPath()
    {
        GameObject go   = new GameObject("BezierPath");
        BezierPath path = go.AddComponent <BezierPath>();

        BezierPath.PathPoint p = new BezierPath.PathPoint();
        path.points.Add(p);
    }
Example #5
0
    void deletePoint(BezierPath path, BezierPath.PathPoint point)
    {
        Undo.RegisterUndo(path, "delete bezier point");
        if (path.points.Count > 1)
        {
            path.points.Remove(point);
        }

        if (selectedPoint == point)
        {
            selectedPoint = path.points[0];
        }
    }
Example #6
0
    void deletePoint(BezierPath path, BezierPath.PathPoint point)
    {
        Undo.RegisterUndo(path, "delete bezier point");
        if(path.points.Count > 1)
            path.points.Remove(point);

        if(selectedPoint == point)
            selectedPoint = path.points[0];
    }
Example #7
0
    void OnSceneGUI()
    {
        BezierPath path = (BezierPath)target;

        if(Event.current.type == EventType.mouseDown)
        {
            // record positions
            pointPos = selectedPoint.p1;
            handlePos = selectedPoint.h1;
        }
        if(Event.current.type == EventType.mouseUp)
        {
            if(selectedPoint.p1 != pointPos || selectedPoint.h1 != handlePos)
            {
                // put them back, register undo
                Vector3 newPos = selectedPoint.p1;
                Vector3 newHandle = selectedPoint.h1;
                selectedPoint.p1 = pointPos;
                selectedPoint.h1 = handlePos;
                Undo.RegisterUndo(path, "moving point");
                selectedPoint.p1 = newPos;
                selectedPoint.h1 = newHandle;
                EditorUtility.SetDirty(path);
            }
        }
        bool needCreatePoint = false;
        bool needDeletePoint = false;

        if(selectedPoint != null && Event.current.type != EventType.repaint)
        {
            // add + and - buttons
            Handles.BeginGUI();
            Vector2 screenpos = HandleUtility.WorldToGUIPoint(selectedPoint.p1);
            // inverse y
            //screenpos.y = Screen.height - screenpos.y;
            if(GUI.Button(new Rect(screenpos.x - 10 + 20, screenpos.y - 20, 20, 20), "+"))
                needCreatePoint = true;
            if(GUI.Button(new Rect(screenpos.x - 10 - 20, screenpos.y - 20, 20, 20), "-"))
                needDeletePoint = true;
            Handles.EndGUI();
        }

        // disable transform tool if selected
        if(Selection.activeGameObject == path.gameObject)
        {
            Tools.current = Tool.None;
            if(selectedPoint == null && path.points.Count > 0)
                selectedPoint = path.points[0];
        }

        // draw the handles for the points
        foreach(BezierPath.PathPoint point in path.points)
        {
            if(point == selectedPoint)
            {
                //if (GUI.changed)
                //    EditorUtility.SetDirty(target);
                point.p1 = Handles.PositionHandle(point.p1, Quaternion.identity);

                point.h1 = Handles.PositionHandle(point.h1 + point.p1, Quaternion.identity) - point.p1;
                Handles.CubeCap(0, point.p1, Quaternion.identity, 1);
                Handles.CubeCap(0, point.h1 + point.p1, Quaternion.identity, 0.5f);
            }
            else
            {
                // draw button
                float size = 1;//HandleUtility.GetHandleSize(point.p1) / 3;
                if(Handles.Button(point.p1, Quaternion.identity, 1, size, Handles.CubeCap))
                {
                    selectedPoint = point;
                }
            }
        }

        Handles.color = path.lineColor;
        // draw the lines
        for(int i = 0; i < path.points.Count - 1; i++)
        {
            // draw line from point i to point i+1
            path.points[i].bezier.p1 = path.points[i].p1;
            path.points[i].bezier.h1 = path.points[i].h1;
            path.points[i].bezier.p2 = path.points[i + 1].p1;
            path.points[i].bezier.h2 = -path.points[i + 1].h1; // negative of this handle

            Vector3 oldPos = path.points[i].bezier.GetPointAtTime(0);
            for(float t = 0; t < 1.01; t += 0.1f)
            {
                Vector3 newPos = path.points[i].bezier.GetPointAtTime(t);
                Handles.DrawLine(oldPos, newPos);
                oldPos = newPos;
            }
        }

        if(selectedPoint != null && Event.current.type == EventType.repaint)
        {
            // add + and - buttons
            Handles.BeginGUI();
            Vector2 screenpos = HandleUtility.WorldToGUIPoint(selectedPoint.p1);
            // inverse y
            //screenpos.y = Screen.height - screenpos.y;
            if(GUI.Button(new Rect(screenpos.x - 10 + 20, screenpos.y - 20, 20, 20), "+"))
                needCreatePoint = true;
            if(GUI.Button(new Rect(screenpos.x - 10 - 20, screenpos.y - 20, 20, 20), "-"))
                needDeletePoint = true;
            Handles.EndGUI();
        }

        if(needCreatePoint)
            addPoint(path, selectedPoint);

        if(needDeletePoint)
            deletePoint(path, selectedPoint);

        if(GUI.changed)
            EditorUtility.SetDirty(target);
    }
Example #8
0
    void OnSceneGUI()
    {
        BezierPath path = (BezierPath)target;

        if (Event.current.type == EventType.MouseDown)
        {
            // record positions
            pointPos  = selectedPoint.p1;
            handlePos = selectedPoint.h1;
        }
        if (Event.current.type == EventType.MouseUp)
        {
            if (selectedPoint.p1 != pointPos || selectedPoint.h1 != handlePos)
            {
                // put them back, register undo
                Vector3 newPos    = selectedPoint.p1;
                Vector3 newHandle = selectedPoint.h1;
                selectedPoint.p1 = pointPos;
                selectedPoint.h1 = handlePos;
                Undo.RegisterUndo(path, "moving point");
                selectedPoint.p1 = newPos;
                selectedPoint.h1 = newHandle;
                EditorUtility.SetDirty(path);
            }
        }
        bool needCreatePoint = false;
        bool needDeletePoint = false;

        if (selectedPoint != null && Event.current.type != EventType.Repaint)
        {
            // add + and - buttons
            Handles.BeginGUI();
            Vector2 screenpos = HandleUtility.WorldToGUIPoint(selectedPoint.p1);
            // inverse y
            //screenpos.y = Screen.height - screenpos.y;
            if (GUI.Button(new Rect(screenpos.x - 10 + 20, screenpos.y - 20, 20, 20), "+"))
            {
                needCreatePoint = true;
            }
            if (GUI.Button(new Rect(screenpos.x - 10 - 20, screenpos.y - 20, 20, 20), "-"))
            {
                needDeletePoint = true;
            }
            Handles.EndGUI();
        }


        // disable transform tool if selected
        if (Selection.activeGameObject == path.gameObject)
        {
            Tools.current = Tool.None;
            if (selectedPoint == null && path.points.Count > 0)
            {
                selectedPoint = path.points[0];
            }
        }

        // draw the handles for the points
        foreach (BezierPath.PathPoint point in path.points)
        {
            if (point == selectedPoint)
            {
                //if (GUI.changed)
                //    EditorUtility.SetDirty(target);
                point.p1 = Handles.PositionHandle(point.p1, Quaternion.identity);

                point.h1 = Handles.PositionHandle(point.h1 + point.p1, Quaternion.identity) - point.p1;
                Handles.CubeCap(0, point.p1, Quaternion.identity, 1);
                Handles.CubeCap(0, point.h1 + point.p1, Quaternion.identity, 0.5f);
            }
            else
            {
                // draw button
                float size = 1;//HandleUtility.GetHandleSize(point.p1) / 3;
                if (Handles.Button(point.p1, Quaternion.identity, 1, size, Handles.CubeCap))
                {
                    selectedPoint = point;
                }
            }
        }

        Handles.color = path.lineColor;
        // draw the lines
        for (int i = 0; i < path.points.Count - 1; i++)
        {
            // draw line from point i to point i+1
            path.points[i].bezier.p1 = path.points[i].p1;
            path.points[i].bezier.h1 = path.points[i].h1;
            path.points[i].bezier.p2 = path.points[i + 1].p1;
            path.points[i].bezier.h2 = -path.points[i + 1].h1; // negative of this handle

            Vector3 oldPos = path.points[i].bezier.GetPointAtTime(0);
            for (float t = 0; t < 1.01; t += 0.1f)
            {
                Vector3 newPos = path.points[i].bezier.GetPointAtTime(t);
                Handles.DrawLine(oldPos, newPos);
                oldPos = newPos;
            }
        }

        if (selectedPoint != null && Event.current.type == EventType.Repaint)
        {
            // add + and - buttons
            Handles.BeginGUI();
            Vector2 screenpos = HandleUtility.WorldToGUIPoint(selectedPoint.p1);
            // inverse y
            //screenpos.y = Screen.height - screenpos.y;
            if (GUI.Button(new Rect(screenpos.x - 10 + 20, screenpos.y - 20, 20, 20), "+"))
            {
                needCreatePoint = true;
            }
            if (GUI.Button(new Rect(screenpos.x - 10 - 20, screenpos.y - 20, 20, 20), "-"))
            {
                needDeletePoint = true;
            }
            Handles.EndGUI();
        }

        if (needCreatePoint)
        {
            addPoint(path, selectedPoint);
        }

        if (needDeletePoint)
        {
            deletePoint(path, selectedPoint);
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }
    }