Base class for color manipulating parameters
Inheritance: MBParameter
 public void CreateColorGradient(Texture2D tex, MBParticleColorBase p)
 {
     Color col;
     for (int x = 0; x < tex.width; x++) {
         col = p.GetGradientColor(x / (float)tex.width,false);
         for (int y=0;y<tex.height;y++)
             tex.SetPixel(x,y,col);
     }
     tex.Apply();
 }
    public void DoGradientGUI(MBParticleColorBase P)
    {
        bool lmbd = Event.current.type == EventType.MouseDown && Event.current.button == 0;
        bool lmbu = Event.current.type == EventType.MouseUp && Event.current.button == 0;
        bool drg = Event.current.type==EventType.MouseDrag;
        bool dbl = lmbd && Event.current.clickCount > 1;
        bool rmb = Event.current.type == EventType.MouseDown && Event.current.button == 1;

        Vector2 mp= Event.current.mousePosition;

        EditorGUILayout.BeginHorizontal();
        GUILayout.Box("", new GUILayoutOption[] { GUILayout.MinHeight(24), GUILayout.ExpandWidth(true) });

        Rect r = GUILayoutUtility.GetLastRect();
        r = new Rect(r.x + 2, r.y + 2, r.width - 4, r.height - 4);
        if (!mGradient && Event.current.type == EventType.Repaint){
            mGradient=new Texture2D((int)r.width,(int)r.height, TextureFormat.RGB24, false);
            CreateColorGradient(mGradient, P);
        }

        if (mGradient) {
            EditorGUI.DrawPreviewTexture(r, mGradient);

            for (int k = 0; k < P.Colors.Count; k++) {
                Rect HandleRect = new Rect(r.x + P.Colors[k].t * r.width, r.y, 40, r.height);

                // Delete Key?
                if (rmb && HandleRect.Contains(mp) && P.Colors.Count>2 && k>0 && k<P.Colors.Count-1) {
                    P.Colors.Remove(P.Colors[k]);
                    CreateColorGradient(mGradient, P);
                    Event.current.Use();
                }

                // Begin Drag?
                if (drg && !mDragging && k>0 && k<P.Colors.Count-1 && HandleRect.Contains(mp)) {
                    mDragging = true;
                    mDragKey = P.Colors[k];
                    mDragOffset = mp.x - HandleRect.x;
                    Event.current.Use();
                }

                // Drag?
                if (Event.current.type==EventType.Repaint && mDragging && mDragKey==P.Colors[k]) {
                     mDragKey.t = (mp.x - r.x-mDragOffset) / r.width;
                     HandleRect = new Rect(r.x + mDragKey.t * r.width, r.y, 40, r.height);
                     NeedRepaint = true;
                }

                // Eat Down-Event to allow drag without opening Color Dialog
                if (lmbd && HandleRect.Contains(mp))
                    Event.current.Use();

                // End Drag or turn Up-Event into Down to trigger Color Dialog
                if (lmbu) {
                    if (mDragging && mDragKey==P.Colors[k]) {
                        mDragging = false;
                        mDragKey = null;
                        CreateColorGradient(mGradient, P);
                        Event.current.Use();
                    }
                    else if (HandleRect.Contains(mp)) {
                        Event.current.type = EventType.MouseDown;
                    }
                }

                Color c = P.Colors[k].Color;
                P.Colors[k].Color = EditorGUI.ColorField(HandleRect, P.Colors[k].Color);
                if (c != P.Colors[k].Color)
                    CreateColorGradient(mGradient, P);

            }
            // New Key?
            if (dbl && r.Contains(mp)) {
                P.AddColorKey((mp.x-r.x)/r.width,mGradient.GetPixel((int)(mp.x-r.x), 4));
                CreateColorGradient(mGradient,P);
                NeedRepaint = true;
                Event.current.Use();
            }

        }

        GUILayout.Box("", GUIStyle.none, new GUILayoutOption[] { GUILayout.MinWidth(40), GUILayout.ExpandWidth(false) });
        EditorGUILayout.EndHorizontal();
    }