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(); }