public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        MeshFilter   filter  = (MeshFilter)target;
        HairyPlotter plotter = filter.GetComponent <HairyPlotter>();

        if (plotter)
        {
            if (saveAsset)
            {
                EditorGUILayout.BeginHorizontal();

                saveName = EditorGUILayout.TextField("Save Mesh As", saveName);

                if (GUILayout.Button("Save", EditorStyles.miniButton))
                {
                    if (saveName != "")
                    {
                        string path = "Assets/" + saveName + ".asset";

                        // Make sure mesh is latest version
                        plotter.UpdateMesh();

                        // Create asset mesh
                        Mesh asset = HairyPlotter.CloneMesh(plotter.EditMesh);

                        // Load current
                        Mesh currentAsset = (Mesh)AssetDatabase.LoadAssetAtPath(path, typeof(Mesh));

                        if (currentAsset)
                        {
                            currentAsset.Clear();
                            currentAsset.vertices  = asset.vertices;
                            currentAsset.uv        = asset.uv;
                            currentAsset.triangles = asset.triangles;
                            currentAsset.RecalculateBounds();
                            currentAsset.RecalculateNormals();

                            AssetDatabase.SaveAssets();
                        }
                        else
                        {
                            // Create asset new asset
                            AssetDatabase.CreateAsset(asset, "Assets/" + saveName + ".asset");
                        }

                        // Store asset on filter
                        filter.sharedMesh = asset;

                        // Set dirty
                        EditorUtility.SetDirty(filter);

                        // Destroy plotter object
                        MonoBehaviour.DestroyImmediate(plotter);

                        // Clean up assets
                        CleanUp(plotter);
                    }
                    else
                    {
                        Debug.LogWarning("Enter a name for the mesh asset");
                    }
                }

                if (GUILayout.Button("Cancel", EditorStyles.miniButton))
                {
                    saveAsset = false;
                }

                EditorGUILayout.EndHorizontal();
            }
            else
            {
                if (GUILayout.Button("Save Mesh And Stop Editing", EditorStyles.miniButton))
                {
                    saveName  = "";
                    saveAsset = true;
                }

                if (GUILayout.Button("Revert Mesh", EditorStyles.miniButton))
                {
                    if (plotter.OriginalMesh != null)
                    {
                        // Load main asset
                        filter.sharedMesh = (Mesh)AssetDatabase.LoadMainAssetAtPath(plotter.OriginalMesh);
                    }
                    else
                    {
                        // Reset to empty mesh
                        filter.sharedMesh = new Mesh();


                        Debug.LogWarning("No original mesh to revert to");
                    }

                    // Clear edit asset
                    plotter.EditMesh     = null;
                    plotter.OriginalMesh = null;

                    // Mark dirty
                    EditorUtility.SetDirty(filter);
                }

                if (GUILayout.Button("Abort Editing", EditorStyles.miniButton))
                {
                    if (plotter.OriginalMesh != null)
                    {
                        filter.sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(plotter.OriginalMesh, typeof(Mesh));
                    }
                    else
                    {
                        // No mesh to revert to
                        filter.sharedMesh = null;
                    }

                    // Set dirty
                    EditorUtility.SetDirty(filter);

                    // Destroy plotter object
                    MonoBehaviour.DestroyImmediate(plotter);

                    // Clean upp assets
                    CleanUp(plotter);
                }
            }
        }
        else
        {
            if (AssetDatabase.LoadAssetAtPath("Assets/HairyPlotterMesh.asset", typeof(Mesh)))
            {
                EditorGUILayout.LabelField("Another mesh is already being edited with HairyPlotter", EditorStyles.miniLabel);
            }
            else
            {
                if (GUILayout.Button("Edit Mesh With HairyPlotter", EditorStyles.miniButton))
                {
                    EditorUtility.SetDirty(filter);
                    EditorUtility.SetDirty(filter.gameObject.AddComponent <HairyPlotter>());
                }
            }
        }
    }
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        MeshFilter   filter  = (MeshFilter)target;
        HairyPlotter plotter = filter.GetComponent <HairyPlotter>();

        if (plotter)
        {
            if (saveAsset)
            {
                EditorGUILayout.BeginHorizontal();

                saveName = EditorGUILayout.TextField("Save Mesh As", saveName);

                if (GUILayout.Button("Save", EditorStyles.miniButton))
                {
                    if (saveName != "")
                    {
                        // Make sure mesh is latest version
                        plotter.UpdateMesh();

                        // Create asset mesh
                        Mesh asset = HairyPlotter.CloneMesh(plotter.EditMesh);

                        // Create asset and destroy temp mesh
                        AssetDatabase.CreateAsset(asset, "Assets/" + saveName + ".asset");

                        // Store asset on filter
                        filter.sharedMesh = asset;

                        // Set dirty
                        EditorUtility.SetDirty(filter);

                        // Destroy plotter object
                        MonoBehaviour.DestroyImmediate(plotter);

                        // Clean up assets
                        CleanUp(plotter);
                    }
                    else
                    {
                        Debug.LogWarning("Enter a name for the mesh asset");
                    }
                }

                if (GUILayout.Button("Cancel", EditorStyles.miniButton))
                {
                    saveAsset = false;
                }

                EditorGUILayout.EndHorizontal();
            }
            else
            {
                if (GUILayout.Button("Save Mesh And Stop Editing", EditorStyles.miniButton))
                {
                    saveName  = "";
                    saveAsset = true;
                }

                if (GUILayout.Button("Revert Mesh", EditorStyles.miniButton))
                {
                    if (plotter.OriginalMesh != null)
                    {
                        // Load main asset
                        filter.sharedMesh = (Mesh)AssetDatabase.LoadMainAssetAtPath(plotter.OriginalMesh);
                    }
                    else
                    {
                        // Reset to empty mesh
                        filter.sharedMesh = new Mesh();


                        Debug.LogWarning("No original mesh to revert to");
                    }

                    // Clear edit asset
                    plotter.EditMesh     = null;
                    plotter.OriginalMesh = null;

                    // Mark dirty
                    EditorUtility.SetDirty(filter);
                }

                if (GUILayout.Button("Abort Editing", EditorStyles.miniButton))
                {
                    if (plotter.OriginalMesh != null)
                    {
                        filter.sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(plotter.OriginalMesh, typeof(Mesh));
                    }
                    else
                    {
                        // No mesh to revert to
                        filter.sharedMesh = null;
                    }

                    // Set dirty
                    EditorUtility.SetDirty(filter);

                    // Destroy plotter object
                    MonoBehaviour.DestroyImmediate(plotter);

                    // Clean upp assets
                    CleanUp(plotter);
                }

                // select vertex gizmo size
                HairyPlotterEditor.GizmoSize = EditorGUILayout.FloatField("Gizmo Vertex Zize", HairyPlotterEditor.GizmoSize);
                // keep UV mapping while moving verts?
                HairyPlotterEditor.KeepUVOnVertsMove = EditorGUILayout.Toggle("Keep vertices UVs", HairyPlotterEditor.KeepUVOnVertsMove);
            }
        }
        else
        {
            if (AssetDatabase.LoadAssetAtPath("Assets/HairyPlotterMesh.asset", typeof(Mesh)))
            {
                EditorGUILayout.LabelField("Another mesh is already being edited with HairyPlotter", EditorStyles.miniLabel);
            }
            else
            {
                if (GUILayout.Button("Edit Mesh With HairyPlotter", EditorStyles.miniButton))
                {
                    EditorUtility.SetDirty(filter);
                    EditorUtility.SetDirty(filter.gameObject.AddComponent <HairyPlotter>());
                }
            }
        }
    }