public void RemovePreset(int presetIndex)
    {
        int currentPresetIndex = PresetIndex(currentPresetName);

        for (int i = presetIndex; i < matPresets.Length - 1; i++)
        {
            matPresets[i] = matPresets[i + 1];
            names[i]      = names[i + 1];
        }
        if (currentPresetIndex != -1)
        {
            if (currentPresetIndex == matPresets.Length - 1)
            {
                currentPresetIndex = matPresets.Length - 2;
            }
            if (currentPresetIndex != -1)
            {
                currentPresetName = names[currentPresetIndex];
            }
            else
            {
                currentPresetName = "";
            }
        }
        UBER_MaterialPreset[] newMatPresets = new UBER_MaterialPreset[matPresets.Length - 1];
        string[] newNames = new string[matPresets.Length - 1];
        for (int i = 0; i < newNames.Length; i++)
        {
            newNames[i]      = names[i];
            newMatPresets[i] = matPresets[i];
        }
        names      = newNames;
        matPresets = newMatPresets;
    }
    public void AddPreset(Material mat, string name)
    {
        int presetIndex = PresetIndex(name);

        if (presetIndex == -1)
        {
            // new preset
            int newCount;
            if (matPresets != null)
            {
                newCount = matPresets.Length + 1;
            }
            else
            {
                newCount = 1;
            }
            UBER_MaterialPreset[] newMatPresets = new UBER_MaterialPreset[newCount];
            for (int i = 0; i < newCount - 1; i++)
            {
                newMatPresets [i] = matPresets [i];
            }
            newMatPresets[newCount - 1]      = new UBER_MaterialPreset();
            newMatPresets[newCount - 1].name = name;
            newMatPresets[newCount - 1].SetProps(mat);
            // sort by name
            for (int i = 0; i < newMatPresets.Length; i++)
            {
                bool changed = false;
                for (int j = i + 1; j < newMatPresets.Length; j++)
                {
                    if (string.CompareOrdinal(newMatPresets[i].name, newMatPresets[j].name) > 0)
                    {
                        changed = true;
                        UBER_MaterialPreset tmp_mat = newMatPresets[i];
                        newMatPresets[i] = newMatPresets[j];
                        newMatPresets[j] = tmp_mat;
                    }
                }
                if (!changed)
                {
                    // already sorted
                    break;
                }
            }
            matPresets = newMatPresets;
        }
        else
        {
            // replace existing preset
            matPresets[presetIndex].SetProps(mat);
        }
        names = new string[matPresets.Length];
        for (int i = 0; i < names.Length; i++)
        {
            names[i] = matPresets[i].name;
        }
    }