private static void ExecuteIndex(TextureConverterPreset currentPreset, int i, Vector2 pos)
    {
        if (!currentPreset.useColor [i])
        {
            return;
        }

        ParameterInfo[] mParameters = currentPreset.conversionMethods [currentPreset.chosenMethods [i]].GetParameters();
        int             iOffset     = 0;

        object[] parameters = new object[mParameters.Length];
        for (int iParams = 0; iParams < mParameters.Length; iParams++)
        {
            if (mParameters [iParams].ParameterType == typeof(UnityEngine.Vector2))
            {
                if ((TextureConverterEditorWindow.PositionOrValue)currentPreset.chosenMethodsParameters [i] [iParams + iOffset] == TextureConverterEditorWindow.PositionOrValue.UseValue)
                {
                    //	Debug.Log (parameters [i]);
                    parameters [iParams] = currentPreset.chosenMethodsParameters [i] [iParams + iOffset + 1];
                }
                else
                {
                    parameters [iParams] = pos;
                }
                iOffset++;
            }
            else
            {
                parameters [iParams] = currentPreset.chosenMethodsParameters [i] [iParams + iOffset];
            }
        }

        currentPreset.conversionMethods [currentPreset.chosenMethods [i]].Invoke(null, parameters);
    }
    private void DisplayPresetPicker()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label("Current preset", EditorStyles.boldLabel, GUILayout.Width(150));
        int index = EditorGUILayout.Popup(availablePresets.IndexOf(currentPreset.loadName), availablePresets.ToArray());

        if (index != availablePresets.IndexOf(currentPreset.loadName))
        {
            if (PresetFileLoader.SavePreset(currentPreset))
            {
                currentPreset = PresetFileLoader.LoadPreset(availablePresets [index]);
            }
        }
        if (GUILayout.Button("NEW", GUILayout.Width(38)))
        {
            CreateNewPreset();
        }
        GUILayout.EndHorizontal();
        EditorGUI.BeginChangeCheck();
        currentPreset.presetName = GUILayout.TextField(currentPreset.presetName);
        if (EditorGUI.EndChangeCheck() && currentPreset.presetName.Length > 0)
        {
            if (PresetFileLoader.SavePreset(currentPreset))
            {
                availablePresets = PresetFileLoader.LoadPresets();
            }
        }
    }
    private void CreateNewPreset()
    {
        TextureConverterPreset tempPreset = ScriptableObject.CreateInstance <TextureConverterPreset> ();

        //	Debug.Log (tempPreset.loadName);
        while (availablePresets.Contains(tempPreset.loadName))
        {
            tempPreset.loadName   += "I";
            tempPreset.presetName += "I";
        }
        PresetFileLoader.SavePreset(tempPreset);
        string newPreset = tempPreset.loadName;

        availablePresets = PresetFileLoader.LoadPresets();
        currentPreset    = PresetFileLoader.LoadPreset(newPreset);
    }
    public static void Execute(this TextureConverterPreset currentPreset, Texture2D texture)
    {
        List <Color> matchList = new List <Color> (currentPreset.textureColors);

        for (int x = 0; x < texture.width; x++)
        {
            for (int y = 0; y < texture.height; y++)
            {
                if (matchList.Contains(texture.GetPixel(x, y)))
                {
                    int index = matchList.IndexOf(texture.GetPixel(x, y));
                    ExecuteIndex(currentPreset, index, new Vector2(x, y));
                }
            }
        }
    }
    public static void LoadMethodParameters(this TextureConverterPreset currentPreset, int method)
    {
//		Debug.Log (currentPreset.conversionMethods);
//		Debug.Log (TextureConverterAttributeManager.conversionMethods.Count);
        ParameterInfo[] mParameters = currentPreset.conversionMethods [currentPreset.chosenMethods [method]].GetParameters();
        int             paramLength = mParameters.Length;

        foreach (var item in mParameters)
        {
            if (item.ParameterType == typeof(UnityEngine.Vector2))
            {
                paramLength++;
            }
        }
        currentPreset.chosenMethodsParameters [method] = new object[paramLength];
    }
            public static TextureConverterPreset LoadPreset(string name)
            {
//				Debug.Log ("loading \n" + name);

                string presetPath = Path + "/" + name + FileExtension;

                if (!File.Exists(presetPath))
                {
                    throw new System.ArgumentException("There is no preset in the designated folder for " + name);
                }

                Stream          stream    = File.Open(Path + "/" + name + FileExtension, FileMode.Open);
                BinaryFormatter formatter = new BinaryFormatter();
                SerializableTextureConverterPreset preset = (SerializableTextureConverterPreset)formatter.Deserialize(stream);

                stream.Close();
                formatter = null;

                for (int im = 0; im < preset.chosenMethodsParameters.Count; im++)
                {
                    for (int i = 0; i < preset.chosenMethodsParameters [im].Length; i++)
                    {
                        if (preset.chosenMethodsParameters [im] [i] is string)
                        {
                            if (((string)preset.chosenMethodsParameters [im] [i]).StartsWith("#obj#"))
                            {
                                preset.chosenMethodsParameters [im] [i] = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(((string)preset.chosenMethodsParameters [im] [i]).Substring(5, ((string)preset.chosenMethodsParameters [im] [i]).Length - 5)), typeof(UnityEngine.Object));
                            }
                        }
                    }
                }


                List <MethodInfo> conversionMethods = TextureConverterAttributeManager.conversionMethods;

                TextureConverterPreset convertedPreset = (TextureConverterPreset)preset;

                if (!AreEqual(conversionMethods, convertedPreset.conversionMethods))
                {
                    convertedPreset.RedefineConversionMethodsInPreset(conversionMethods);
                }

