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); }
public HairyPlotterTriangle(HairyPlotter hairyPlotter) { plotter = hairyPlotter; vertices = new HairyPlotterVertex[3]; }
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(); } } }
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>()); } } } }