HairyPlotterTriangle RaycastTriangle()
    {
        // This transform from GUI space to scene camera ray
        Ray       r = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
        Transform t = plotter.transform;         // this for position gizmo vertices and triangles according parent game object world coordinates

        // Iterate over each triangle in plotter
        for (int i = 0; i < plotter.TriangleCount; ++i)
        {
            // Grab triangle
            HairyPlotterTriangle triangle = plotter.GetTriangle(i);

            // Intersect ray
            if (HairyPlotter.RayIntersectsTriangle(
                    r,
                    t.TransformPoint(triangle.GetVertex(0).Position),
                    t.TransformPoint(triangle.GetVertex(1).Position),
                    t.TransformPoint(triangle.GetVertex(2).Position)
                    ))
            {
                // Found!
                plotter.CurrentAction = HairyPlotterActions.None;
                return(triangle);
            }
        }

        return(null);
    }
    HairyPlotterTriangle RaycastTriangle()
    {
        // This transform from GUI space to scene camera ray
        Ray r = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);

        // Iterate over each triangle in plotter
        for (int i = 0; i < plotter.TriangleCount; ++i)
        {
            // Grab triangle
            HairyPlotterTriangle triangle = plotter.GetTriangle(i);

            // Intersect ray
            if (HairyPlotter.RayIntersectsTriangle(
                    r,
                    triangle.GetVertex(0).Position,
                    triangle.GetVertex(1).Position,
                    triangle.GetVertex(2).Position
                    ))
            {
                // Found!
                plotter.CurrentAction = HairyPlotterActions.None;

                // Destroy triangle
                return(triangle);
            }
        }

        return(null);
    }
    void CleanUp(HairyPlotter plotter)
    {
        // Destroy temp mesh
        AssetDatabase.DeleteAsset("Assets/HairyPlotterMesh.asset");
        AssetDatabase.SaveAssets();

        // Un-register all delegates
        SceneView.onSceneGUIDelegate = null;
    }
    public override void OnInspectorGUI()
    {
        plotter = (HairyPlotter)target;

        if (!plotter)
        {
            return;
        }

        if (sceneViewCallback == null)
        {
            sceneViewCallback = new SceneView.OnSceneFunc(OnSceneViewRender);
        }

        if (!ReferenceEquals(SceneView.onSceneGUIDelegate, sceneViewCallback))
        {
            SceneView.onSceneGUIDelegate = sceneViewCallback;
        }

        plotter.InitEditing();

        EditorGUILayout.LabelField("Edit Mesh", plotter.EditMesh.name);
        EditorGUILayout.LabelField("Original Mesh", plotter.OriginalMesh ?? "");
        EditorGUILayout.LabelField("Vertex Count", plotter.VertexCount.ToString());
        EditorGUILayout.LabelField("Triangle Count", plotter.TriangleCount.ToString());
        EditorGUILayout.LabelField("Unused Vertices", plotter.UnusedVerticesCount.ToString());

        VertexToolbox();
        TriangleToolbox();
        VertexSelectionToolbox();
        TriangleSelectionToolbox();
        UvToolbox();

        plotter.UpdateMesh();

        if (Event.current.type == EventType.Repaint)
        {
            if (SceneView.lastActiveSceneView != null)
            {
                SceneView.lastActiveSceneView.Repaint();
            }
        }
    }
    HairyPlotterVertex RaycastVertex()
    {
        // This transform from GUI space to scene camera ray
        Ray       r = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
        Transform t = plotter.transform;         // this for position gizmo vertices and triangles according parent game object world coordinates

        // Iterate over each vertex in plotter
        for (int i = 0; i < plotter.VertexCount; ++i)
        {
            // Grab triangle
            HairyPlotterVertex vertex = plotter.GetVertex(i);

            // Intersect ray
            if (HairyPlotter.RayIntersectsVertex(r, t.TransformPoint(vertex.Position), GizmoSize))
            {
                // Found!
                return(vertex);
            }
        }

        return(null);
    }
Example #6
0
 public HairyPlotterTriangle(HairyPlotter hairyPlotter)
 {
     plotter = hairyPlotter;
     vertices = new HairyPlotterVertex[3];
 }
Example #7
0
 public HairyPlotterVertex(Vector3 pos, Vector2 uv, HairyPlotter hairyPlotter)
 {
     Uv = uv;
     Position = pos;
     plotter = 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 != "")
                    {
                        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()
    {
        plotter = (HairyPlotter)target;

        if (!plotter) 
            return;

        if (sceneViewCallback == null)
            sceneViewCallback = new SceneView.OnSceneFunc(OnSceneViewRender);

        if (!ReferenceEquals(SceneView.onSceneGUIDelegate, sceneViewCallback))
            SceneView.onSceneGUIDelegate = sceneViewCallback;

        plotter.InitEditing();

        EditorGUILayout.LabelField("Edit Mesh", plotter.EditMesh.name);
        EditorGUILayout.LabelField("Original Mesh", plotter.OriginalMesh ?? "");
        EditorGUILayout.LabelField("Vertex Count", plotter.VertexCount.ToString());
        EditorGUILayout.LabelField("Triangle Count", plotter.TriangleCount.ToString());
        EditorGUILayout.LabelField("Unused Vertices", plotter.UnusedVerticesCount.ToString());

        VertexToolbox();
        TriangleToolbox();
        VertexSelectionToolbox();
        TriangleSelectionToolbox();
        UvToolbox();

        plotter.UpdateMesh();

        if (Event.current.type == EventType.Repaint)
        {
            if (SceneView.lastActiveSceneView != null)
            {
                SceneView.lastActiveSceneView.Repaint();
            }
        }
    }
    void CleanUp(HairyPlotter plotter)
    {
        // Destroy temp mesh
        AssetDatabase.DeleteAsset("Assets/HairyPlotterMesh.asset");
        AssetDatabase.SaveAssets();

        // Un-register all delegates
        SceneView.onSceneGUIDelegate = null;
    }
    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>());
                }
            }
        }
    }
Example #12
0
 public HairyPlotterTriangle(HairyPlotter hairyPlotter)
 {
     plotter  = hairyPlotter;
     vertices = new HairyPlotterVertex[3];
 }
Example #13
0
 public HairyPlotterVertex(Vector3 pos, Vector2 uv, HairyPlotter hairyPlotter)
 {
     Uv       = uv;
     Position = pos;
     plotter  = hairyPlotter;
 }