private void loadProfiles()
        {
            //discard the existing profile reference, if any
            currentProfile = null;
            //clear profiles in case of in-game reload
            Profiles.Clear();
            //grab all profiles detected in global scope config nodes, load them into local storage
            ConfigNode[] profileConfigs = GameDatabase.Instance.GetConfigNodes("TUFX_PROFILE");
            int          len            = profileConfigs.Length;

            for (int i = 0; i < len; i++)
            {
                TUFXProfile profile = new TUFXProfile(profileConfigs[i]);
                if (!Profiles.ContainsKey(profile.ProfileName))
                {
                    Profiles.Add(profile.ProfileName, profile);
                }
                else
                {
                    Log.exception("TUFX Profiles already contains profile for name: " + profile.ProfileName + ".  This is the result of a configuration with" +
                                  " a duplicate name; please check your configurations and remove any duplicates.  Only the first configuration parsed for any one name will be loaded.");
                }
            }
            ConfigNode config = GameDatabase.Instance.GetConfigNodes("TUFX_CONFIGURATION").FirstOrDefault(m => m.GetValue("name") == "Default");

            if (config != null)
            {
                mainMenuProfile = config.GetStringValue("MainMenuProfile", mainMenuProfile);
            }
        }
        /// <summary>
        /// Adds the config-node string representation to the input string builder, and returns the builder when finished.  If the input builder is null, a new instance will be created and returned.
        /// </summary>
        /// <param name="profile"></param>
        /// <param name="builder"></param>
        /// <returns></returns>
        private StringBuilder exportProfile(TUFXProfile profile, StringBuilder builder = null)
        {
            if (builder == null)
            {
                builder = new StringBuilder();
            }
            ConfigNode node = new ConfigNode("TUFX_PROFILE");

            profile.SaveProfile(node);
            builder.Append(node.ToString());
            builder.AppendLine();
            return(builder);
        }
        /// <summary>
        /// Enables the input profile for the currently rendering scene (menu, ksc, editor, tracking, flight, flight-map)
        /// </summary>
        /// <param name="profileName"></param>
        internal void enableProfile(string profileName)
        {
            currentProfile = null;
            Camera activeCam = getActiveCamera();

            Log.debug("TUFX: enableProfile( " + profileName + " )  scene: ( " + HighLogic.LoadedScene + " ) map: ( " + isMapScene + " ) camera: ( " + activeCam?.name + " )");
            Log.debug(System.Environment.StackTrace);
            if (previousCamera != activeCam)
            {
                Log.log("Detected change of active camera; recreating post-process objects.");
                if (volume != null)
                {
                    Log.log("Destroying existing PostProcessVolume (from previous camera).");
                    Component.DestroyImmediate(layer);
                    UnityEngine.Object.DestroyImmediate(volume.sharedProfile);
                    UnityEngine.Object.DestroyImmediate(volume);
                    layer  = null;
                    volume = null;
                }
                previousScene  = HighLogic.LoadedScene;
                wasMapScene    = isMapScene;
                previousCamera = activeCam;
            }

            Log.debug("Active Camera (hashcode): " + activeCam?.GetHashCode());
            if (activeCam == null)
            {
                Log.log("Active camera was null.  Skipping profile setup for scene: " + HighLogic.LoadedScene);
            }
            else if (!string.IsNullOrEmpty(profileName) && Profiles.ContainsKey(profileName))
            {
                Log.log("Enabling profile: " + profileName + ".  Current GameScene: " + HighLogic.LoadedScene);
                TUFXProfile tufxProfile = Profiles[profileName];
                currentProfile = tufxProfile;
                Log.debug("Profile (hashcode): " + tufxProfile?.GetHashCode() + " :: " + tufxProfile?.ProfileName);
                Log.log("Setting HDR for camera: " + activeCam.name + " to: " + tufxProfile.HDREnabled);
                activeCam.allowHDR = tufxProfile.HDREnabled;
                onAntiAliasingSelected(tufxProfile.AntiAliasing, false);
                layer = activeCam.gameObject.AddOrGetComponent <PostProcessLayer>();
                layer.Init(Resources);
                layer.volumeLayer = ~0;//everything //TODO -- fix layer assignment...
                Log.debug("Layer: " + layer?.GetHashCode());
                volume          = activeCam.gameObject.AddOrGetComponent <PostProcessVolume>();
                volume.isGlobal = true;
                volume.priority = 100;
                Log.debug("Volume: " + volume.GetHashCode());
                if (volume.sharedProfile == null)
                {
                    volume.sharedProfile = tufxProfile.GetPostProcessProfile();
                }
                else
                {
                    volume.sharedProfile.settings.Clear();
                    tufxProfile.Enable(volume);
                }
                Log.log("Profile enabled: " + profileName);
                TUFXScatteringManager.INSTANCE.debugProfileSetup(volume, layer);
            }
            else if (string.IsNullOrEmpty(profileName))
            {
                Log.log("Clearing current profile for scene: " + HighLogic.LoadedScene);
            }
            else
            {
                Log.exception("Profile load was requested for: " + profileName + ", but no profile exists for that name.");
            }
        }