//				Debug.Log ("done loading");

                return(convertedPreset);
            }
    private void OnEnable()
    {
//		Debug.Log ("OnEnableCalled");
        availablePresets = PresetFileLoader.LoadPresets();
        if (availablePresets.Count == 0)
        {
//			Debug.Log ("creating");
            TextureConverterPreset tempPreset = ScriptableObject.CreateInstance <TextureConverterPreset> ();
            Debug.Log(tempPreset.loadName);
            if (PresetFileLoader.SavePreset(tempPreset))
            {
                availablePresets = PresetFileLoader.LoadPresets();
            }
        }
        currentPreset = PresetFileLoader.LoadPreset(availablePresets [0]);
//		Debug.Log (availablePresets [0]);

//		Undo.undoRedoPerformed += OnUndoRedo;
    }
            public static bool SavePreset(TextureConverterPreset preset)
            {
//				Debug.Log ("saving");

                string oldPresetPath = Path + "/" + preset.loadName + FileExtension;

                if (File.Exists(oldPresetPath))
                {
                    File.Delete(oldPresetPath);
                }

                List <string> existingPresets = LoadPresets();

                preset.loadName = preset.presetName;
                while (existingPresets.Contains(preset.loadName) || preset.loadName == "")
                {
                    preset.loadName   += "I";
                    preset.presetName += "I";
                }

                for (int im = 0; im < preset.chosenMethodsParameters.Count; im++)
                {
                    for (int i = 0; i < preset.chosenMethodsParameters [im].Length; i++)
                    {
                        if (preset.chosenMethodsParameters [im] [i] is UnityEngine.Object)
                        {
                            preset.chosenMethodsParameters [im] [i] = "#obj#" + AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath((UnityEngine.Object)preset.chosenMethodsParameters [im] [i]));
                        }
                    }
                }

                Stream          stream    = File.Open(Path + "/" + preset.presetName + FileExtension, FileMode.Create);
                BinaryFormatter formatter = new BinaryFormatter();

                formatter.Serialize(stream, (SerializableTextureConverterPreset)preset);
                stream.Close();
                formatter = null;

//				Debug.Log ("done saving");

                return(true);
            }
    public static void RedefineConversionMethodsInPreset(this TextureConverterPreset currentPreset, List <MethodInfo> conversionMethods)
    {
        Debug.Log("Conversion Method definitions changed, redefine called on preset " + currentPreset.presetName);

        //		Debug.Log (currentPreset.conversionMethods.Count);
        if (currentPreset.conversionMethods == null || currentPreset.chosenMethods == null)
        {
//			Debug.Log ("immediate conversion because null");
            currentPreset.conversionMethods = conversionMethods;
            return;
        }
        for (int iMethod = 0; iMethod < currentPreset.conversionMethods.Count; iMethod++)
        {
            if (!conversionMethods.Contains(currentPreset.conversionMethods [iMethod]))
            {
                Debug.LogWarning("Method " + currentPreset.conversionMethods [iMethod] + " does not exist anymore and has been removed from this preset");
                for (int i = 0; i < currentPreset.chosenMethods.Count; i++)
                {
                    if (currentPreset.chosenMethods [i] == iMethod)
                    {
                        currentPreset.chosenMethods [i] = -1;
                    }
                }
            }
        }
        for (int i = 0; i < currentPreset.chosenMethods.Count; i++)
        {
            if (currentPreset.chosenMethods [i] == -1)
            {
                currentPreset.chosenMethods [i] = 0;
                LoadMethodParameters(currentPreset, i);
            }
            else
            {
                currentPreset.chosenMethods [i] = conversionMethods.IndexOf(currentPreset.conversionMethods [currentPreset.chosenMethods [i]]);
            }
        }
        currentPreset.conversionMethods = conversionMethods;
    }