private void OnEnable()
 {
     EditorApplication.update += Update;
     tool = (RiverTool)target;
 }
    public override void OnInspectorGUI()
    {
        RiverTool rt = (RiverTool)target;

        GUILayout.BeginHorizontal();
        if (GUILayout.Button("Init"))
        {
            string scene = System.IO.Path.GetFileNameWithoutExtension(UnityEditor.EditorApplication.currentScene);
            string str   = scene + GameObject.FindObjectsOfType(typeof(RiverTool)).Length.ToString();
            rt.gameObject.name = str + "_River";
            rt.init();
            GameObject p1 = new GameObject("P1");
            p1.transform.parent        = rt.transform;
            p1.transform.localPosition = Vector3.zero;
            GameObject p2 = new GameObject("P2");
            p2.transform.parent        = rt.transform;
            p2.transform.localPosition = Vector3.forward;
            GameObject p3 = new GameObject("P3");
            p3.transform.parent        = rt.transform;
            p3.transform.localPosition = Vector3.forward * 2;
            p1.AddComponent <CurvePoint>();
            p2.AddComponent <CurvePoint>();
            p3.AddComponent <CurvePoint>();
            rt.points.Add(p1);
            rt.points.Add(p2);
            rt.points.Add(p3);
            rt.gameObject.AddComponent <TextureAnimator>();
            rt.gameObject.GetComponent <TextureAnimator>().Speed = new Vector2(0.1f, 0);
        }
        if (GUILayout.Button("Delete"))
        {
            DestroyImmediate(rt.gameObject);
            return;
        }
        GUILayout.EndHorizontal();
        if (GUILayout.Button("Add Point"))
        {
            GameObject pn = new GameObject("P" + (rt.points.Count + 1));
            int        c  = rt.points.Count;
            Vector3    p1 = rt.points[c - 1].transform.localPosition;
            Vector3    p2 = rt.points[c - 2].transform.localPosition;
            float      d  = Vector3.Distance(p1, p2);
            pn.transform.parent        = rt.transform;
            pn.transform.localPosition = Vector3.MoveTowards(p1, p2, -d);
            pn.AddComponent <CurvePoint>();
            rt.points.Add(pn);
            UnityEditor.Selection.activeGameObject = pn;
        }
//		if(GUILayout.Button("Add Point"))
//		{
//			GameObject pn = new GameObject("P" + (rt.points.Count+1));
//			pn.transform.parent = rt.transform;
//			float d = Vector3.Distance(rt.points[rt.points.Count - 2].transform.localPosition, rt.points[rt.points.Count - 1].transform.localPosition);
//			pn.transform.localPosition = Vector3.MoveTowards(rt.points[rt.points.Count - 1].transform.localPosition, rt.points[rt.points.Count - 2].transform.localPosition, -d);
//			pn.AddComponent<CurvePoint>();
//			rt.points.Add(pn);
//			UnityEditor.Selection.activeGameObject = pn;
//
//		}
        if (GUILayout.Button("Create Prefab"))
        {
            string filePath = UnityEditor.EditorUtility.SaveFilePanelInProject("Save Mesh Asset", rt.gameObject.name, "", "");
            if (filePath == "")
            {
                return;
            }
            UnityEditor.AssetDatabase.CreateAsset(rt.mat, filePath + ".mat");
            UnityEditor.AssetDatabase.CreateAsset(rt.mesh, filePath + ".asset");
            GameObject go = GameObject.CreatePrimitive(PrimitiveType.Plane);
            go.transform.position   = rt.gameObject.transform.position;
            go.transform.rotation   = rt.gameObject.transform.rotation;
            go.transform.localScale = rt.gameObject.transform.localScale;
            go.name = rt.gameObject.name;
            go.GetComponent <MeshFilter>().sharedMesh                   = rt.mesh;
            go.GetComponent <MeshRenderer>().sharedMaterial             = rt.mat;
            go.GetComponent <MeshRenderer>().sharedMaterial.mainTexture = rt.mat.mainTexture;
            go.AddComponent <TextureAnimator>();
            go.GetComponent <TextureAnimator>().Speed = rt.gameObject.GetComponent <TextureAnimator>().Speed;
            DestroyImmediate(go.GetComponent <MeshCollider>());
            UnityEditor.PrefabUtility.CreatePrefab(filePath + ".prefab", go);
            UnityEditor.AssetDatabase.Refresh();
            return;
        }
        DrawDefaultInspector();
    }
    private void OnSceneGUI()
    {
        HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));

        RiverTool tool = (RiverTool)target;

        ///Skiping first vertice, origin moves whole transform
        for (int i = 1; i < tool.vertices.Count; i++)
        {
            float distFromCam = 1;
            if (Camera.current != null)
            {
                distFromCam = Vector3.Distance(Camera.current.transform.position, tool.transform.TransformPoint(tool.vertices[i]));
                if (distFromCam > handleMaxDistance)
                {
                    distFromCam = 0;
                }
            }
            Vector3 newPos = tool.transform.InverseTransformPoint(Handles.FreeMoveHandle(tool.transform.TransformPoint(tool.vertices[i]), Quaternion.identity, distFromCam / handleSize, Vector3.one, Handles.CircleHandleCap));
            if (newPos.y != tool.vertices[i].y)
            {
                tool.vertices[i] = new Vector3(newPos.x, tool.vertices[i].y, newPos.z);
            }
            else
            {
                tool.vertices[i] = newPos;
            }
        }

        if (hideShowNodeTools)
        {
            if (tool.nodes.Count > 0)
            {
                Handles.color = Color.white;
                for (int i = 0; i < tool.nodes.Count; i++)
                {
                    float distFromCam = 1;
                    if (Camera.current != null)
                    {
                        distFromCam = Vector3.Distance(Camera.current.transform.position, tool.transform.TransformPoint(tool.nodes[i].centerVector));
                        if (distFromCam > handleMaxDistance)
                        {
                            distFromCam = 0;
                            continue;
                        }
                    }

                    tool.nodes[i].centerVectorOffset   = Handles.FreeMoveHandle(tool.transform.TransformPoint(tool.nodes[i].centerVector) + tool.nodes[i].centerVectorOffset, Quaternion.identity, distFromCam / handleSize, Vector3.one, Handles.RectangleHandleCap) - tool.transform.TransformPoint(tool.nodes[i].centerVector);
                    tool.nodes[i].centerVectorOffset.y = 0;
                    if (tool.nodes[i].centerVectorOffset.x > maxNodeCenterOffset)
                    {
                        tool.nodes[i].centerVectorOffset.x = maxNodeCenterOffset;
                    }
                    else if (tool.nodes[i].centerVectorOffset.x < -maxNodeCenterOffset)
                    {
                        tool.nodes[i].centerVectorOffset.x = -maxNodeCenterOffset;
                    }

                    if (tool.nodes[i].centerVectorOffset.z > maxNodeCenterOffset)
                    {
                        tool.nodes[i].centerVectorOffset.z = maxNodeCenterOffset;
                    }
                    else if (tool.nodes[i].centerVectorOffset.z < -maxNodeCenterOffset)
                    {
                        tool.nodes[i].centerVectorOffset.z = -maxNodeCenterOffset;
                    }

                    //tool.nodes[i].flowDirectionOffset_Angle = Handles.RadiusHandle(Quaternion.identity, tool.nodes[i].centerVector + tool.transform.position + tool.nodes[i].centerVectorOffset + Vector3.up, tool.nodes[i].flowDirectionOffset_Angle);
                    tool.nodes[i].flowDirectionOffset = Handles.RotationHandle(Quaternion.Euler(tool.nodes[i].flowDirectionOffset), tool.nodes[i].centerVector + tool.transform.position + tool.nodes[i].centerVectorOffset).eulerAngles;

                    Handles.ArrowHandleCap(0, tool.nodes[i].centerVector + tool.transform.position + tool.nodes[i].centerVectorOffset, Quaternion.Euler(tool.nodes[i].flowDirection + tool.nodes[i].flowDirectionOffset), (distFromCam / handleSize) * 10, EventType.Repaint);

                    float slopeAngle = 1;
                    if (i + 1 < tool.nodes.Count)
                    {
                        slopeAngle = tool.nodes[i].centerVector.y - tool.nodes[i + 1].centerVector.y;
                    }
                    if (slopeAngle == 0)
                    {
                        slopeAngle = 1;
                    }

                    Handles.Label(tool.nodes[i].centerVector, "Node: " + i.ToString() + "\n" + "Flow Direction:\n" + (tool.nodes[i].finalFlowDirection * slopeAngle).ToString());
                }

                Handles.color = Color.red;
                for (int i = 0; i < tool.nodes.Count; i++)
                {
                    if (i + 1 < tool.nodes.Count)
                    {
                        Vector3 pOne = tool.nodes[i].centerVector + tool.nodes[i].centerVectorOffset + tool.transform.position;
                        Vector3 pTwo = tool.nodes[i + 1].centerVector + tool.nodes[i + 1].centerVectorOffset + tool.transform.position;
                        Handles.DrawLine(pOne + tool.nodes[i].flowDirection, pTwo + tool.nodes[i + 1].flowDirection);
                    }
                }
            }
        }
    }