Ejemplo n.º 1
0
    public override void OnInspectorGUI()
    {
        SkinMaker skin = (SkinMaker)target;

        EditorGUI.BeginChangeCheck();
        bool edit = EditorGUILayout.Toggle("Edit", skin.edit);

        if (EditorGUI.EndChangeCheck())
        {
            skin.SetEditMode(edit);
        }

        if (edit)
        {
            EditorGUI.BeginChangeCheck();
            var image = (Texture)EditorGUILayout.ObjectField("Image", skin.image, typeof(Texture), false);

            if (EditorGUI.EndChangeCheck())
            {
                skin.SetImage(image);
            }

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button("Generate mesh"))
            {
                skin.GenerateMesh();
            }

            if (GUILayout.Button("Subdivide mesh"))
            {
                skin.SubdivideMesh();
            }

            if (GUILayout.Button("Save mesh"))
            {
                ScriptableObjectUtility.CreateAsset(skin.mesh);
            }

            EditorGUILayout.EndHorizontal();
        }
    }
Ejemplo n.º 2
0
    void OnSceneGUI()
    {
        EventType evt = Event.current.type;

        SkinMaker skin = (SkinMaker)target;

        List <Vector3> ctlp = skin.controlPoints.Select(v => v + skin.transform.position).ToList();

        ctlp.Add(skin.controlPoints[0] + skin.transform.position);
        Vector3[] poly = ctlp.ToArray();

        Handles.color = Color.gray;
        Handles.DrawAAPolyLine(poly);

        Vector3 p       = HandleUtility.ClosestPointToPolyLine(poly);
        int     selCtrl = -1;

        Handles.color = Color.green;

        for (int i = 0; i < skin.controlPoints.Length; i++)
        {
            Vector3 hp = Handles.FreeMoveHandle(skin.transform.position + skin.controlPoints[i], Quaternion.identity, 0.05f, Vector3.zero, Handles.RectangleCap);
            if (Vector3.Distance(hp, p) < 0.05f)
            {
                selCtrl = i;
            }
            hp = hp - skin.transform.position;
            skin.controlPoints[i] = new Vector3(Mathf.Clamp(hp.x, -1, 1), Mathf.Clamp(hp.y, -1, 1), Mathf.Clamp(hp.z, -1, 1));
        }

        if (Event.current.shift)
        {
            Handles.color = Color.blue;
            Handles.DrawWireDisc(p, Vector3.forward, 0.05f);

            if (evt == EventType.mouseDown)
            {
                Undo.RecordObject(skin, "Add handle");
                for (int i = 0; i < poly.Length - 1; i++)
                {
                    float d = (float)System.Math.Round(HandleUtility.DistancePointLine(p, ctlp[i], ctlp[i + 1]), 4);
                    if (d == 0)
                    {
                        ctlp = new List <Vector3>(skin.controlPoints);
                        ctlp.Insert(i + 1, p - skin.transform.position);
                        skin.controlPoints = ctlp.ToArray();
                    }
                }
            }
        }
        else if (Event.current.control)
        {
            if (evt == EventType.mouseDown)
            {
                Undo.RecordObject(skin, "Remove handle");
                if (selCtrl != -1)
                {
                    if (skin.controlPoints.Length > 4)
                    {
                        ctlp = new List <Vector3>(skin.controlPoints);
                        ctlp.RemoveAt(selCtrl);
                        skin.controlPoints = ctlp.ToArray();
                    }
                    else
                    {
                        EditorUtility.DisplayDialog("Cannot delete control point", "There have to be at least 4 control points.", "Ok");
                    }
                }
            }
        }
    }