public static void Initialize (PlaygroundC targetRef) {
		playgroundScriptReference = targetRef;
		PlaygroundC.reference = targetRef;
		if (playgroundScriptReference==null) return;
		playground = new SerializedObject(playgroundScriptReference);
		particleSystems = playground.FindProperty("particleSystems");
		manipulators = playground.FindProperty("manipulators");
		calculate = playground.FindProperty("calculate");
		pixelFilterMode = playground.FindProperty("pixelFilterMode");
		autoGroup = playground.FindProperty("autoGroup");
		buildZeroAlphaPixels = playground.FindProperty("buildZeroAlphaPixels");
		drawGizmos = playground.FindProperty("drawGizmos");
		drawSourcePositions = playground.FindProperty("drawSourcePositions");
		drawWireframe = playground.FindProperty("drawWireframe");
		drawSplinePreview = playground.FindProperty("drawSplinePreview");
		paintToolbox = playground.FindProperty("paintToolbox");
		showShuriken = playground.FindProperty("showShuriken");
		showSnapshots = playground.FindProperty("showSnapshotsInHierarchy");
		threads = playground.FindProperty("threadMethod");
		threadsTurbulence = playground.FindProperty("turbulenceThreadMethod");
		threadsSkinned = playground.FindProperty("skinnedMeshThreadMethod");
		maxThreads = playground.FindProperty("maxThreads");
		
		playgroundSettings = PlaygroundSettingsC.GetReference();
		playgroundLanguage = PlaygroundSettingsC.GetLanguage();
	}
	void OnEnable () {
		spline = target as PlaygroundSpline;
		
		playgroundSettings = PlaygroundSettingsC.GetReference();
		playgroundLanguage = PlaygroundSettingsC.GetLanguage();
		
		lastActiveTool = UnityEditor.Tools.current;
		
		UpdateUserList();
	}
	void OnEnable () {
		playgroundLanguage = PlaygroundSettingsC.GetLanguage();

		brushPreset = new SerializedObject(target);
		texture = brushPreset.FindProperty("texture");
		presetName = brushPreset.FindProperty("presetName");
		scale = brushPreset.FindProperty("scale");
		detail = brushPreset.FindProperty("detail");
		distance = brushPreset.FindProperty("distance");
		spacing = brushPreset.FindProperty("spacing");
		exceedMaxStopsPaint = brushPreset.FindProperty("exceedMaxStopsPaint");
	}
	public void OnEnable () 
	{
		follow = target as PlaygroundFollow;
		s_follow = new SerializedObject(follow);

		s_particles = s_follow.FindProperty("particles");
		s_referenceObject = s_follow.FindProperty("referenceObject");
		s_followerLifetime = s_follow.FindProperty("followerLifetime");
		s_cacheSize = s_follow.FindProperty("cacheSize");
		s_sendEvents = s_follow.FindProperty("sendEvents");

		playgroundSettings = PlaygroundSettingsC.GetReference();
		playgroundLanguage = PlaygroundSettingsC.GetLanguage();
	}
	void OnEnable () 
	{
		// Set references
		recorder = target as PlaygroundRecorder;

		// Load settings
		playgroundSettings = PlaygroundSettingsC.GetReference();
		
		// Load language
		playgroundLanguage = PlaygroundSettingsC.GetLanguage();

		// Load data
		if (recorder.recorderData != null)
			recorder.LoadAsync();
		else
			recorder.recordedFrames = new List<RecordedFrame>();
	}
	void OnGUI () {
		EditorGUILayout.BeginVertical();
		scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, false);
		EditorGUILayout.Separator();
		EditorGUILayout.LabelField(PlaygroundParticleWindowC.playgroundLanguage.languageInstallWizard, EditorStyles.largeLabel, GUILayout.Height(20));
		EditorGUILayout.Separator();
		
		EditorGUILayout.HelpBox(PlaygroundParticleWindowC.playgroundLanguage.installText, MessageType.Info);
		EditorGUILayout.Separator();

		installType = (LanguageInstallType)EditorGUILayout.EnumPopup(PlaygroundParticleWindowC.playgroundLanguage.installType, installType);
		if (installType==LanguageInstallType.Asset) {
			languageFile = (PlaygroundLanguageC)EditorGUILayout.ObjectField(PlaygroundParticleWindowC.playgroundLanguage.languageFile, languageFile, typeof(PlaygroundLanguageC), false);
		} else {
			EditorGUILayout.BeginHorizontal();
			languageLocation = EditorGUILayout.TextField(PlaygroundParticleWindowC.playgroundLanguage.languageLocation, languageLocation);
			if (GUILayout.Button (PlaygroundParticleWindowC.playgroundLanguage.browse, EditorStyles.toolbarButton, GUILayout.ExpandWidth (false))) {
				string newLanguageLocation = EditorUtility.OpenFilePanel (PlaygroundParticleWindowC.playgroundLanguage.languageLocation, "", "xml");
				if (newLanguageLocation.Length!=0) {
					languageLocation = newLanguageLocation;
				}
			}
			EditorGUILayout.EndHorizontal();
		}
		
		EditorGUILayout.Separator();
		
		GUI.enabled = (installType==LanguageInstallType.Asset && languageFile!=null || installType==LanguageInstallType.Xml && languageLocation.Length>0 && languageLocation.ToLower().Contains (".xml"));
		if (GUILayout.Button (PlaygroundParticleWindowC.playgroundLanguage.install, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false))) {
			if (installType==LanguageInstallType.Asset) {
				if (!PlaygroundParticleWindowC.playgroundSettings.languages.Contains (languageFile)) {
					AssetDatabase.MoveAsset( AssetDatabase.GetAssetPath ((Object)languageFile), "Assets/"+PlaygroundParticleWindowC.playgroundSettings.playgroundPath+PlaygroundParticleWindowC.playgroundSettings.languagePath+languageFile.name);
					PlaygroundParticleWindowC.playgroundSettings.languages.Add (languageFile);
					EditorUtility.SetDirty(PlaygroundParticleWindowC.playgroundSettings);
				}
			} else {
				PlaygroundSettingsC.ImportLanguage(languageLocation);
			}
			window.Close();
		}
		GUI.enabled = true;

		GUILayout.EndScrollView();
		EditorGUILayout.EndVertical();
	}
	public void OnEnable () 
	{
		trails = target as PlaygroundTrails;
		s_trails = new SerializedObject(trails);

		s_time = s_trails.FindProperty("time");

		s_material = s_trails.FindProperty("material");
		s_lifetimeColor = s_trails.FindProperty("lifetimeColor");
		s_colorMode = s_trails.FindProperty("colorMode");
		s_uvMode = s_trails.FindProperty("uvMode");
		s_pointArrayAlpha = s_trails.FindProperty("pointArrayAlpha");
		s_renderMode = s_trails.FindProperty("renderMode");
		s_billboardTransform = s_trails.FindProperty("billboardTransform");
		s_customRenderScale = s_trails.FindProperty("customRenderScale");

		s_timeWidth = s_trails.FindProperty("timeWidth");
		s_widthScale = s_trails.FindProperty("widthScale");

		s_minVertexDistance = s_trails.FindProperty("minVertexDistance");
		s_maxVertexDistance = s_trails.FindProperty("maxVertexDistance");
		s_maxPathDeviation = s_trails.FindProperty("maxPathDeviation");
		s_createPointsOnCollision = s_trails.FindProperty("createPointsOnCollision");
		s_maxPoints = s_trails.FindProperty("maxPoints");
		s_createFirstPointOnParticleBirth = s_trails.FindProperty("createFirstPointOnParticleBirth");
		s_createLastPointOnParticleDeath = s_trails.FindProperty("createLastPointOnParticleDeath");

		s_playgroundSystem = s_trails.FindProperty("playgroundSystem");
		s_multithreading = s_trails.FindProperty("multithreading");

		s_receiveShadows = s_trails.FindProperty("receiveShadows");
#if UNITY_4_3 || UNITY_4_5 || UNITY_4_6
		s_castShadows = s_trails.FindProperty("castShadows");
#else
		s_castShadows = s_trails.FindProperty("shadowCastingMode");
#endif
		playgroundSettings = PlaygroundSettingsC.GetReference();
		playgroundLanguage = PlaygroundSettingsC.GetLanguage();

		// Issue a quick refresh
		if (!EditorApplication.isPlaying && Selection.activeTransform!=null)
		{
			trails.ResetTrails();
		}
	}
    void OnGUI()
    {
        if ( boxStyle == null )
            boxStyle = GUI.skin.FindStyle("box");
        if ( toolbarSearchSkin == null ) {
            toolbarSearchSkin = GUI.skin.FindStyle("ToolbarSeachTextField");
            if ( toolbarSearchButtonSkin == null )
                toolbarSearchButtonSkin = GUI.skin.FindStyle("ToolbarSeachCancelButton");
        }
        EditorGUILayout.BeginVertical();
        scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, false);
        EditorGUILayout.BeginVertical(boxStyle);
        EditorGUILayout.Separator();
        EditorGUILayout.LabelField(playgroundLanguage.playgroundName + " " + PlaygroundC.version + PlaygroundC.specialVersion, EditorStyles.largeLabel, GUILayout.Height(20));
        EditorGUILayout.Separator();

        // New version message
        if ( playgroundSettings.checkForUpdates && !didSendVersionCheck )
            CheckUpdate();
        if ( playgroundSettings.checkForUpdates && updateAvailable ) {
            EditorGUILayout.BeginVertical(boxStyle);
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField(playgroundLanguage.updateAvailable);
            GUILayout.FlexibleSpace();
            if ( GUILayout.Button("x", EditorStyles.miniButton, new GUILayoutOption[] { GUILayout.Width(18), GUILayout.Height(18) }) ) {
                updateAvailable = false;
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.LabelField(onlineVersion + " " + playgroundLanguage.updateAvailableText, EditorStyles.wordWrappedMiniLabel);
            EditorGUILayout.BeginHorizontal();
            if ( GUILayout.Button(playgroundLanguage.unityAssetStore, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)) ) {
                Application.OpenURL("com.unity3d.kharma:content/13325");
            }

            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();
            EditorGUILayout.Separator();
        }
        EditorGUILayout.BeginVertical(boxStyle);

        // Create New-buttons
        EditorGUILayout.BeginHorizontal();
        if ( GUILayout.Button(playgroundLanguage.newParticlePlaygroundSystem, EditorStyles.toolbarButton) ) {
            if ( PlaygroundC.reference == null )
                CreateManager();
            PlaygroundParticlesC newParticlePlayground = PlaygroundC.Particle();
            newParticlePlayground.EditorYieldSelect();
        }
        GUI.enabled = PlaygroundC.reference == null;
        if ( GUILayout.Button(playgroundLanguage.playgroundManager, EditorStyles.toolbarButton) ) {
            PlaygroundC.ResourceInstantiate("Playground Manager");
        }
        GUI.enabled = true;
        if ( GUILayout.Button(playgroundLanguage.presetWizard, EditorStyles.toolbarButton) ) {
            PlaygroundCreatePresetWindowC.ShowWindow();
        }

        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();
        EditorGUILayout.EndVertical();

        if ( assetsFound ) {

            // Presets
            EditorGUILayout.BeginVertical(boxStyle);
            playgroundSettings.presetsFoldout = GUILayout.Toggle(playgroundSettings.presetsFoldout, playgroundLanguage.presets, EditorStyles.foldout);
            if ( playgroundSettings.presetsFoldout ) {
                EditorGUILayout.BeginHorizontal("Toolbar");

                // Search
                string prevSearchString = searchString;
                searchString = GUILayout.TextField(searchString, toolbarSearchSkin, new GUILayoutOption[] { GUILayout.ExpandWidth(false), GUILayout.Width(Mathf.FloorToInt(Screen.width) - 120), GUILayout.MinWidth(100) });
                if ( GUILayout.Button("", toolbarSearchButtonSkin) ) {
                    searchString = "";
                    GUI.FocusControl(null);
                }

                if ( prevSearchString != searchString ) {
                    for ( int p = 0; p < presetNames.Length; p++ )
                        presetObjects[p].unfiltered = (searchString == "" ? true : presetNames[p].ToLower().Contains(searchString.ToLower()));
                }

                EditorGUILayout.Separator();
                presetExampleUser = GUILayout.Toolbar(presetExampleUser, new string[] { playgroundLanguage.all, playgroundLanguage.user, playgroundLanguage.examples }, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false));
                GUILayout.Label("", EditorStyles.toolbarButton);
                presetListStyle = GUILayout.Toolbar(presetListStyle, new string[] { playgroundLanguage.icons, playgroundLanguage.list }, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false));
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginVertical(boxStyle);

                if ( presetObjects.Count > 0 ) {
                    if ( presetListStyle == 0 )
                        EditorGUILayout.BeginHorizontal();
                    int rows = 1;
                    int iconwidths = 0;
                    int skippedPresets = 0;
                    for ( int i = 0; i < presetObjects.Count; i++ ) {

                        // Filter out by search
                        if ( !presetObjects[i].unfiltered || presetExampleUser == 2 && !presetObjects[i].example || presetExampleUser == 1 && presetObjects[i].example ) {
                            skippedPresets++;
                            continue;
                        }
                        // Preset Object were destroyed
                        if ( presetObjects[i].presetObject == null ) {
                            Initialize();
                            return;
                        }

                        // List
                        if ( presetListStyle == 1 ) {
                            EditorGUILayout.BeginVertical(boxStyle, GUILayout.MinHeight(24));
                            EditorGUILayout.BeginHorizontal();
                            GUILayout.Label(i.ToString(), EditorStyles.miniLabel, new GUILayoutOption[] { GUILayout.Width(18) });
                            EditorGUILayout.LabelField(presetObjects[i].example ? "(" + playgroundLanguage.example + ")" : "(" + playgroundLanguage.user + ")", EditorStyles.miniLabel, new GUILayoutOption[] { GUILayout.MaxWidth(70) });
                            if ( GUILayout.Button(presetObjects[i].presetObject.name, EditorStyles.label) ) {
                                CreatePresetObject(i);
                            }
                            EditorGUILayout.Separator();
                            if ( GUILayout.Button(presetObjects[i].example ? playgroundLanguage.convertTo + " " + playgroundLanguage.user : playgroundLanguage.convertTo + " " + playgroundLanguage.example, EditorStyles.toolbarButton, new GUILayoutOption[] { GUILayout.ExpandWidth(false), GUILayout.Height(16) }) ) {
                                if ( presetObjects[i].example ) {
                                    AssetDatabase.MoveAsset(AssetDatabase.GetAssetPath(presetObjects[i].presetObject), "Assets/" + playgroundSettings.playgroundPath + playgroundSettings.presetPath + presetObjects[i].presetObject.name + ".prefab");
                                } else {
                                    AssetDatabase.MoveAsset(AssetDatabase.GetAssetPath(presetObjects[i].presetObject), "Assets/" + playgroundSettings.playgroundPath + playgroundSettings.examplePresetPath + presetObjects[i].presetObject.name + ".prefab");
                                }
                            }
                            if ( GUILayout.Button("-", EditorStyles.toolbarButton, new GUILayoutOption[] { GUILayout.Width(18), GUILayout.Height(16) }) ) {
                                RemovePreset(presetObjects[i].presetObject);
                            }
                            EditorGUILayout.EndHorizontal();
                            EditorGUILayout.EndVertical();
                        } else
                        if ( presetListStyle == 0 ) {

                            // Break row for icons
                            rows = Mathf.FloorToInt(Screen.width / 322);
                            iconwidths += 322;
                            if ( iconwidths > Screen.width && i > 0 ) {
                                iconwidths = 322;
                                EditorGUILayout.EndHorizontal();
                                EditorGUILayout.BeginHorizontal();
                            }

                            if ( Screen.width >= 644 ) {
                                EditorGUILayout.BeginVertical(boxStyle, GUILayout.MaxWidth(Mathf.CeilToInt(Screen.width / rows) - (44 / rows)));
                            } else
                                EditorGUILayout.BeginVertical(boxStyle);
                            EditorGUILayout.BeginHorizontal(GUILayout.MinHeight(46));
                            if ( GUILayout.Button(presetObjects[i].presetImage, EditorStyles.miniButton, new GUILayoutOption[] { GUILayout.Width(44), GUILayout.Height(44) }) ) {
                                CreatePresetObject(i);
                            }
                            EditorGUILayout.BeginVertical();

                            if ( GUILayout.Button(presetObjects[i].presetObject.name, EditorStyles.label, GUILayout.Height(18)) )
                                CreatePresetObject(i);
                            EditorGUILayout.LabelField(presetObjects[i].example ? playgroundLanguage.example : playgroundLanguage.user, EditorStyles.miniLabel);
                            EditorGUILayout.EndVertical();
                            GUILayout.FlexibleSpace();
                            EditorGUILayout.BeginVertical();

                            if ( GUILayout.Button("x", EditorStyles.miniButton, new GUILayoutOption[] { GUILayout.Width(18), GUILayout.Height(18) }) ) {
                                RemovePreset(presetObjects[i].presetObject);
                            }
                            EditorGUILayout.EndVertical();
                            EditorGUILayout.EndHorizontal();
                            EditorGUILayout.EndVertical();

                        }
                    }
                    if ( skippedPresets == presetObjects.Count ) {
                        if ( searchString != "" ) {
                            EditorGUILayout.HelpBox(playgroundLanguage.searchNoPresetFound + " \"" + searchString + "\".", MessageType.Info);
                        } else {
                            if ( presetExampleUser == 0 )
                                EditorGUILayout.HelpBox(playgroundLanguage.noPresetsFound, MessageType.Info);
                            else if ( presetExampleUser == 1 )
                                EditorGUILayout.HelpBox(playgroundLanguage.noUserPresetsFound, MessageType.Info);
                            else if ( presetExampleUser == 2 )
                                EditorGUILayout.HelpBox(playgroundLanguage.noExamplePresetsFound + " \"" + "Assets/" + playgroundSettings.playgroundPath + playgroundSettings.examplePresetPath + "\"", MessageType.Info);
                        }
                    }
                    if ( presetListStyle == 0 )
                        EditorGUILayout.EndHorizontal();
                } else {
                    EditorGUILayout.HelpBox(playgroundLanguage.noPresetsFoundInProject + " \"" + "Assets/" + playgroundSettings.playgroundPath + playgroundSettings.examplePresetPath + "\"", MessageType.Info);
                }

                if ( GUILayout.Button(playgroundLanguage.create, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)) ) {
                    PlaygroundCreatePresetWindowC.ShowWindow();
                }

                EditorGUILayout.EndVertical();
            }
            EditorGUILayout.EndVertical();
        } else {
            EditorGUILayout.HelpBox(playgroundLanguage.noAssetsFoundMessage, MessageType.Warning);
        }

        // Extension check
        if ( playgroundSettings.enableExtensions && !didSendExtensionsCheck )
            CheckExtensions();

        // Extension icon download
        if ( playgroundSettings.enableExtensions && extensionObjects != null && iconDownloadIndex < extensionObjects.Count ) {
            if ( extensionObjects[iconDownloadIndex].IsExpectingDownload() )
                extensionObjects[iconDownloadIndex].IconDownloadRoutine();
            else {
                iconDownloadIndex++;
            }
        }

        // Extend Your Playground GUI
        if ( playgroundSettings.enableExtensions ) {
            EditorGUILayout.BeginVertical(boxStyle);
            playgroundSettings.extensionsFoldout = GUILayout.Toggle(playgroundSettings.extensionsFoldout, playgroundLanguage.extendYourPlayground, EditorStyles.foldout);
            if ( playgroundSettings.extensionsFoldout ) {
                EditorGUILayout.BeginHorizontal("Toolbar");

                // Search
                string prevSearchString = searchStringExtensions;
                searchStringExtensions = GUILayout.TextField(searchStringExtensions, toolbarSearchSkin, new GUILayoutOption[] { GUILayout.ExpandWidth(false), GUILayout.Width(Mathf.FloorToInt(Screen.width) - 120), GUILayout.MinWidth(100) });
                if ( GUILayout.Button("", toolbarSearchButtonSkin) ) {
                    searchStringExtensions = "";
                    GUI.FocusControl(null);
                }

                if ( prevSearchString != searchStringExtensions ) {
                    for ( int p = 0; p < extensionObjects.Count; p++ )
                        extensionObjects[p].unfiltered = (searchStringExtensions == "" ? true : extensionObjects[p].searchMeta.ToLower().Contains(searchStringExtensions.ToLower()));
                }

                EditorGUILayout.Separator();

                playgroundSettings.extensionIconSize = GUILayout.HorizontalSlider(playgroundSettings.extensionIconSize, .5f, 1f, GUILayout.MaxWidth(60));
                EditorGUILayout.EndHorizontal();

                if ( didSendExtensionsCheck ) {
                    if ( extensionsAvailable && extensionObjects != null ) {
                        EditorGUILayout.BeginHorizontal();
                        int rows = 1;
                        int iconwidths = 0;
                        int iconSize = Mathf.RoundToInt(75 * playgroundSettings.extensionIconSize);
                        int skippedExtensions = 0;
                        bool smallSize = playgroundSettings.extensionIconSize <= .65;
                        bool listSize = playgroundSettings.extensionIconSize <= .5;
                        bool didLoad = false;

                        // List of extensions
                        if ( listSize ) {
                            EditorGUILayout.BeginVertical();
                            for ( int i = 0; i < extensionObjects.Count; i++ ) {

                                // Filter out by search
                                if ( !extensionObjects[i].unfiltered ) {
                                    skippedExtensions++;
                                    continue;
                                }

                                if ( !didLoad )
                                    didLoad = extensionObjects[i].CheckAvailability();

                                EditorGUILayout.BeginHorizontal(boxStyle);
                                GUILayout.Label(extensionObjects[i].icon, new GUILayoutOption[] { GUILayout.Width(24), GUILayout.Height(24) });
                                if ( GUILayout.Button(extensionObjects[i].title, EditorStyles.boldLabel, GUILayout.ExpandWidth(true)) )
                                    OpenUAS(extensionObjects[i].id);

                                if ( GUILayout.Button(extensionObjects[i].publisher, EditorStyles.miniLabel, GUILayout.ExpandWidth(false)) ) {
                                    searchStringExtensions = extensionObjects[i].publisher;
                                    for ( int p = 0; p < extensionObjects.Count; p++ )
                                        extensionObjects[p].unfiltered = (searchStringExtensions == "" ? true : extensionObjects[p].searchMeta.ToLower().Contains(searchStringExtensions.ToLower()));
                                }

                                if ( GUILayout.Button(extensionObjects[i].category, boxStyle, GUILayout.ExpandWidth(false)) ) {
                                    searchStringExtensions = extensionObjects[i].category;
                                    for ( int p = 0; p < extensionObjects.Count; p++ )
                                        extensionObjects[p].unfiltered = (searchStringExtensions == "" ? true : extensionObjects[p].searchMeta.ToLower().Contains(searchStringExtensions.ToLower()));
                                }

                                EditorGUILayout.EndHorizontal();
                            }
                            EditorGUILayout.EndVertical();
                        } else {
                            for ( int i = 0; i < extensionObjects.Count; i++ ) {

                                // Filter out by search
                                if ( !extensionObjects[i].unfiltered ) {
                                    skippedExtensions++;
                                    continue;
                                }

                                if ( !didLoad )
                                    didLoad = extensionObjects[i].CheckAvailability();

                                // Break row for icons
                                rows = Mathf.FloorToInt(Screen.width / 322);
                                iconwidths += 322;
                                if ( iconwidths > Screen.width && i > 0 ) {
                                    iconwidths = 322;
                                    EditorGUILayout.EndHorizontal();
                                    EditorGUILayout.BeginHorizontal();
                                }

                                if ( Screen.width >= 644 ) {
                                    EditorGUILayout.BeginVertical(boxStyle, GUILayout.MaxWidth(Mathf.CeilToInt(Screen.width / rows) - (45 / rows)));
                                } else
                                    EditorGUILayout.BeginVertical(boxStyle);
                                EditorGUILayout.BeginHorizontal(GUILayout.MinHeight(iconSize + 16));
                                if ( GUILayout.Button(extensionObjects[i].icon, EditorStyles.miniButton, new GUILayoutOption[] { GUILayout.Width(iconSize + 12), GUILayout.Height(iconSize + 12) }) ) {
                                    OpenUAS(extensionObjects[i].id);
                                }
                                EditorGUILayout.BeginVertical();

                                EditorGUILayout.BeginVertical(boxStyle, GUILayout.MinHeight(iconSize + 10));
                                if ( GUILayout.Button(extensionObjects[i].title, EditorStyles.boldLabel, GUILayout.ExpandWidth(true)) )
                                    OpenUAS(extensionObjects[i].id);

                                if ( smallSize ) {
                                    EditorGUILayout.BeginHorizontal();
                                }

                                if ( GUILayout.Button(extensionObjects[i].category, EditorStyles.label, GUILayout.ExpandWidth(false)) ) {
                                    searchStringExtensions = extensionObjects[i].category;
                                    for ( int p = 0; p < extensionObjects.Count; p++ )
                                        extensionObjects[p].unfiltered = (searchStringExtensions == "" ? true : extensionObjects[p].searchMeta.ToLower().Contains(searchStringExtensions.ToLower()));
                                }

                                if ( GUILayout.Button(extensionObjects[i].publisher, EditorStyles.miniLabel, GUILayout.ExpandWidth(false)) ) {
                                    searchStringExtensions = extensionObjects[i].publisher;
                                    for ( int p = 0; p < extensionObjects.Count; p++ )
                                        extensionObjects[p].unfiltered = (searchStringExtensions == "" ? true : extensionObjects[p].searchMeta.ToLower().Contains(searchStringExtensions.ToLower()));
                                }

                                if ( smallSize ) {
                                    EditorGUILayout.EndHorizontal();
                                }

                                EditorGUILayout.EndHorizontal();
                                EditorGUILayout.EndVertical();
                                EditorGUILayout.EndVertical();
                                EditorGUILayout.EndVertical();
                            }
                        }

                        EditorGUILayout.EndHorizontal();

                        // No extensions found by search
                        if ( skippedExtensions == extensionObjects.Count ) {
                            if ( searchStringExtensions != "" ) {
                                EditorGUILayout.HelpBox(playgroundLanguage.searchNoExtensionsFound + " \"" + searchStringExtensions + "\".", MessageType.Info);
                            }
                        } else if ( skippedExtensions > 0 && searchStringExtensions != "" )
                            EditorGUILayout.HelpBox(playgroundLanguage.listHasBeenFilteredWith + ": \"" + searchStringExtensions + "\".", MessageType.Info);

                    } else
                        EditorGUILayout.HelpBox(playgroundLanguage.extensionsDownloadError, MessageType.Warning);
                } else
                    EditorGUILayout.HelpBox(playgroundLanguage.extensionsDownloading, MessageType.Info);
            }
            EditorGUILayout.EndVertical();
        }

        PlaygroundInspectorC.RenderPlaygroundSettings();

        // Playground Settings
        EditorGUILayout.BeginVertical(boxStyle);
        playgroundSettings.settingsFoldout = GUILayout.Toggle(playgroundSettings.settingsFoldout, playgroundLanguage.settings, EditorStyles.foldout);
        if ( playgroundSettings.settingsFoldout ) {
            EditorGUILayout.BeginVertical(boxStyle);
            if ( playgroundSettings == null || playgroundSettings.IsInstance() ) {
                EditorGUILayout.HelpBox(playgroundLanguage.noSettingsFile + " \"" + PlaygroundSettingsC.settingsPath + "\".", MessageType.Warning);
                if ( GUILayout.Button(playgroundLanguage.create, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)) ) {
                    PlaygroundSettingsC.New();
                    Initialize();
                    return;
                }
            } else {
                playgroundSettings.checkForUpdates = EditorGUILayout.Toggle(playgroundLanguage.checkForUpdates, playgroundSettings.checkForUpdates);
                playgroundSettings.enableExtensions = EditorGUILayout.Toggle(playgroundLanguage.extendYourPlayground, playgroundSettings.enableExtensions);
                playgroundSettings.presetsHasPrefabConnection = EditorGUILayout.Toggle(playgroundLanguage.prefabConnection, playgroundSettings.presetsHasPrefabConnection);

                EditorGUI.BeginChangeCheck();
                playgroundSettings.hierarchyIcon = EditorGUILayout.Toggle(playgroundLanguage.hierarchyIcon, playgroundSettings.hierarchyIcon);
                if ( EditorGUI.EndChangeCheck() ) {
                    PlaygroundHierarchyIcon.Set();
                }
                EditorGUILayout.Separator();

                EditorGUILayout.BeginVertical(boxStyle);
                playgroundSettings.settingsLanguageFoldout = GUILayout.Toggle(playgroundSettings.settingsLanguageFoldout, playgroundLanguage.language, EditorStyles.foldout);
                if ( playgroundSettings.settingsLanguageFoldout ) {
                    if ( playgroundSettings.languages.Count > 0 ) {

                        bool setThisLoadFrom = false;
                        int currentLanguageCount = playgroundSettings.languages.Count;
                        for ( int i = 0; i < playgroundSettings.languages.Count; i++ ) {
                            if ( currentLanguageCount != playgroundSettings.languages.Count ) {
                                Initialize();
                                return;
                            }
                            setThisLoadFrom = false;
                            EditorGUILayout.BeginHorizontal(boxStyle);

                            if ( playgroundSettings.languages[i] == null ) {
                                playgroundSettings.languages.RemoveAt(i);
                                Initialize();
                                return;
                            }

                            if ( playgroundSettings.selectedLanguage == i ) {
                                EditorGUILayout.Toggle(true, EditorStyles.radioButton, GUILayout.Width(14));
                            } else
                                setThisLoadFrom = EditorGUILayout.Toggle(setThisLoadFrom, EditorStyles.radioButton, GUILayout.Width(14));
                            if ( setThisLoadFrom || GUILayout.Button(playgroundSettings.languages[i].languageName + " (" + playgroundSettings.languages[i].languageNameSeenByEnglish + ")", EditorStyles.label) ) {
                                playgroundSettings.selectedLanguage = i;
                                playgroundLanguage = PlaygroundSettingsC.GetLanguage();
                                PlaygroundInspectorC.playgroundLanguage = playgroundLanguage;
                                PlaygroundParticleSystemInspectorC.playgroundLanguage = playgroundLanguage;
                            }

                            if ( GUILayout.Button(playgroundLanguage.edit, EditorStyles.toolbarButton, new GUILayoutOption[] { GUILayout.ExpandWidth(false), GUILayout.Height(16) }) )
                                Selection.activeObject = (Object) playgroundSettings.languages[i];
                            if ( GUILayout.Button(playgroundLanguage.export, EditorStyles.toolbarButton, new GUILayoutOption[] { GUILayout.ExpandWidth(false), GUILayout.Height(16) }) )
                                PlaygroundSettingsC.ExportLanguage(i);
                            if ( GUILayout.Button("-", EditorStyles.toolbarButton, new GUILayoutOption[] { GUILayout.Width(18), GUILayout.Height(16) }) ) {
                                if ( EditorUtility.DisplayDialog(
                                    playgroundLanguage.remove + " " + playgroundSettings.languages[i].languageName + "?",
                                    playgroundLanguage.removeLanguage + " " + playgroundSettings.languages[i].languageName + "?",
                                    playgroundLanguage.yes, playgroundLanguage.no) ) {
                                    AssetDatabase.MoveAssetToTrash(AssetDatabase.GetAssetPath(playgroundSettings.languages[i]));
                                    playgroundSettings.languages.RemoveAt(i);
                                    if ( playgroundSettings.selectedLanguage == i )
                                        playgroundSettings.selectedLanguage = 0;
                                    Initialize();
                                    return;
                                }
                            }

                            EditorGUILayout.EndHorizontal();
                        }
                    } else {
                        EditorGUILayout.HelpBox(playgroundLanguage.noLanguageFound, MessageType.Warning);
                    }
                    EditorGUILayout.BeginHorizontal();
                    if ( GUILayout.Button(playgroundLanguage.create, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)) ) {
                        playgroundSettings.languages.Add(PlaygroundLanguageC.New());
                        EditorUtility.SetDirty(playgroundSettings);
                        Initialize();
                        return;
                    }
                    if ( GUILayout.Button(playgroundLanguage.install, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)) ) {
                        PlaygroundInstallLanguageWindowC.ShowWindow();
                    }
                    EditorGUILayout.EndHorizontal();
                }

                EditorGUILayout.EndVertical();

                // Limits
                EditorGUILayout.BeginVertical(boxStyle);
                playgroundSettings.limitsFoldout = GUILayout.Toggle(playgroundSettings.limitsFoldout, playgroundLanguage.editorLimits, EditorStyles.foldout);
                if ( playgroundSettings.limitsFoldout ) {
                    EditorGUILayout.Separator();
                    playgroundSettings.maximumAllowedTransitionTime = EditorGUILayout.FloatField(playgroundLanguage.transitionTime, playgroundSettings.maximumAllowedTransitionTime);
                    EditorGUILayout.Separator();
                    playgroundSettings.maximumAllowedParticles = EditorGUILayout.IntField(playgroundLanguage.particleCount, playgroundSettings.maximumAllowedParticles);
                    playgroundSettings.maximumAllowedLifetime = EditorGUILayout.FloatField(playgroundLanguage.particleLifetime, playgroundSettings.maximumAllowedLifetime);
                    playgroundSettings.maximumAllowedRotation = EditorGUILayout.FloatField(playgroundLanguage.particleRotation, playgroundSettings.maximumAllowedRotation);
                    playgroundSettings.maximumAllowedSize = EditorGUILayout.FloatField(playgroundLanguage.particleSize, playgroundSettings.maximumAllowedSize);
                    playgroundSettings.maximumAllowedScale = EditorGUILayout.FloatField(playgroundLanguage.particleScale, playgroundSettings.maximumAllowedScale);
                    playgroundSettings.maximumAllowedSourceScatter = EditorGUILayout.FloatField(playgroundLanguage.sourceScatter, playgroundSettings.maximumAllowedSourceScatter);
                    EditorGUILayout.Separator();
                    playgroundSettings.maximumAllowedDeltaMovementStrength = EditorGUILayout.FloatField(playgroundLanguage.deltaMovementStrength, playgroundSettings.maximumAllowedDeltaMovementStrength);
                    playgroundSettings.maximumAllowedDamping = EditorGUILayout.FloatField(playgroundLanguage.damping, playgroundSettings.maximumAllowedDamping);
                    playgroundSettings.maximumAllowedInitialVelocity = EditorGUILayout.FloatField(playgroundLanguage.initialVelocity, playgroundSettings.maximumAllowedInitialVelocity);
                    playgroundSettings.maximumAllowedVelocity = EditorGUILayout.FloatField(playgroundLanguage.velocity, playgroundSettings.maximumAllowedVelocity);
                    playgroundSettings.maximumAllowedStretchSpeed = EditorGUILayout.FloatField(playgroundLanguage.stretchSpeed, playgroundSettings.maximumAllowedStretchSpeed);
                    EditorGUILayout.Separator();
                    playgroundSettings.maximumAllowedCollisionRadius = EditorGUILayout.FloatField(playgroundLanguage.collisionRadius, playgroundSettings.maximumAllowedCollisionRadius);
                    playgroundSettings.maximumAllowedMass = EditorGUILayout.FloatField(playgroundLanguage.mass, playgroundSettings.maximumAllowedMass);
                    playgroundSettings.maximumAllowedBounciness = EditorGUILayout.FloatField(playgroundLanguage.bounciness, playgroundSettings.maximumAllowedBounciness);
                    playgroundSettings.maximumAllowedDepth = EditorGUILayout.FloatField(playgroundLanguage.depth2D, playgroundSettings.maximumAllowedDepth);
                    EditorGUILayout.Separator();
                    playgroundSettings.minimumAllowedUpdateRate = EditorGUILayout.IntField(playgroundLanguage.updateRate, playgroundSettings.minimumAllowedUpdateRate);
                    playgroundSettings.maximumAllowedTimescale = EditorGUILayout.FloatField(playgroundLanguage.timeScale, playgroundSettings.maximumAllowedTimescale);
                    playgroundSettings.maximumAllowedPrewarmCycles = EditorGUILayout.IntField(playgroundLanguage.prewarmCyclesResolution, playgroundSettings.maximumAllowedPrewarmCycles);
                    playgroundSettings.maximumRenderSliders = EditorGUILayout.FloatField(playgroundLanguage.renderSliders, playgroundSettings.maximumRenderSliders);
                    EditorGUILayout.Separator();
                    playgroundSettings.maximumAllowedPaintPositions = EditorGUILayout.IntField(playgroundLanguage.paintPositions, playgroundSettings.maximumAllowedPaintPositions);
                    playgroundSettings.minimumAllowedBrushScale = EditorGUILayout.FloatField(playgroundLanguage.brushSizeMin, playgroundSettings.minimumAllowedBrushScale);
                    playgroundSettings.maximumAllowedBrushScale = EditorGUILayout.FloatField(playgroundLanguage.brushSizeMax, playgroundSettings.maximumAllowedBrushScale);
                    playgroundSettings.minimumEraserRadius = EditorGUILayout.FloatField(playgroundLanguage.eraserSizeMin, playgroundSettings.minimumEraserRadius);
                    playgroundSettings.maximumEraserRadius = EditorGUILayout.FloatField(playgroundLanguage.eraserSizeMax, playgroundSettings.maximumEraserRadius);
                    playgroundSettings.maximumAllowedPaintSpacing = EditorGUILayout.FloatField(playgroundLanguage.paintSpacing, playgroundSettings.maximumAllowedPaintSpacing);
                    EditorGUILayout.Separator();
                    playgroundSettings.maximumAllowedManipulatorSize = EditorGUILayout.FloatField(playgroundLanguage.manipulatorSize, playgroundSettings.maximumAllowedManipulatorSize);
                    playgroundSettings.maximumAllowedManipulatorStrength = EditorGUILayout.FloatField(playgroundLanguage.manipulatorStrength, playgroundSettings.maximumAllowedManipulatorStrength);
                    playgroundSettings.maximumAllowedManipulatorStrengthEffectors = EditorGUILayout.FloatField(playgroundLanguage.manipulatorStrengthEffectors, playgroundSettings.maximumAllowedManipulatorStrengthEffectors);
                    playgroundSettings.maximumAllowedManipulatorZeroVelocity = EditorGUILayout.FloatField(playgroundLanguage.manipulatorZeroVelocityStrength, playgroundSettings.maximumAllowedManipulatorZeroVelocity);
                    EditorGUILayout.Separator();
                }
                EditorGUILayout.EndVertical();

                // Paths
                EditorGUILayout.BeginVertical(boxStyle);
                playgroundSettings.settingsPathFoldout = GUILayout.Toggle(playgroundSettings.settingsPathFoldout, playgroundLanguage.paths, EditorStyles.foldout);
                if ( playgroundSettings.settingsPathFoldout ) {
                    string currentPlaygroundPath = playgroundSettings.playgroundPath;
                    string currentExamplePresetPath = playgroundSettings.examplePresetPath;
                    string currentPresetPath = playgroundSettings.presetPath;

                    playgroundSettings.playgroundPath = EditorGUILayout.TextField(playgroundLanguage.playgroundPath, playgroundSettings.playgroundPath);
                    playgroundSettings.languagePath = EditorGUILayout.TextField(playgroundLanguage.languagesPath, playgroundSettings.languagePath);
                    playgroundSettings.presetPath = EditorGUILayout.TextField(playgroundLanguage.userPresetPath, playgroundSettings.presetPath);
                    playgroundSettings.examplePresetPath = EditorGUILayout.TextField(playgroundLanguage.examplePresetPath, playgroundSettings.examplePresetPath);
                    playgroundSettings.iconPath = EditorGUILayout.TextField(playgroundLanguage.presetIconPath, playgroundSettings.iconPath);
                    playgroundSettings.brushPath = EditorGUILayout.TextField(playgroundLanguage.brushPath, playgroundSettings.brushPath);
                    playgroundSettings.scriptPath = EditorGUILayout.TextField(playgroundLanguage.scriptPath, playgroundSettings.scriptPath);
                    playgroundSettings.versionUrl = EditorGUILayout.TextField(playgroundLanguage.updateUrl, playgroundSettings.versionUrl);
                    playgroundSettings.extensionsUrl = EditorGUILayout.TextField(playgroundLanguage.extensionsUrl, playgroundSettings.extensionsUrl);

                    if ( currentPlaygroundPath != playgroundSettings.playgroundPath || currentExamplePresetPath != playgroundSettings.examplePresetPath || currentPresetPath != playgroundSettings.presetPath )
                        Initialize();
                }
                EditorGUILayout.EndVertical();
            }
            EditorGUILayout.EndVertical();
        }
        EditorGUILayout.EndVertical();

        GUILayout.FlexibleSpace();

        EditorGUILayout.BeginVertical(boxStyle);
        EditorGUILayout.BeginHorizontal();
        if ( GUILayout.Button(playgroundLanguage.officialSite, EditorStyles.toolbarButton) ) {
            Application.OpenURL("http://playground.polyfied.com/");
        }
        if ( GUILayout.Button(playgroundLanguage.assetStore, EditorStyles.toolbarButton) ) {
            Application.OpenURL("com.unity3d.kharma:content/13325");
        }
        if ( GUILayout.Button(playgroundLanguage.manual, EditorStyles.toolbarButton) ) {
            Application.OpenURL("http://www.polyfied.com/products/Particle-Playground-2-Next-Manual.pdf");
        }
        if ( GUILayout.Button(playgroundLanguage.supportForum, EditorStyles.toolbarButton) ) {
            Application.OpenURL("http://forum.unity3d.com/threads/215154-Particle-Playground");
        }
        if ( GUILayout.Button(playgroundLanguage.mailSupport, EditorStyles.toolbarButton) ) {
            Application.OpenURL("mailto:[email protected]");
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        GUILayout.EndScrollView();
        EditorGUILayout.EndVertical();

        if ( GUI.changed )
            EditorUtility.SetDirty(playgroundSettings);
    }
    public void Initialize()
    {
        presetButtonStyle = new GUIStyle();
        presetButtonStyle.stretchWidth = true;
        presetButtonStyle.stretchHeight = true;

        // Load settings
        playgroundSettings = PlaygroundSettingsC.SetReference();
        PlaygroundInspectorC.playgroundSettings = playgroundSettings;
        PlaygroundParticleSystemInspectorC.playgroundSettings = playgroundSettings;

        // Load language
        playgroundLanguage = PlaygroundSettingsC.GetLanguage();
        PlaygroundInspectorC.playgroundLanguage = playgroundLanguage;
        PlaygroundParticleSystemInspectorC.playgroundLanguage = playgroundLanguage;

        List<Object> particlePrefabs = new List<Object>();

        // Get all user presets (bound to Resources)
        int userPrefabCount = 0;
        Object[] resourcePrefabs = (Object[]) Resources.LoadAll("Presets", typeof(GameObject));
        foreach ( Object thisResourcePrefab in resourcePrefabs ) {
            particlePrefabs.Add(thisResourcePrefab);
            userPrefabCount++;
        }

        // Get all example presets
        string assetsDataPath = Application.dataPath;
        string editorPresetPath = assetsDataPath + "/" + playgroundSettings.playgroundPath + playgroundSettings.examplePresetPath;
        string[] editorPresetPaths = new string[0];

        if ( Directory.Exists(assetsDataPath + "/" + playgroundSettings.playgroundPath) ) {
            if ( Directory.Exists(editorPresetPath) )
                editorPresetPaths = Directory.GetFiles(editorPresetPath);
            assetsFound = true;
        } else {
            assetsFound = false;
            playgroundSettings.settingsFoldout = true;
            playgroundSettings.settingsPathFoldout = true;
            return;
        }

        if ( editorPresetPaths != null ) {
            foreach ( string thisPresetPath in editorPresetPaths ) {
                string convertedPresetPath = thisPresetPath.Substring(assetsDataPath.Length - 6);
                Object presetPathObject = (Object) AssetDatabase.LoadAssetAtPath(convertedPresetPath, typeof(Object));
                if ( presetPathObject != null && (presetPathObject.GetType().Name) == "GameObject" ) {
                    particlePrefabs.Add(presetPathObject);
                }
            }
        }

        Texture2D particleImageDefault = AssetDatabase.LoadAssetAtPath("Assets/" + playgroundSettings.playgroundPath + playgroundSettings.iconPath + "Default.png", typeof(Texture2D)) as Texture2D;
        Texture2D particleImage;

        presetObjects = new List<PresetObjectC>();
        int i = 0;
        for ( ; i < particlePrefabs.Count; i++ ) {
            presetObjects.Add(new PresetObjectC());
            presetObjects[i].presetObject = particlePrefabs[i];
            presetObjects[i].example = (i >= userPrefabCount);
            particleImage = AssetDatabase.LoadAssetAtPath("Assets/" + playgroundSettings.playgroundPath + playgroundSettings.iconPath + presetObjects[i].presetObject.name + ".png", typeof(Texture2D)) as Texture2D;

            // Try the asset location if we didn't find it in regular editor folder
            if ( particleImage == null ) {
                particleImage = AssetDatabase.LoadAssetAtPath(Path.GetDirectoryName(AssetDatabase.GetAssetPath(presetObjects[i].presetObject as UnityEngine.Object)) + "/" + presetObjects[i].presetObject.name + ".png", typeof(Texture2D)) as Texture2D;
            }

            // Finally use the specified icon (or the default)
            if ( particleImage != null )
                presetObjects[i].presetImage = particleImage;
            else if ( particleImageDefault != null )
                presetObjects[i].presetImage = particleImageDefault;
        }
        presetNames = new string[presetObjects.Count];
        for ( i = 0; i < presetNames.Length; i++ ) {
            presetNames[i] = presetObjects[i].presetObject.name;

            // Filter on previous search
            presetObjects[i].unfiltered = (searchString == "" ? true : presetNames[i].ToLower().Contains(searchString.ToLower()));
        }

        if ( playgroundSettings.checkForUpdates && !didSendVersionCheck )
            versionRequest = new WWW(playgroundSettings.versionUrl);

        if ( playgroundSettings.enableExtensions && !didSendExtensionsCheck ) {
            extensionsRequest = new WWW(playgroundSettings.extensionsUrl);
        }
    }
 public static void ShowWindow()
 {
     playgroundLanguage = PlaygroundSettingsC.GetLanguage();
     window = EditorWindow.GetWindow<PlaygroundCreatePresetWindowC>(true, playgroundLanguage.presetWizard);
     window.Show();
 }
	public static void RenderPlaygroundSettings () {
		if (boxStyle==null)
			boxStyle = GUI.skin.FindStyle("box");
		EditorGUILayout.BeginVertical(boxStyle);
		
		if (playgroundSettings==null) {
			playgroundSettings = PlaygroundSettingsC.GetReference();
			playgroundLanguage = PlaygroundSettingsC.GetLanguage();
		}
		playgroundSettings.playgroundManagerFoldout = GUILayout.Toggle(playgroundSettings.playgroundManagerFoldout, playgroundLanguage.playgroundManager, EditorStyles.foldout);
		if (playgroundSettings.playgroundManagerFoldout) {
			
			EditorGUILayout.BeginVertical(boxStyle);
			if (playgroundScriptReference==null) {
				playgroundScriptReference = GameObject.FindObjectOfType<PlaygroundC>();
				if (playgroundScriptReference)
					Initialize(playgroundScriptReference);
			}
			
			if (playgroundSettings.playgroundFoldout && playgroundScriptReference!=null) {
				playground.Update();
				
				// Particle System List
				if (GUILayout.Button(playgroundLanguage.particleSystems+" ("+playgroundScriptReference.particleSystems.Count+")", EditorStyles.toolbarDropDown)) playgroundSettings.particleSystemsFoldout=!playgroundSettings.particleSystemsFoldout;
				if (playgroundSettings.particleSystemsFoldout) {
					
					EditorGUILayout.Separator();
					
					if (playgroundScriptReference.particleSystems.Count>0) {
						for (int ps = 0; ps<playgroundScriptReference.particleSystems.Count; ps++) {
							
							EditorGUILayout.BeginVertical(boxStyle, GUILayout.MinHeight(26));
							EditorGUILayout.BeginHorizontal();
							
							if (playgroundScriptReference.particleSystems[ps].particleSystemGameObject == Selection.activeGameObject) GUILayout.BeginHorizontal(boxStyle);
							
							GUILayout.Label(ps.ToString(), EditorStyles.miniLabel, new GUILayoutOption[]{GUILayout.Width(18)});
							if (GUILayout.Button(playgroundScriptReference.particleSystems[ps].particleSystemGameObject.name+" ("+playgroundScriptReference.particleSystems[ps].particleCount+")", EditorStyles.label)) {
								Selection.activeGameObject = playgroundScriptReference.particleSystems[ps].particleSystemGameObject;
							}
							EditorGUILayout.Separator();
							if (playgroundScriptReference.particleSystems[ps].threadMethod!=ThreadMethodLocal.Inherit) {
								GUILayout.Label(playgroundLanguage.thread+": "+playgroundScriptReference.particleSystems[ps].threadMethod.ToString(), EditorStyles.miniLabel);
							}
							GUI.enabled = (playgroundScriptReference.particleSystems.Count>1);
							if(GUILayout.Button(playgroundLanguage.upSymbol, EditorStyles.toolbarButton, new GUILayoutOption[]{GUILayout.Width(18), GUILayout.Height(16)})){
								particleSystems.MoveArrayElement(ps, ps==0?playgroundScriptReference.particleSystems.Count-1:ps-1);
							}
							if(GUILayout.Button(playgroundLanguage.downSymbol, EditorStyles.toolbarButton, new GUILayoutOption[]{GUILayout.Width(18), GUILayout.Height(16)})){
								particleSystems.MoveArrayElement(ps, ps<playgroundScriptReference.particleSystems.Count-1?ps+1:0);
							}
							GUI.enabled = true;
							
							// Clone
							if(GUILayout.Button("+", EditorStyles.toolbarButton, new GUILayoutOption[]{GUILayout.Width(18), GUILayout.Height(16)})){
								GameObject ppsDuplicateGo = Instantiate(playgroundScriptReference.particleSystems[ps].particleSystemGameObject, playgroundScriptReference.particleSystems[ps].particleSystemTransform.position, playgroundScriptReference.particleSystems[ps].particleSystemTransform.rotation) as GameObject;
								PlaygroundParticlesC ppsDuplicate = ppsDuplicateGo.GetComponent<PlaygroundParticlesC>();
								
								// Add this to Manager
								if (PlaygroundC.reference!=null) {
									PlaygroundC.particlesQuantity++;
									ppsDuplicate.particleSystemId = PlaygroundC.particlesQuantity;
									if (PlaygroundC.reference.autoGroup && ppsDuplicate.particleSystemTransform.parent==null)
										ppsDuplicate.particleSystemTransform.parent = PlaygroundC.referenceTransform;
								}
							}
							if(GUILayout.Button("-", EditorStyles.toolbarButton, new GUILayoutOption[]{GUILayout.Width(18), GUILayout.Height(16)})){
								if (EditorUtility.DisplayDialog(
									playgroundLanguage.remove+" "+playgroundScriptReference.particleSystems[ps].particleSystemGameObject.name+"?",
									playgroundLanguage.removeParticlePlaygroundSystem, 
									playgroundLanguage.yes, playgroundLanguage.no)) {
									if (Selection.activeGameObject==playgroundScriptReference.particleSystems[ps].particleSystemGameObject)
										Selection.activeGameObject = PlaygroundC.referenceTransform.gameObject;
									PlaygroundC.Destroy(playgroundScriptReference.particleSystems[ps]);
									playground.ApplyModifiedProperties();
									return;
								}
							}
							
							if (playgroundScriptReference.particleSystems[ps].particleSystemGameObject == Selection.activeGameObject) GUILayout.EndHorizontal();
							EditorGUILayout.EndHorizontal();
							EditorGUILayout.EndVertical();
						}
					} else {
						EditorGUILayout.HelpBox(playgroundLanguage.noParticleSystems, MessageType.Info);
					}
					
					if(GUILayout.Button(playgroundLanguage.create, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false))){
						PlaygroundParticlesC createdParticles = PlaygroundC.Particle();
						Selection.activeGameObject = createdParticles.particleSystemGameObject;
					}
					
					EditorGUILayout.Separator();
				}
				
				// Manipulators
				if (GUILayout.Button(playgroundLanguage.globalManipulators+" ("+playgroundScriptReference.manipulators.Count+")", EditorStyles.toolbarDropDown)) playgroundSettings.globalManipulatorsFoldout=!playgroundSettings.globalManipulatorsFoldout;
				if (playgroundSettings.globalManipulatorsFoldout) {
					
					EditorGUILayout.Separator();
					
					if (manipulators.arraySize>0) {
						
						for (int i = 0; i<manipulators.arraySize; i++) {
							if (!playgroundScriptReference.manipulators[i].enabled)
								GUI.contentColor = Color.gray;
							string mName;
							if (playgroundScriptReference.manipulators[i].transform.available) {
								mName = playgroundScriptReference.manipulators[i].transform.transform.name;
								if (mName.Length>24)
									mName = mName.Substring(0, 24)+"...";
							} else {
								GUI.color = Color.red;
								mName = "("+playgroundLanguage.missingTransform+")";
							}
							
							EditorGUILayout.BeginVertical(boxStyle);
							
							EditorGUILayout.BeginHorizontal();
							
							GUILayout.Label(i.ToString(), EditorStyles.miniLabel, GUILayout.Width(18));
							playgroundScriptReference.manipulators[i].unfolded = GUILayout.Toggle(playgroundScriptReference.manipulators[i].unfolded, ManipulatorTypeName(playgroundScriptReference.manipulators[i].type), EditorStyles.foldout, GUILayout.Width(Screen.width/4));
							if (playgroundScriptReference.manipulators[i].transform.available) {
								if (GUILayout.Button(" ("+mName+")", EditorStyles.label)) {
									Selection.activeGameObject = playgroundScriptReference.manipulators[i].transform.transform.gameObject;
								}
							} else {
								GUILayout.Button(ManipulatorTypeName(playgroundScriptReference.manipulators[i].type)+" ("+playgroundLanguage.missingTransform+")", EditorStyles.label);
							}
							GUI.contentColor = Color.white;
							EditorGUILayout.Separator();
							GUI.enabled = (playgroundScriptReference.manipulators.Count>1);
							if(GUILayout.Button(playgroundLanguage.upSymbol, EditorStyles.toolbarButton, new GUILayoutOption[]{GUILayout.Width(18), GUILayout.Height(16)})){
								manipulators.MoveArrayElement(i, i==0?playgroundScriptReference.manipulators.Count-1:i-1);
							}
							if(GUILayout.Button(playgroundLanguage.downSymbol, EditorStyles.toolbarButton, new GUILayoutOption[]{GUILayout.Width(18), GUILayout.Height(16)})){
								manipulators.MoveArrayElement(i, i<playgroundScriptReference.manipulators.Count-1?i+1:0);
							}
							GUI.enabled = true;
							if(GUILayout.Button("+", EditorStyles.toolbarButton, new GUILayoutOption[]{GUILayout.Width(18), GUILayout.Height(16)})){
								PlaygroundC.reference.manipulators.Add(playgroundScriptReference.manipulators[i].Clone());
							}
							if(GUILayout.Button("-", EditorStyles.toolbarButton, new GUILayoutOption[]{GUILayout.Width(18), GUILayout.Height(16)})){
								
								if (EditorUtility.DisplayDialog(
									playgroundLanguage.remove+" "+ManipulatorTypeName(playgroundScriptReference.manipulators[i].type)+" "+playgroundLanguage.manipulator+" "+i+"?",
									playgroundLanguage.removeManipulator+" "+mName+"? "+playgroundLanguage.gameObjectIntact, 
									playgroundLanguage.yes, playgroundLanguage.no)) {
									manipulators.DeleteArrayElementAtIndex(i);
									playground.ApplyModifiedProperties();
									return;
								}
							}
							
							GUI.color = Color.white;
							
							EditorGUILayout.EndHorizontal();
							
							if (playgroundScriptReference.manipulators[i].unfolded && i<manipulators.arraySize) {
								RenderManipulatorSettings(playgroundScriptReference.manipulators[i], manipulators.GetArrayElementAtIndex(i), true);
							}
							
							GUI.enabled = true;
							EditorGUILayout.Separator();
							EditorGUILayout.EndVertical();
						}
						
					} else {
						EditorGUILayout.HelpBox(playgroundLanguage.noManipulators, MessageType.Info);
					}
					
					if(GUILayout.Button(playgroundLanguage.create, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false))){
						
						if (Selection.gameObjects.Length>0 && Selection.activeGameObject.transform && Selection.activeTransform!=null) {
							Transform mTrans = new GameObject().transform;
							mTrans.parent = PlaygroundC.referenceTransform;
							mTrans.position = Selection.activeGameObject.transform.position+Vector3.up;
							if (manipulators.arraySize>0)
								mTrans.name = "Global Manipulator "+(manipulators.arraySize+1);
							else mTrans.name = "Global Manipulator";
							PlaygroundC.ManipulatorObject(mTrans);
						} else
							manipulators.InsertArrayElementAtIndex(manipulators.arraySize);
						SceneView.RepaintAll();
					}
					
					EditorGUILayout.Separator();
					
				}
				
				// Advanced Settings
				if (GUILayout.Button(playgroundLanguage.advanced, EditorStyles.toolbarDropDown)) playgroundSettings.advancedSettingsFoldout=!playgroundSettings.advancedSettingsFoldout;
				if (playgroundSettings.advancedSettingsFoldout) {
					
					showSnapshotsSettings = PlaygroundC.reference.showSnapshotsInHierarchy;
					
					EditorGUILayout.Separator();
					EditorGUILayout.PropertyField(calculate, new GUIContent(playgroundLanguage.calculateParticles, playgroundLanguage.calculateParticlesDescription));
					EditorGUILayout.PropertyField(autoGroup, new GUIContent(playgroundLanguage.groupAutomatically, playgroundLanguage.groupAutomaticallyDescription));
					EditorGUILayout.PropertyField(buildZeroAlphaPixels, new GUIContent(playgroundLanguage.buildZeroAlphaPixels, playgroundLanguage.buildZeroAlphaPixelsDescription));
					EditorGUILayout.PropertyField(drawGizmos, new GUIContent(playgroundLanguage.sceneGizmos, playgroundLanguage.sceneGizmosDescription));
					GUI.enabled = drawGizmos.boolValue;
					EditorGUILayout.PropertyField(drawSourcePositions, new GUIContent(playgroundLanguage.sourcePositions, playgroundLanguage.sourcePositionsDescription));
					EditorGUILayout.PropertyField(drawSplinePreview, new GUIContent(playgroundLanguage.drawSplinePreview, playgroundLanguage.drawSplinePreviewDescription));
					PlaygroundSpline.drawSplinePreviews = drawSplinePreview.boolValue;
					GUI.enabled = true;
					EditorGUILayout.PropertyField(drawWireframe, new GUIContent(playgroundLanguage.wireframes, playgroundLanguage.wireframesDescription));
					EditorGUILayout.PropertyField(paintToolbox, new GUIContent(playgroundLanguage.paintToolbox, playgroundLanguage.paintToolboxDescription));
					EditorGUILayout.PropertyField(showShuriken, new GUIContent(playgroundLanguage.showShuriken, playgroundLanguage.showShurikenDescription));
					EditorGUILayout.PropertyField(showSnapshots, new GUIContent(playgroundLanguage.advancedSnapshots, playgroundLanguage.advancedSnapshotsDescription));
					EditorGUILayout.PropertyField(pixelFilterMode, new GUIContent(playgroundLanguage.pixelFilterMode, playgroundLanguage.pixelFilterModeDescription));
					EditorGUILayout.Separator();
					GUILayout.BeginVertical(boxStyle);
					EditorGUILayout.LabelField(playgroundLanguage.multithreading+" ("+PlaygroundC.ActiveThreads().ToString()+" "+playgroundLanguage.activeThreads+", "+PlaygroundC.ProcessorCount()+" "+playgroundLanguage.processors+")", EditorStyles.miniLabel);
					EditorGUILayout.PropertyField(threads, new GUIContent(playgroundLanguage.particleThreadMethod, playgroundLanguage.threadMethodDescription));
					EditorGUILayout.PropertyField(threadsTurbulence, new GUIContent(playgroundLanguage.turbulenceThreadMethod, playgroundLanguage.threadMethodDescription));
					EditorGUILayout.PropertyField(threadsSkinned, new GUIContent(playgroundLanguage.skinnedMeshThreadMethod, playgroundLanguage.threadMethodDescription));
					GUI.enabled = playgroundScriptReference.threadMethod==ThreadMethod.Automatic; 
					EditorGUILayout.PropertyField(maxThreads, new GUIContent(playgroundLanguage.maxThreads, playgroundLanguage.maxThreadsDescription));
					GUI.enabled = true;
					switch (playgroundScriptReference.threadMethod) {
					case ThreadMethod.NoThreads:EditorGUILayout.HelpBox(playgroundLanguage.threadInfo01, MessageType.Info);break;
					case ThreadMethod.OnePerSystem:EditorGUILayout.HelpBox(playgroundLanguage.threadInfo02, MessageType.Info);break;
					case ThreadMethod.OneForAll:EditorGUILayout.HelpBox(playgroundLanguage.threadInfo03, MessageType.Info);break;
					case ThreadMethod.Automatic:EditorGUILayout.HelpBox(playgroundLanguage.threadInfo04, MessageType.Info);break;
					}
					GUILayout.EndHorizontal();
					
					EditorGUILayout.Separator();
					
					// Update snapshot visibility
					if (showSnapshots.boolValue != showSnapshotsSettings) {
						UpdateSnapshots();
					}
					
					// Time reset
					GUILayout.BeginHorizontal();
					EditorGUILayout.PrefixLabel(playgroundLanguage.timeSimulation);
					if(GUILayout.Button(playgroundLanguage.reset, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false))){
						PlaygroundC.TimeReset();
						for (int p = 0; p<playgroundScriptReference.particleSystems.Count; p++)
							playgroundScriptReference.particleSystems[p].Boot();
					}
					GUILayout.EndHorizontal();
					
				}
				
				
				
				playground.ApplyModifiedProperties();
				EditorGUILayout.EndVertical();
			} else {
				EditorGUILayout.HelpBox(playgroundLanguage.noPlaygroundManager, MessageType.Info);
				if(GUILayout.Button(playgroundLanguage.create, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false))){
					PlaygroundC.ResourceInstantiate("Playground Manager");
				}
				EditorGUILayout.EndVertical();
			}
			
		}
		EditorGUILayout.EndVertical();
	}
    public static void ExportLanguage(PlaygroundLanguageC selectedLanguage)
    {
        string xmlPath = EditorUtility.SaveFilePanel (selectedLanguage.saveLanguage, "", "Particle Playground Language - "+selectedLanguage.languageNameSeenByEnglish+".xml", "xml");

        if (xmlPath.Length!=0) {
            XmlDocument xml = new XmlDocument();
            XmlNode rootNode = xml.CreateElement ("Playground");
            xml.AppendChild (rootNode);
            SerializedObject serializedLanguage = new SerializedObject(selectedLanguage);
            SerializedProperty languageProperty = serializedLanguage.GetIterator();
            while (languageProperty.Next(true)) {
                if (languageProperty.propertyType==SerializedPropertyType.String) {
                    XmlNode newNode = xml.CreateElement(languageProperty.propertyPath);
                    newNode.InnerText = languageProperty.stringValue;
                    rootNode.AppendChild (newNode);
                }
            }
            xml.Save (xmlPath);
        }
    }
	void OnEnable () {

		lastActiveTool = Tools.current;
		isEditingInHierarchy = Selection.activeTransform!=null;

		// Load settings
		playgroundSettings = PlaygroundSettingsC.GetReference();
		
		// Load language
		playgroundLanguage = PlaygroundSettingsC.GetLanguage();
		
		// Playground Particles
		playgroundParticlesScriptReference = target as PlaygroundParticlesC;
		if (playgroundParticlesScriptReference==null) return;
		playgroundParticles = new SerializedObject(playgroundParticlesScriptReference);
		
		shurikenRenderer = playgroundParticlesScriptReference.particleSystemGameObject.GetComponent<ParticleSystem>().GetComponent<Renderer>() as ParticleSystemRenderer;

		// Sorting layers
		Type internalEditorUtilityType = typeof(InternalEditorUtility);
		PropertyInfo sortingLayersProperty = internalEditorUtilityType.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic);
		rendererSortingLayers = (string[])sortingLayersProperty.GetValue(null, new object[0]);
		for (int i = 0; i<rendererSortingLayers.Length; i++) {
			if (shurikenRenderer.sortingLayerName == rendererSortingLayers[i])
				selectedSortingLayer = i;
		}

		// UV Module (Texture Sheet Animation)
		shuriken = new SerializedObject(playgroundParticlesScriptReference.shurikenParticleSystem);
		uvModule = shuriken.FindProperty("UVModule");
		uvModule_enabled = uvModule.FindPropertyRelative("enabled");
		uvModule_frameOverTime_scalar = uvModule.FindPropertyRelative("frameOverTime.scalar");
		uvModule_frameOverTime_minCurve = uvModule.FindPropertyRelative("frameOverTime.minCurve");
		uvModule_frameOverTime_maxCurve = uvModule.FindPropertyRelative("frameOverTime.maxCurve");
		uvModule_frameOverTime_minMaxState = uvModule.FindPropertyRelative("frameOverTime.minMaxState");
		uvModule_tilesX = uvModule.FindPropertyRelative("tilesX");
		uvModule_tilesY = uvModule.FindPropertyRelative("tilesY");
		uvModule_animationType = uvModule.FindPropertyRelative("animationType");
		uvModule_rowIndex = uvModule.FindPropertyRelative("rowIndex");
		uvModule_cycles = uvModule.FindPropertyRelative("cycles");
		uvModule_randomRow = uvModule.FindPropertyRelative("randomRow");
		uv_animationType = (AnimationType)uvModule_animationType.intValue;
		uv_minMaxState = (MinMaxState)uvModule_frameOverTime_minMaxState.intValue;


		shurikenRendererSO = new SerializedObject(shurikenRenderer);
		sortingMode = shurikenRendererSO.FindProperty("m_SortMode");
		sortingFudge = shurikenRendererSO.FindProperty("m_SortingFudge");
		sortMode = (SortMode)sortingMode.intValue;

		manipulators = playgroundParticles.FindProperty("manipulators");
		events = playgroundParticles.FindProperty("events");
		snapshots = playgroundParticles.FindProperty("snapshots");
		source = playgroundParticles.FindProperty("source");
		sorting = playgroundParticles.FindProperty("sorting");
		lifetimeSorting = playgroundParticles.FindProperty("lifetimeSorting");
		activeState = playgroundParticles.FindProperty("activeState");
		particleCount = playgroundParticles.FindProperty("particleCount");
		emissionRate = playgroundParticles.FindProperty("emissionRate");
		updateRate = playgroundParticles.FindProperty("updateRate");
		emit = playgroundParticles.FindProperty("emit");
		loop = playgroundParticles.FindProperty("loop");
		disableOnDone = playgroundParticles.FindProperty("disableOnDone");
		disableOnDoneRoutine = playgroundParticles.FindProperty("disableOnDoneRoutine");
		calculate = playgroundParticles.FindProperty("calculate");
		deltaMovementStrength = playgroundParticles.FindProperty("deltaMovementStrength");
		particleTimescale = playgroundParticles.FindProperty("particleTimescale");
		sizeMin = playgroundParticles.FindProperty("sizeMin");
		sizeMax = playgroundParticles.FindProperty("sizeMax");
		overflowOffset = playgroundParticles.FindProperty("overflowOffset");
		overflowMode = playgroundParticles.FindProperty("overflowMode");
		lifetime = playgroundParticles.FindProperty("lifetime");
		lifetimeSize = playgroundParticles.FindProperty("lifetimeSize");
		arraySize = playgroundParticles.FindProperty("particleArraySize");
		turbulenceLifetimeStrength = playgroundParticles.FindProperty("turbulenceLifetimeStrength");
		lifetimeVelocity = playgroundParticles.FindProperty("lifetimeVelocity");
		initialVelocityShape = playgroundParticles.FindProperty("initialVelocityShape");
		initialVelocityMin = playgroundParticles.FindProperty("initialVelocityMin");
		initialVelocityMax = playgroundParticles.FindProperty("initialVelocityMax");
		initialLocalVelocityMin = playgroundParticles.FindProperty("initialLocalVelocityMin");
		initialLocalVelocityMax = playgroundParticles.FindProperty("initialLocalVelocityMax");
		lifetimeColor = playgroundParticles.FindProperty("lifetimeColor");
		lifetimeColors = playgroundParticles.FindProperty ("lifetimeColors");
		arrayColor = playgroundParticles.FindProperty("arrayColorAlpha");
		colorSource = playgroundParticles.FindProperty("colorSource");
		collision = playgroundParticles.FindProperty("collision");
		affectRigidbodies = playgroundParticles.FindProperty("affectRigidbodies");
		mass = playgroundParticles.FindProperty("mass");
		collisionRadius = playgroundParticles.FindProperty("collisionRadius");
		collisionMask = playgroundParticles.FindProperty("collisionMask");
		collisionType = playgroundParticles.FindProperty("collisionType");
		bounciness = playgroundParticles.FindProperty("bounciness");
		states = playgroundParticles.FindProperty("states");
		worldObject = playgroundParticles.FindProperty("worldObject");
		skinnedWorldObject = playgroundParticles.FindProperty("skinnedWorldObject");
		forceSkinnedMeshUpdateOnMainThread = playgroundParticles.FindProperty ("forceSkinnedMeshUpdateOnMainThread");
		sourceTransform = playgroundParticles.FindProperty("sourceTransform");
		worldObjectUpdateVertices = playgroundParticles.FindProperty ("worldObjectUpdateVertices");
		worldObjectUpdateNormals = playgroundParticles.FindProperty("worldObjectUpdateNormals");
		sourcePaint = playgroundParticles.FindProperty("paint");
		sourceProjection = playgroundParticles.FindProperty("projection");
		sourceSplines = playgroundParticles.FindProperty("splines");
		sourceTransforms = playgroundParticles.FindProperty("sourceTransforms");
		lifetimeStretching = playgroundParticles.FindProperty("stretchLifetime");
		threadMethod = playgroundParticles.FindProperty("threadMethod");

		playgroundParticlesScriptReference.shurikenParticleSystem = playgroundParticlesScriptReference.GetComponent<ParticleSystem>();
		playgroundParticlesScriptReference.particleSystemRenderer = playgroundParticlesScriptReference.shurikenParticleSystem.GetComponent<Renderer>();
		particleMaterial = playgroundParticlesScriptReference.particleSystemRenderer.sharedMaterial;
		
		onlySourcePositioning = playgroundParticles.FindProperty("onlySourcePositioning");

		lifetimePositioning = playgroundParticles.FindProperty("lifetimePositioning");
		lifetimePositioningX = lifetimePositioning.FindPropertyRelative("x");
		lifetimePositioningY = lifetimePositioning.FindPropertyRelative("y");
		lifetimePositioningZ = lifetimePositioning.FindPropertyRelative("z");
		lifetimePositioningTimeScale = playgroundParticles.FindProperty ("lifetimePositioningTimeScale");
		lifetimePositioningPositionScale = playgroundParticles.FindProperty ("lifetimePositioningPositionScale");

		applyLifetimeVelocity = playgroundParticles.FindProperty("applyLifetimeVelocity");
		lifeTimeVelocityX = lifetimeVelocity.FindPropertyRelative("x");
		lifeTimeVelocityY = lifetimeVelocity.FindPropertyRelative("y");
		lifeTimeVelocityZ = lifetimeVelocity.FindPropertyRelative("z");
		
		initialVelocityShapeX = initialVelocityShape.FindPropertyRelative("x");
		initialVelocityShapeY = initialVelocityShape.FindPropertyRelative("y");
		initialVelocityShapeZ = initialVelocityShape.FindPropertyRelative("z");
		
		applyInitialVelocity = playgroundParticles.FindProperty("applyInitialVelocity");
		applyInitialLocalVelocity = playgroundParticles.FindProperty("applyInitialLocalVelocity");
		applyVelocityBending = playgroundParticles.FindProperty("applyVelocityBending");
		velocityBendingType = playgroundParticles.FindProperty("velocityBendingType");

		movementCompensationLifetimeStrength = playgroundParticles.FindProperty ("movementCompensationLifetimeStrength");
		
		worldObjectGameObject = worldObject.FindPropertyRelative("gameObject");
		skinnedWorldObjectGameObject = skinnedWorldObject.FindPropertyRelative("gameObject");

		// Lifetime colors
		if (playgroundParticlesScriptReference.lifetimeColors==null)
			playgroundParticlesScriptReference.lifetimeColors = new List<PlaygroundGradientC>();

		// Sorting
		prevLifetimeSortingKeys = playgroundParticlesScriptReference.lifetimeSorting.keys;

		// Events list
		eventListFoldout = new List<bool>();
		eventListFoldout.AddRange(new bool[playgroundParticlesScriptReference.events.Count]);

		// States foldout
		statesListFoldout = new List<bool>();
		statesListFoldout.AddRange(new bool[playgroundParticlesScriptReference.states.Count]);

		previousSource = playgroundParticlesScriptReference.source;
		
		// Playground
		playgroundScriptReference = FindObjectOfType<PlaygroundC>();
		
		
		// Create a manager if no existing instance is in the scene
		if (!playgroundScriptReference && Selection.activeTransform!=null) {
			PlaygroundC.ResourceInstantiate("Playground Manager");
			playgroundScriptReference = FindObjectOfType<PlaygroundC>();
		}
		
		if (playgroundScriptReference!=null) {

			PlaygroundC.reference = playgroundScriptReference;

			// Serialize Playground
			playground = new SerializedObject(playgroundScriptReference);
			
			PlaygroundInspectorC.Initialize(playgroundScriptReference);
			
			
			// Add this PlaygroundParticles if not existing in Playground list
			if (!playgroundParticlesScriptReference.isSnapshot && !playgroundScriptReference.particleSystems.Contains(playgroundParticlesScriptReference) && Selection.activeTransform!=null)
				playgroundScriptReference.particleSystems.Add(playgroundParticlesScriptReference);
				
			// Cache components
			playgroundParticlesScriptReference.particleSystemGameObject = playgroundParticlesScriptReference.gameObject;
			playgroundParticlesScriptReference.particleSystemTransform = playgroundParticlesScriptReference.transform;
			playgroundParticlesScriptReference.particleSystemRenderer = playgroundParticlesScriptReference.GetComponent<Renderer>();
			playgroundParticlesScriptReference.shurikenParticleSystem = playgroundParticlesScriptReference.particleSystemGameObject.GetComponent<ParticleSystem>();
			playgroundParticlesScriptReference.particleSystemRenderer2 = playgroundParticlesScriptReference.particleSystemGameObject.GetComponent<ParticleSystem>().GetComponent<Renderer>() as ParticleSystemRenderer;
			
			// Set manager as parent 
			//if (PlaygroundC.reference.autoGroup && playgroundParticlesScriptReference.particleSystemTransform!=null && playgroundParticlesScriptReference.particleSystemTransform.parent == null && Selection.activeTransform!=null)
			//	playgroundParticlesScriptReference.particleSystemTransform.parent = PlaygroundC.referenceTransform;
			
			// Issue a quick refresh

			if (!EditorApplication.isPlaying && isEditingInHierarchy) {
				foreach (PlaygroundParticlesC p in PlaygroundC.reference.particleSystems) {
					p.Start();
				}
			}
		}

		selectedSort = sorting.intValue;

		// State initial values
		if (addStateTransform==null)
			addStateTransform = (Transform)playgroundParticlesScriptReference.particleSystemTransform;
		
		// Visiblity of Shuriken component in Inspector
		if (!playgroundScriptReference || playgroundScriptReference && !playgroundScriptReference.showShuriken)
			playgroundParticlesScriptReference.shurikenParticleSystem.hideFlags = HideFlags.HideInInspector;
		else
			playgroundParticlesScriptReference.shurikenParticleSystem.hideFlags = HideFlags.None;

		SetWireframeVisibility();

		// Set paint init
		paintLayerMask = sourcePaint.FindPropertyRelative("layerMask");
		paintCollisionType = sourcePaint.FindPropertyRelative("collisionType");
		
		// Set projection init
		projectionMask = sourceProjection.FindPropertyRelative("projectionMask");
		projectionCollisionType = sourceProjection.FindPropertyRelative("collisionType");

		// Snapshots
		if (playgroundParticlesScriptReference.snapshots.Count>0) {
			if (playgroundParticlesScriptReference.snapshots.Count>0) {
				for (int i = 0; i<playgroundParticlesScriptReference.snapshots.Count; i++)
					if (playgroundParticlesScriptReference.snapshots[i].settings==null)
						playgroundParticlesScriptReference.snapshots.RemoveAt(i);
			}
			saveName += " "+(playgroundParticlesScriptReference.snapshots.Count+1).ToString();
		}

		SetMissingKeys();
	}
	public void Initialize () {
		presetButtonStyle = new GUIStyle();
		presetButtonStyle.stretchWidth = true;
		presetButtonStyle.stretchHeight = true;

		// Load settings
		playgroundSettings = PlaygroundSettingsC.SetReference();
		PlaygroundInspectorC.playgroundSettings = playgroundSettings;
		PlaygroundParticleSystemInspectorC.playgroundSettings = playgroundSettings;

		// Load language
		playgroundLanguage = PlaygroundSettingsC.GetLanguage();
		PlaygroundInspectorC.playgroundLanguage = playgroundLanguage;
		PlaygroundParticleSystemInspectorC.playgroundLanguage = playgroundLanguage;

		// Get all asset presets
		string assetsDataPath = Application.dataPath;
		if (Directory.Exists (assetsDataPath+"/"+playgroundSettings.playgroundPath+playgroundSettings.examplePresetPath)) {
			assetsFound = true;
		} else {
			assetsFound = false;
			playgroundSettings.settingsFoldout = true;
			playgroundSettings.settingsPathFoldout = true;
			return;
		}

		// Set default particle image
		Texture2D particleImageDefault = AssetDatabase.LoadAssetAtPath("Assets/"+playgroundSettings.playgroundPath+playgroundSettings.iconPath+"Default.png", typeof(Texture2D)) as Texture2D;

		// Prepare any previously entered search words to filter presets
		string[] searchSplits = searchString.Split(new string[]{" "}, System.StringSplitOptions.None);

		// Get the list of categories and presets
		string[] editorPresetCategories = Directory.GetDirectories(assetsDataPath+"/"+playgroundSettings.playgroundPath+playgroundSettings.examplePresetPath);
		presetCategories = new List<PresetCategory>();

		// A linear list of preset objects is kept for easier access
		presetObjects = new List<PresetObjectC>();

		// A linear list of preset names is kept for easier access
		presetNames = new List<string>();

		// List all categories in asset folders
		for (int i = 0; i<editorPresetCategories.Length; i++)
		{
			// Create the category
			string categoryName = editorPresetCategories[i].Substring(editorPresetCategories[i].LastIndexOf('/')+1);
			presetCategories.Add(new PresetCategory(categoryName));

			// Assign the preset objects to the category
			string[] presetsInCategory = Directory.GetFiles (editorPresetCategories[i]);
			for (int x = 0; x<presetsInCategory.Length; x++)
			{
				string convertedPresetPath = presetsInCategory[x].Substring(assetsDataPath.Length-6);
				Object presetPathObject = (Object)AssetDatabase.LoadAssetAtPath(convertedPresetPath, typeof(Object));
				if (presetPathObject!=null && (presetPathObject.GetType().Name)=="GameObject") {
					presetCategories[i].presetObjects.Add (new PresetObjectC(presetPathObject));

					int presetCountInCategory = presetCategories[i].presetObjects.Count-1;

					// Add to list of preset names
					presetNames.Add (categoryName+" - "+presetCategories[i].presetObjects[presetCountInCategory].presetObject.name);

					// Assign an image to the preset object
					Texture2D particleImage = AssetDatabase.LoadAssetAtPath("Assets/"+playgroundSettings.playgroundPath+playgroundSettings.iconPath+presetCategories[i].presetObjects[presetCountInCategory].presetObject.name+".png", typeof(Texture2D)) as Texture2D;

					// Try the asset location if we didn't find an image in regular editor folder
					if (particleImage==null)
						particleImage = AssetDatabase.LoadAssetAtPath(Path.GetDirectoryName(AssetDatabase.GetAssetPath(presetCategories[i].presetObjects[presetCountInCategory].presetObject as UnityEngine.Object))+"/"+presetCategories[i].presetObjects[presetCountInCategory].presetObject.name+".png", typeof(Texture2D)) as Texture2D;
					
					// Finally use the specified icon (or the default)
					if (particleImage!=null)
						presetCategories[i].presetObjects[presetCountInCategory].presetImage = particleImage;
					else if (particleImageDefault!=null)
						presetCategories[i].presetObjects[presetCountInCategory].presetImage = particleImageDefault;

					// Set this to Asset
					presetCategories[i].presetObjects[presetCountInCategory].example = true;

					// Filter the previous search
					foreach (string split in searchSplits)
						presetCategories[i].presetObjects[presetCountInCategory].unfiltered = (searchString.Length==0?true:presetNames[i].ToLower().Contains(split.ToLower()));

					// Add to linear list of preset objects
					presetObjects.Add (presetCategories[i].presetObjects[presetCountInCategory]);
				}
			}
		}

		// List any loose presets
		string[] loosePresets = Directory.GetFiles (assetsDataPath+"/"+playgroundSettings.playgroundPath+playgroundSettings.examplePresetPath);
		bool loosePresetsHasGo = false;
		for (int i = 0; i<loosePresets.Length; i++)
		{
			string convertedPresetPath = loosePresets[i].Substring(assetsDataPath.Length-6);
			Object obj = (Object)AssetDatabase.LoadAssetAtPath(convertedPresetPath, typeof(Object));
			if (obj!= null && obj.GetType().Name=="GameObject")
			{
				loosePresetsHasGo = true;
				break;
			}
		}
		if (loosePresets.Length>0 && loosePresetsHasGo) {
			presetCategories.Add(new PresetCategory("Uncategorized"));
			int categoryCount = presetCategories.Count-1;
			for (int x = 0; x<loosePresets.Length; x++)
			{
				string convertedPresetPath = loosePresets[x].Substring(assetsDataPath.Length-6);
				Object presetPathObject = (Object)AssetDatabase.LoadAssetAtPath(convertedPresetPath, typeof(Object));
				if (presetPathObject!=null && (presetPathObject.GetType().Name)=="GameObject") {
					presetCategories[categoryCount].presetObjects.Add (new PresetObjectC(presetPathObject));
					int presetCountInCategory = presetCategories[categoryCount].presetObjects.Count-1;
					presetNames.Add ("Uncategorized - "+presetCategories[categoryCount].presetObjects[presetCountInCategory].presetObject.name);
					Texture2D particleImage = AssetDatabase.LoadAssetAtPath("Assets/"+playgroundSettings.playgroundPath+playgroundSettings.iconPath+presetCategories[categoryCount].presetObjects[presetCountInCategory].presetObject.name+".png", typeof(Texture2D)) as Texture2D;
					if (particleImage==null)
						particleImage = AssetDatabase.LoadAssetAtPath(Path.GetDirectoryName(AssetDatabase.GetAssetPath(presetCategories[categoryCount].presetObjects[presetCountInCategory].presetObject as UnityEngine.Object))+"/"+presetCategories[categoryCount].presetObjects[presetCountInCategory].presetObject.name+".png", typeof(Texture2D)) as Texture2D;
					if (particleImage!=null)
						presetCategories[categoryCount].presetObjects[presetCountInCategory].presetImage = particleImage;
					else if (particleImageDefault!=null)
						presetCategories[categoryCount].presetObjects[presetCountInCategory].presetImage = particleImageDefault;
					presetCategories[categoryCount].presetObjects[presetCountInCategory].example = true;
					foreach (string split in searchSplits)
						presetCategories[categoryCount].presetObjects[presetCountInCategory].unfiltered = (searchString==""?true:presetNames[categoryCount].ToLower().Contains(split.ToLower()));
					presetObjects.Add (presetCategories[categoryCount].presetObjects[presetCountInCategory]);
				}
			}
		}

		// List any resources presets
		Object[] resourcePrefabs = (Object[])Resources.LoadAll ("Presets", typeof(GameObject));
		if (resourcePrefabs.Length > 0) {
			presetCategories.Add(new PresetCategory("Resources"));
			int categoryCount = presetCategories.Count-1;
			for (int i = 0; i<resourcePrefabs.Length; i++)
			{
				presetCategories[categoryCount].presetObjects.Add (new PresetObjectC(resourcePrefabs[i]));
				int presetCountInCategory = presetCategories[categoryCount].presetObjects.Count-1;
				presetNames.Add ("Resources - "+presetCategories[categoryCount].presetObjects[presetCountInCategory].presetObject.name);
				Texture2D particleImage = AssetDatabase.LoadAssetAtPath("Assets/"+playgroundSettings.playgroundPath+playgroundSettings.iconPath+presetCategories[categoryCount].presetObjects[presetCountInCategory].presetObject.name+".png", typeof(Texture2D)) as Texture2D;
				if (particleImage==null)
					particleImage = AssetDatabase.LoadAssetAtPath(Path.GetDirectoryName(AssetDatabase.GetAssetPath(presetCategories[categoryCount].presetObjects[presetCountInCategory].presetObject as UnityEngine.Object))+"/"+presetCategories[categoryCount].presetObjects[presetCountInCategory].presetObject.name+".png", typeof(Texture2D)) as Texture2D;
				if (particleImage!=null)
					presetCategories[categoryCount].presetObjects[presetCountInCategory].presetImage = particleImage;
				else if (particleImageDefault!=null)
					presetCategories[categoryCount].presetObjects[presetCountInCategory].presetImage = particleImageDefault;
				presetCategories[categoryCount].presetObjects[presetCountInCategory].example = false;
				foreach (string split in searchSplits)
					presetCategories[categoryCount].presetObjects[presetCountInCategory].unfiltered = (searchString==""?true:presetNames[categoryCount].ToLower().Contains(split.ToLower()));
				presetObjects.Add (presetCategories[categoryCount].presetObjects[presetCountInCategory]);
			}
		}

		// Check for internet connection
		hasInternet = CheckForInternetConnection();
	}