public void OnSceneGUI()
    {
        MegaWire mod = (MegaWire)target;

        if (mod.displayGizmo)
        {
            Handles.color = mod.gizmoColor;

            for (int i = 0; i < mod.spans.Count; i++)
            {
                MegaWireSpan span = mod.spans[i];

                for (int c = 0; c < span.connections.Count; c++)
                {
                    MegaWireConnection con = span.connections[c];

                    Vector3 p = con.masspos[1];
                    MegaWireHandles.DotCap(0, p, Quaternion.identity, con.radius);

                    for (int m = 2; m < con.masspos.Length - 1; m++)
                    {
                        p = con.masspos[m];
                        MegaWireHandles.DotCap(0, con.masspos[m], Quaternion.identity, con.radius);
                    }

                    // Draw springs
                    int scount = con.springs.Count;
                    if (mod.stiffnessSprings)
                    {
                        scount = con.masses.Count - 1;
                    }

                    for (int s = 0; s < scount; s++)
                    {
                        Vector3 p1 = con.masses[con.springs[s].p1].pos;
                        Vector3 p2 = con.masses[con.springs[s].p2].pos;

                        float w = ((con.springs[s].len - con.springs[s].restlen) / con.springs[s].restlen) * con.springs[s].ks;                         //con.springs[s].restlen;

                        if (w >= 0.0f)
                        {
                            Handles.color = Color.Lerp(Color.green, Color.red, w);
                        }
                        else
                        {
                            Handles.color = Color.Lerp(Color.green, Color.blue, -w);
                        }

                        Handles.DrawLine(p1, p2);
                    }
                }
            }

            if (mod.disableOnDistance)
            {
                Handles.color = mod.gizmoColor;
                for (int s = 0; s < mod.spans.Count; s++)
                {
                    Vector3 mp = (mod.spans[s].connections[0].masses[0].pos + mod.spans[s].connections[0].masses[mod.spans[s].connections[0].masses.Count - 1].pos) * 0.5f;
                    MegaWireHandles.SphereCap(0, mp, Quaternion.identity, mod.disableDist * 2.0f);
                }
            }
        }
    }
    public void OnSceneGUI()
    {
        MegaWireWind mod = (MegaWireWind)target;

        Matrix4x4 tm = mod.transform.localToWorldMatrix;

        if (mod.displayGizmo)
        {
            if (mod.divs < 1)
            {
                mod.divs = 1;
            }

            Handles.matrix = tm;

            Vector3 p = Vector3.zero;

            Vector3 frc = mod.Force(tm.MultiplyPoint(p)) * mod.gizscale;

            Handles.color = mod.gizmocol;
            Handles.DrawLine(p, p + frc);

            int xdivs = 0;
            int ydivs = 0;

            if (mod.gizmoSize.x > mod.gizmoSize.y)
            {
                xdivs = mod.divs;
                ydivs = (int)((float)mod.divs / (mod.gizmoSize.x / mod.gizmoSize.y));
            }
            else
            {
                ydivs = mod.divs;
                xdivs = (int)((float)mod.divs / (mod.gizmoSize.y / mod.gizmoSize.x));
            }

            for (int y = 0; y < 1; y++)
            {
                p.y = mod.gizmopos.y;
                for (int x = 0; x <= xdivs; x++)
                {
                    p.x = (-mod.gizmoSize.x * 0.5f) + (((float)x / (float)xdivs) * mod.gizmoSize.x) + mod.gizmopos.x;
                    for (int z = 0; z <= ydivs; z++)
                    {
                        p.z = (-mod.gizmoSize.y * 0.5f) + (((float)z / (float)ydivs) * mod.gizmoSize.y) + mod.gizmopos.z;

                        frc = mod.Force(tm.MultiplyPoint(p));

                        frc *= mod.gizscale;

                        MegaWireHandles.DotCap(0, p, Quaternion.identity, (mod.gizmoSize.x + mod.gizmoSize.y) * 0.5f * 0.002f);
                        Handles.DrawLine(p, p + frc);
                    }
                }
            }

            Vector3 gpos = mod.gizmopos;
            gpos.x += mod.gizmoSize.x * 0.5f;
            gpos.z += mod.gizmoSize.y * 0.5f;
            gpos    = Handles.PositionHandle(gpos, Quaternion.identity);

            gpos.x      -= mod.gizmoSize.x * 0.5f;
            gpos.z      -= mod.gizmoSize.y * 0.5f;
            mod.gizmopos = gpos;
            //mod.gizmopos = Vector3.zero;
        }
    }
    void OnSceneGUI()
    {
        MegaWirePlantPolesList mod = (MegaWirePlantPolesList)target;

        arrow.arrowlength = mod.arrowlength;
        arrow.arrowoff    = mod.arrowoff;
        arrow.arrowwidth  = mod.arrowwidth;
        arrow.vertStart   = mod.vertStart;
        arrow.vertLength  = mod.vertLength;
        arrow.lineCol     = mod.lineCol;
        arrow.otherCol    = mod.otherCol;
        arrow.arrowcol    = mod.arrowCol;
        arrow.dashCol     = mod.dashCol;
        arrow.units       = MegaArrow.GetUnitsString(mod.units);
        arrow.unitsscale  = MegaArrow.GetUnitsScale(mod.units, mod.unitsScale);
        arrow.dashdist    = mod.dashdist;

        if (mod.showgizmo && (mod.gizmoType == MegaWireGizmoType.Waypoint || mod.gizmoType == MegaWireGizmoType.Both))
        {
            switch (Event.current.type)
            {
            case EventType.KeyDown:
                if (Event.current.keyCode == KeyCode.A)
                {
                    if (!addmode)
                    {
                        Debug.Log("Start Add Mode");
                        addmode = true;
                        Event.current.Use();
                    }
                }
                break;

            case EventType.KeyUp:
                if (Event.current.keyCode == KeyCode.A)
                {
                    if (addmode)
                    {
                        Debug.Log("End Add mode");
                        addmode     = false;
                        addingpoint = false;
                        Event.current.Use();
                    }
                }
                break;
            }

            if (mod.showgizmo && (mod.gizmoType == MegaWireGizmoType.Waypoint || mod.gizmoType == MegaWireGizmoType.Both))
            {
                Camera cam = UnityEditor.SceneView.currentDrawingSceneView.camera;

                if (cam)
                {
                    Vector3 camwp = Event.current.mousePosition;

                    camwp.z = 0.0f;

                    float dist = 100000.0f;

                    seg = -1;

                    // Just do distance from mid point, and use closest
                    for (int i = 0; i < mod.waypoints.Count - 1; i++)
                    {
                        Vector3 p  = mod.waypoints[i];
                        Vector3 p1 = mod.waypoints[i + 1];

                        Vector3 wp  = mod.transform.TransformPoint(p);
                        Vector3 wp1 = mod.transform.TransformPoint(p1);

                        Vector3 sp  = cam.WorldToScreenPoint(wp);
                        Vector3 sp1 = cam.WorldToScreenPoint(wp1);

                        sp.z  = 0.0f;
                        sp1.z = 0.0f;

                        Vector3 cp2 = (sp + sp1) * 0.5f;

                        float d = Vector3.Distance(camwp, cp2);
                        if (d < dist)
                        {
                            dist = d;
                            seg  = i;
                        }
                    }

                    if (seg >= 0)
                    {
                        Vector3 pos = Vector3.Lerp(mod.waypoints[seg], mod.waypoints[seg + 1], 0.5f);

                        Handles.color = Color.green;
                        MegaWireHandles.DotCap(1066, mod.transform.TransformPoint(pos), Quaternion.identity, 0.2f);
                    }
                }
            }

            if (addmode)
            {
                int controlID = GUIUtility.GetControlID(FocusType.Passive);

                Camera cam = UnityEditor.SceneView.currentDrawingSceneView.camera;

                if (cam)
                {
                    switch (Event.current.GetTypeForControl(controlID))
                    {
                    case EventType.MouseDown:
                        GUIUtility.hotControl = controlID;
                        Event.current.Use();

                        if (!addingpoint)
                        {
                            addingpoint = true;

                            if (seg >= 0)
                            {
                                Vector3 cp = (mod.waypoints[seg] + mod.waypoints[seg + 1]) * 0.5f;
                                mod.waypoints.Insert(seg + 1, cp);
                            }
                        }

                        break;

                    case EventType.MouseUp:
                        addingpoint           = false;
                        GUIUtility.hotControl = 0;
                        Event.current.Use();
                        break;
                    }
                }
            }
        }

        // Draw the fancier lines
        // Show waypoints and or pole spacing
        // option to control units
        //string units = MegaArrow.GetUnitsString(mod.units);
        //float unitsscale = MegaArrow.GetUnitsScale(mod.units, mod.unitsScale);

        GUIStyle style = new GUIStyle();

        style.normal.textColor = mod.lineCol;

        if (mod.waypoints.Count > 1 && mod.showgizmo)
        {
            float arrowoff = mod.vertStart + (mod.vertLength * mod.arrowoff);
            arrow.arrowoff = arrowoff;

            if (mod.gizmoType == MegaWireGizmoType.Waypoint || mod.gizmoType == MegaWireGizmoType.Both)
            {
                for (int i = 0; i < mod.waypoints.Count; i++)
                {
                    Vector3 lp = mod.transform.TransformPoint(mod.waypoints[i]);
                    lp = SceneView.currentDrawingSceneView.camera.WorldToScreenPoint(lp);

                    Handles.color = mod.lineCol;
                    if (lp.z > 0.0f)
                    {
                        Handles.Label(mod.transform.TransformPoint(mod.waypoints[i]), "" + i, style);
                    }

                    if (i > 0)
                    {
                        Vector3 p1 = mod.transform.TransformPoint(mod.waypoints[i - 1]);
                        Vector3 p2 = mod.transform.TransformPoint(mod.waypoints[i]);
                        arrow.DrawArrow(i, p1, p2, style);
                    }

                    Vector3 p = mod.transform.worldToLocalMatrix.MultiplyPoint(Handles.PositionHandle(mod.transform.localToWorldMatrix.MultiplyPoint(mod.waypoints[i]), Quaternion.identity));
                    if (p != mod.waypoints[i])
                    {
                        mod.waypoints[i] = p;
                        mod.Rebuild();
                    }
                }

                if (mod.closed)
                {
                    Handles.DrawLine(mod.waypoints[mod.waypoints.Count - 1], mod.waypoints[0]);
                }
            }
            // Poles

            if (mod.gizmoType == MegaWireGizmoType.Pole || mod.gizmoType == MegaWireGizmoType.Both)
            {
                Handles.matrix = Matrix4x4.identity;

                for (int i = 0; i < mod.poles.Count; i++)
                {
                    Vector3 lp = mod.transform.TransformPoint(mod.poles[i].transform.position);
                    lp = SceneView.currentDrawingSceneView.camera.WorldToScreenPoint(lp);

                    if (i > 0)
                    {
                        Vector3 p1 = mod.poles[i - 1].transform.position;
                        Vector3 p2 = mod.poles[i].transform.position;
                        arrow.DrawArrow(i, p1, p2, style);
                    }
                }
            }
        }
    }