public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            EditorGUI.BeginProperty(position, label, property);
            EditorGUI.indentLevel++;

            float curY      = position.y + EditorGUIUtility.singleLineHeight / 2;
            float ctrlCount = 0;
            float ctrlSizeY = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;

            // Get all the rects upfront.
            Rect name       = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect aLabel     = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect aBetaSMult = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect aBetaS     = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect aFalloff   = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect hLabel     = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect hBetaSMult = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect hBetaS     = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect hFalloff   = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect hDir       = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect hRatio     = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fLabel     = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fOpacity   = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fBetaS     = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fExtMult   = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fExtS      = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fFalloff   = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fDist      = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fDir       = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fAmb       = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);
            Rect fLight     = new Rect(position.x, curY + ctrlSizeY * ctrlCount++, position.width, EditorGUIUtility.singleLineHeight);

            // Draw all the properties and labels.
            SerializedProperty airMultProp     = property.FindPropertyRelative("m_AirScatteringMultiplier");
            SerializedProperty hazeMultProp    = property.FindPropertyRelative("m_HazeScatteringMultiplier");
            SerializedProperty fogEMultProp    = property.FindPropertyRelative("m_FogExtinctionMultiplier");
            SerializedProperty airScatterProp  = property.FindPropertyRelative("m_AirScatteringScale");
            SerializedProperty hazeScatterProp = property.FindPropertyRelative("m_HazeScatteringScale");
            SerializedProperty fogEProp        = property.FindPropertyRelative("m_FogExtinctionScale");

            GUIStyle popupStyle = new GUIStyle(EditorStyles.popup);

            popupStyle.alignment  = TextAnchor.MiddleLeft;
            popupStyle.fixedWidth = 40;

            DS_HazeCore.HeightFalloffType falloff = DS_HazeCore.HeightFalloffType.Exponential;

            if (DS_HazeCore.Instance != null)
            {
                falloff = DS_HazeCore.Instance.HeightFalloff;
            }

            EditorGUI.PropertyField(name, property.FindPropertyRelative("m_Name"));
            EditorGUI.LabelField(aLabel, "Air:", EditorStyles.boldLabel);

            EditorGUI.BeginChangeCheck();
            airMultProp.enumValueIndex = EditorGUI.Popup(aBetaSMult, "Scattering Multiplier", airMultProp.enumValueIndex, MultiplierStr, popupStyle);

            float airParamMax = 8 * DS_HazeContextItem.MultiplierAsFloat((DS_HazeContextItem.Multiplier)airMultProp.enumValueIndex);

            EditorGUI.Slider(aBetaS, airScatterProp, 0, airParamMax, "Scattering");

            if (EditorGUI.EndChangeCheck())
            {
                if (airScatterProp.floatValue > airParamMax)
                {
                    airScatterProp.floatValue = airParamMax;
                }
            }

            bool wasEnabled = GUI.enabled;

            if (falloff != DS_HazeCore.HeightFalloffType.Exponential)
            {
                GUI.enabled = false;
            }
            EditorGUI.PropertyField(aFalloff, property.FindPropertyRelative("m_AirDensityHeightFalloff"), new GUIContent("Height Falloff", strToolTipAirHeightFalloff));
            GUI.enabled = wasEnabled;

            EditorGUI.LabelField(hLabel, "Haze:", EditorStyles.boldLabel);
            EditorGUI.BeginChangeCheck();
            hazeMultProp.enumValueIndex = EditorGUI.Popup(hBetaSMult, "Scattering Multiplier", hazeMultProp.enumValueIndex, MultiplierStr, popupStyle);

            float hazeParamMax = 8 * DS_HazeContextItem.MultiplierAsFloat((DS_HazeContextItem.Multiplier)hazeMultProp.enumValueIndex);

            EditorGUI.Slider(hBetaS, hazeScatterProp, 0, hazeParamMax, "Scattering");

            if (EditorGUI.EndChangeCheck())
            {
                if (hazeScatterProp.floatValue > hazeParamMax)
                {
                    hazeScatterProp.floatValue = hazeParamMax;
                }
            }

            wasEnabled = GUI.enabled;
            if (falloff != DS_HazeCore.HeightFalloffType.Exponential)
            {
                GUI.enabled = false;
            }
            EditorGUI.PropertyField(hFalloff, property.FindPropertyRelative("m_HazeDensityHeightFalloff"), new GUIContent("Height Falloff", strToolTipHazeHeightFalloff));
            GUI.enabled = wasEnabled;

            EditorGUI.PropertyField(hDir, property.FindPropertyRelative("m_HazeScatteringDirection"), new GUIContent("Scatter Direction", strToolTipHazeScatterDirection));
            EditorGUI.PropertyField(hRatio, property.FindPropertyRelative("m_HazeSecondaryScatteringRatio"), new GUIContent("Direct/Indirect Ratio", strToolTipHazeIndirectRatio));
            EditorGUI.LabelField(fLabel, "Fog/Mist:", EditorStyles.boldLabel);
            EditorGUI.PropertyField(fOpacity, property.FindPropertyRelative("m_FogOpacity"), new GUIContent("Opacity", strToolTipFogOpacity));

            EditorGUI.BeginChangeCheck();
            EditorGUI.PropertyField(fBetaS, property.FindPropertyRelative("m_FogScatteringScale"), new GUIContent("Scattering", strToolTipFogScatterScale));
            fogEMultProp.enumValueIndex = EditorGUI.Popup(fExtMult, "Extinction Multiplier", fogEMultProp.enumValueIndex, MultiplierStr, popupStyle);

            float fogEParamMax = 8 * DS_HazeContextItem.MultiplierAsFloat((DS_HazeContextItem.Multiplier)fogEMultProp.enumValueIndex);

            EditorGUI.Slider(fExtS, fogEProp, 0, fogEParamMax, "Extinction");

            if (EditorGUI.EndChangeCheck())
            {
                if (fogEProp.floatValue > fogEParamMax)
                {
                    fogEProp.floatValue = fogEParamMax;
                }
            }

            wasEnabled = GUI.enabled;
            if (falloff != DS_HazeCore.HeightFalloffType.Exponential)
            {
                GUI.enabled = false;
            }
            EditorGUI.PropertyField(fFalloff, property.FindPropertyRelative("m_FogDensityHeightFalloff"), new GUIContent("Height Falloff", strToolTipFogHeightFalloff));
            GUI.enabled = wasEnabled;

            EditorGUI.PropertyField(fDist, property.FindPropertyRelative("m_FogStartDistance"), new GUIContent("Start Distance", strToolTipFogStartDistance));
            EditorGUI.PropertyField(fDir, property.FindPropertyRelative("m_FogScatteringDirection"), new GUIContent("Scatter Direction", strToolTipFogScatterDirection));
            EditorGUI.PropertyField(fAmb, property.FindPropertyRelative("m_FogAmbientColour"), new GUIContent("Ambient Colour", strToolTipFogAmbCol));
            EditorGUI.PropertyField(fLight, property.FindPropertyRelative("m_FogLightColour"), new GUIContent("Light Colour", strToolTipFogLightCol));

            EditorGUI.indentLevel--;
            EditorGUI.EndProperty();
        }