using UnityEditor.Rendering; using UnityEngine; using UnityEngine.Rendering.HighDefinition; namespace UnityEditor.Rendering.HighDefinition { [CanEditMultipleObjects] [CustomEditor(typeof(PhysicallyBasedSky))] class PhysicallyBasedSkyEditor : SkySettingsEditor { SerializedDataParameter m_Type; SerializedDataParameter m_AtmosphericScattering; SerializedDataParameter m_Mode; SerializedDataParameter m_Material; SerializedDataParameter m_PlanetRotation; SerializedDataParameter m_GroundColorTexture; SerializedDataParameter m_GroundTint; SerializedDataParameter m_GroundEmissionTexture; SerializedDataParameter m_GroundEmissionMultiplier; SerializedDataParameter m_SpaceRotation; SerializedDataParameter m_SpaceEmissionTexture; SerializedDataParameter m_SpaceEmissionMultiplier; SerializedDataParameter m_AirMaximumAltitude; SerializedDataParameter m_AirDensityR; SerializedDataParameter m_AirDensityG; SerializedDataParameter m_AirDensityB; SerializedDataParameter m_AirTint; SerializedDataParameter m_AerosolMaximumAltitude; SerializedDataParameter m_AerosolDensity; SerializedDataParameter m_AerosolTint; SerializedDataParameter m_AerosolAnisotropy; SerializedDataParameter m_OzoneDensity; SerializedDataParameter m_OzoneMinimumAltitude; SerializedDataParameter m_OzoneLayerWidth; SerializedDataParameter m_ColorSaturation; SerializedDataParameter m_AlphaSaturation; SerializedDataParameter m_AlphaMultiplier; SerializedDataParameter m_HorizonTint; SerializedDataParameter m_ZenithTint; SerializedDataParameter m_HorizonZenithShift; GUIContent[] m_ModelTypes = { new GUIContent("Earth (Simple)"), new GUIContent("Earth (Advanced)"), new GUIContent("Custom Planet") }; int[] m_ModelTypeValues = { (int)PhysicallyBasedSkyModel.EarthSimple, (int)PhysicallyBasedSkyModel.EarthAdvanced, (int)PhysicallyBasedSkyModel.Custom }; public override void OnEnable() { base.OnEnable(); m_CommonUIElementsMask = (uint)SkySettingsUIElement.UpdateMode | (uint)SkySettingsUIElement.SkyIntensity | (uint)SkySettingsUIElement.IncludeSunInBaking; var o = new PropertyFetcher(serializedObject); m_Type = Unpack(o.Find(x => x.type)); m_AtmosphericScattering = Unpack(o.Find(x => x.atmosphericScattering)); m_Mode = Unpack(o.Find(x => x.renderingMode)); m_Material = Unpack(o.Find(x => x.material)); m_PlanetRotation = Unpack(o.Find(x => x.planetRotation)); m_GroundColorTexture = Unpack(o.Find(x => x.groundColorTexture)); m_GroundTint = Unpack(o.Find(x => x.groundTint)); m_GroundEmissionTexture = Unpack(o.Find(x => x.groundEmissionTexture)); m_GroundEmissionMultiplier = Unpack(o.Find(x => x.groundEmissionMultiplier)); m_SpaceRotation = Unpack(o.Find(x => x.spaceRotation)); m_SpaceEmissionTexture = Unpack(o.Find(x => x.spaceEmissionTexture)); m_SpaceEmissionMultiplier = Unpack(o.Find(x => x.spaceEmissionMultiplier)); m_AirMaximumAltitude = Unpack(o.Find(x => x.airMaximumAltitude)); m_AirDensityR = Unpack(o.Find(x => x.airDensityR)); m_AirDensityG = Unpack(o.Find(x => x.airDensityG)); m_AirDensityB = Unpack(o.Find(x => x.airDensityB)); m_AirTint = Unpack(o.Find(x => x.airTint)); m_AerosolMaximumAltitude = Unpack(o.Find(x => x.aerosolMaximumAltitude)); m_AerosolDensity = Unpack(o.Find(x => x.aerosolDensity)); m_AerosolTint = Unpack(o.Find(x => x.aerosolTint)); m_AerosolAnisotropy = Unpack(o.Find(x => x.aerosolAnisotropy)); m_OzoneDensity = Unpack(o.Find(x => x.ozoneDensityDimmer)); m_OzoneMinimumAltitude = Unpack(o.Find(x => x.ozoneMinimumAltitude)); m_OzoneLayerWidth = Unpack(o.Find(x => x.ozoneLayerWidth)); m_ColorSaturation = Unpack(o.Find(x => x.colorSaturation)); m_AlphaSaturation = Unpack(o.Find(x => x.alphaSaturation)); m_AlphaMultiplier = Unpack(o.Find(x => x.alphaMultiplier)); m_HorizonTint = Unpack(o.Find(x => x.horizonTint)); m_ZenithTint = Unpack(o.Find(x => x.zenithTint)); m_HorizonZenithShift = Unpack(o.Find(x => x.horizonZenithShift)); } void ModelTypeField(SerializedDataParameter property) { var title = EditorGUIUtility.TrTextContent(property.displayName, property.GetAttribute()?.tooltip); using (var scope = new OverridablePropertyScope(property, title, this)) { if (!scope.displayed) return; var rect = EditorGUILayout.GetControlRect(); EditorGUI.BeginProperty(rect, title, property.value); EditorGUI.BeginChangeCheck(); var value = EditorGUI.IntPopup(rect, title, property.value.intValue, m_ModelTypes, m_ModelTypeValues); if (EditorGUI.EndChangeCheck()) property.value.intValue = value; EditorGUI.EndProperty(); } } public override void OnInspectorGUI() { DrawHeader("Model"); ModelTypeField(m_Type); PropertyField(m_AtmosphericScattering); DrawHeader("Planet and Space"); PropertyField(m_Mode); bool hasMaterial = m_Mode.value.intValue == 1; if (hasMaterial) { using (new IndentLevelScope()) PropertyField(m_Material); } DrawHeader("Planet"); PhysicallyBasedSkyModel type = (PhysicallyBasedSkyModel)m_Type.value.intValue; if (type != PhysicallyBasedSkyModel.EarthSimple && !hasMaterial) { PropertyField(m_PlanetRotation); PropertyField(m_GroundColorTexture); } ColorFieldLinear(m_GroundTint); if (type != PhysicallyBasedSkyModel.EarthSimple && !hasMaterial) { PropertyField(m_GroundEmissionTexture); PropertyField(m_GroundEmissionMultiplier); } if (type != PhysicallyBasedSkyModel.EarthSimple && !hasMaterial) { DrawHeader("Space"); PropertyField(m_SpaceRotation); PropertyField(m_SpaceEmissionTexture); PropertyField(m_SpaceEmissionMultiplier); } if (type == PhysicallyBasedSkyModel.Custom) { DrawHeader("Air"); PropertyField(m_AirMaximumAltitude); PropertyField(m_AirDensityR); PropertyField(m_AirDensityG); PropertyField(m_AirDensityB); PropertyField(m_AirTint); } DrawHeader("Aerosols"); PropertyField(m_AerosolDensity); PropertyField(m_AerosolTint); PropertyField(m_AerosolAnisotropy); if (type != PhysicallyBasedSkyModel.EarthSimple) PropertyField(m_AerosolMaximumAltitude); if (type != PhysicallyBasedSkyModel.EarthSimple) { DrawHeader("Ozone"); PropertyField(m_OzoneDensity); if (type == PhysicallyBasedSkyModel.Custom) { PropertyField(m_OzoneMinimumAltitude); PropertyField(m_OzoneLayerWidth); } } EditorGUILayout.Space(); DrawHeader("Artistic Overrides"); PropertyField(m_ColorSaturation); PropertyField(m_AlphaSaturation); PropertyField(m_AlphaMultiplier); PropertyField(m_HorizonTint); PropertyField(m_HorizonZenithShift); PropertyField(m_ZenithTint); EditorGUILayout.Space(); DrawHeader("Miscellaneous"); base.CommonSkySettingsGUI(); } } }