static void DrawerPerspectiveType(ISerializedCamera p, Editor owner) { var cam = p.baseCameraSettings; var targets = p.serializedObject.targetObjects; var camera0 = targets[0] as Camera; float fovCurrentValue; bool multipleDifferentFovValues = false; bool isPhysicalCamera = p.projectionMatrixMode.intValue == (int)ProjectionMatrixMode.PhysicalPropertiesBased; var rect = EditorGUILayout.GetControlRect(); var guiContent = EditorGUI.BeginProperty(rect, Styles.FOVAxisModeContent, cam.fovAxisMode); EditorGUI.showMixedValue = cam.fovAxisMode.hasMultipleDifferentValues; CoreEditorUtils.DrawEnumPopup <Camera.FieldOfViewAxis>(rect, guiContent, cam.fovAxisMode); bool fovAxisVertical = cam.fovAxisMode.intValue == 0; if (!fovAxisVertical && !cam.fovAxisMode.hasMultipleDifferentValues) { float aspectRatio = isPhysicalCamera ? cam.sensorSize.vector2Value.x / cam.sensorSize.vector2Value.y : camera0.aspect; // camera.aspect is not serialized so we have to check all targets. fovCurrentValue = Camera.VerticalToHorizontalFieldOfView(camera0.fieldOfView, aspectRatio); if (targets.Cast <Camera>().Any(camera => camera.fieldOfView != fovCurrentValue)) { multipleDifferentFovValues = true; } } else { fovCurrentValue = cam.verticalFOV.floatValue; multipleDifferentFovValues = cam.fovAxisMode.hasMultipleDifferentValues; } EditorGUI.showMixedValue = multipleDifferentFovValues; var content = EditorGUI.BeginProperty(EditorGUILayout.BeginHorizontal(), Styles.fieldOfViewContent, cam.verticalFOV); EditorGUI.BeginDisabledGroup(p.projectionMatrixMode.hasMultipleDifferentValues || isPhysicalCamera && (cam.sensorSize.hasMultipleDifferentValues || cam.fovAxisMode.hasMultipleDifferentValues)); EditorGUI.BeginChangeCheck(); s_FovLastValue = EditorGUILayout.Slider(content, fovCurrentValue, 0.00001f, 179f); s_FovChanged = EditorGUI.EndChangeCheck(); EditorGUI.EndDisabledGroup(); EditorGUILayout.EndHorizontal(); EditorGUI.EndProperty(); EditorGUI.showMixedValue = false; Drawer_FieldClippingPlanes(p, owner); content = EditorGUI.BeginProperty(EditorGUILayout.BeginHorizontal(), Styles.physicalCameraContent, p.projectionMatrixMode); EditorGUI.showMixedValue = p.projectionMatrixMode.hasMultipleDifferentValues; EditorGUI.BeginChangeCheck(); isPhysicalCamera = EditorGUILayout.Toggle(content, isPhysicalCamera); if (EditorGUI.EndChangeCheck()) { p.projectionMatrixMode.intValue = isPhysicalCamera ? (int)ProjectionMatrixMode.PhysicalPropertiesBased : (int)ProjectionMatrixMode.Implicit; s_FovChanged = true; } EditorGUILayout.EndHorizontal(); EditorGUI.EndProperty(); EditorGUI.showMixedValue = false; if (s_FovChanged) { if (!isPhysicalCamera || p.projectionMatrixMode.hasMultipleDifferentValues) { cam.verticalFOV.floatValue = fovAxisVertical ? s_FovLastValue : Camera.HorizontalToVerticalFieldOfView(s_FovLastValue, camera0.aspect); } else if (!p.projectionMatrixMode.hasMultipleDifferentValues) { cam.verticalFOV.floatValue = fovAxisVertical ? s_FovLastValue : Camera.HorizontalToVerticalFieldOfView(s_FovLastValue, camera0.aspect); } } }
static CoreEditorStyles() { smallTickbox = new GUIStyle("ShurikenToggle"); smallMixedTickbox = new GUIStyle("ShurikenToggleMixed"); var transparentTexture = new Texture2D(1, 1, GraphicsFormat.R8G8B8A8_SRGB, TextureCreationFlags.None) { name = "transparent" }; transparentTexture.SetPixel(0, 0, Color.clear); transparentTexture.Apply(); miniLabelButton = new GUIStyle(EditorStyles.miniLabel) { normal = new GUIStyleState { background = transparentTexture, scaledBackgrounds = null, textColor = Color.grey } }; var activeState = new GUIStyleState { background = transparentTexture, scaledBackgrounds = null, textColor = Color.white }; miniLabelButton.active = activeState; miniLabelButton.onNormal = activeState; miniLabelButton.onActive = activeState; paneOptionsIconDark = CoreEditorUtils.LoadIcon("Builtin Skins/DarkSkin/Images", "pane options", ".png"); paneOptionsIconDark.name = "pane options dark skin"; paneOptionsIconLight = CoreEditorUtils.LoadIcon("Builtin Skins/LightSkin/Images", "pane options", ".png"); paneOptionsIconLight.name = "pane options light skin"; m_LightThemeBackgroundColor = new Color(0.7843138f, 0.7843138f, 0.7843138f, 1.0f); m_LightThemeBackgroundHighlightColor = new Color32(174, 174, 174, 255); m_DarkThemeBackgroundColor = new Color(0.2196079f, 0.2196079f, 0.2196079f, 1.0f); m_DarkThemeBackgroundHighlightColor = new Color32(77, 77, 77, 255); additionalPropertiesHighlightStyle = new GUIStyle { normal = { background = Texture2D.whiteTexture } }; const string contextTooltip = ""; // To be defined (see with UX) contextMenuIcon = new GUIContent(paneOptionsIcon, contextTooltip); contextMenuStyle = new GUIStyle("IconButton"); redTexture = CoreEditorUtils.CreateColoredTexture2D(Color.red, "Red 1x1"); greenTexture = CoreEditorUtils.CreateColoredTexture2D(Color.green, "Green 1x1"); blueTexture = CoreEditorUtils.CreateColoredTexture2D(Color.blue, "Blue 1x1"); iconHelp = EditorGUIUtility.FindTexture("_Help"); iconWarn = EditorGUIUtility.FindTexture("console.warnicon"); iconFail = EditorGUIUtility.FindTexture("console.erroricon"); iconSuccess = EditorGUIUtility.FindTexture("TestPassed"); iconPending = EditorGUIUtility.FindTexture("Toolbar Minus"); globalSettingsIcon = EditorGUIUtility.FindTexture("ScriptableObject Icon"); // Make sure that textures are unloaded on domain reloads. void OnBeforeAssemblyReload() { Object.DestroyImmediate(redTexture); Object.DestroyImmediate(greenTexture); Object.DestroyImmediate(blueTexture); Object.DestroyImmediate(transparentTexture); AssemblyReloadEvents.beforeAssemblyReload -= OnBeforeAssemblyReload; } AssemblyReloadEvents.beforeAssemblyReload += OnBeforeAssemblyReload; }
public void OnGUI() { if (asset == null) { return; } if (asset.isDirty) { RefreshEditors(); asset.isDirty = false; } bool isEditable = !VersionControl.Provider.isActive || AssetDatabase.IsOpenForEdit(asset, StatusQueryOptions.UseCachedIfPossible); using (new EditorGUI.DisabledScope(!isEditable)) { // Component list for (int i = 0; i < m_Editors.Count; i++) { var editor = m_Editors[i]; string title = editor.GetDisplayTitle(); int id = i; // Needed for closure capture below CoreEditorUtils.DrawSplitter(); bool displayContent = CoreEditorUtils.DrawHeaderToggle( title, editor.baseProperty, editor.activeProperty, pos => OnContextClick(pos, editor.target, id) ); if (displayContent) { using (new EditorGUI.DisabledScope(!editor.activeProperty.boolValue)) editor.OnInternalInspectorGUI(); } } if (m_Editors.Count > 0) { CoreEditorUtils.DrawSplitter(); } else { EditorGUILayout.HelpBox("This Volume Profile contains no overrides.", MessageType.Info); } EditorGUILayout.Space(); using (var hscope = new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button(EditorGUIUtility.TrTextContent("Add Override"), EditorStyles.miniButton)) { var r = hscope.rect; var pos = new Vector2(r.x + r.width / 2f, r.yMax + 18f); FilterWindow.Show(pos, new VolumeComponentProvider(asset, this)); } } } }
/// <summary> /// Draws the editor. /// </summary> public void OnGUI() { if (asset == null) { return; } // Even if the asset is not dirty, the list of component may have been changed by another inspector. // In this case, only the hash will tell us that we need to refresh. if (asset.isDirty || asset.GetComponentListHashCode() != m_CurrentHashCode) { RefreshEditors(); m_CurrentHashCode = asset.GetComponentListHashCode(); asset.isDirty = false; } bool isEditable = !VersionControl.Provider.isActive || AssetDatabase.IsOpenForEdit(asset, StatusQueryOptions.UseCachedIfPossible); using (new EditorGUI.DisabledScope(!isEditable)) { // Component list for (int i = 0; i < m_Editors.Count; i++) { var editor = m_Editors[i]; string title = editor.GetDisplayTitle(); int id = i; // Needed for closure capture below m_EditorDocumentationURLs.TryGetValue(editor.target.GetType(), out var documentationURL); CoreEditorUtils.DrawSplitter(); bool displayContent = CoreEditorUtils.DrawHeaderToggle( title, editor.baseProperty, editor.activeProperty, pos => OnContextClick(pos, editor, id), editor.hasAdditionalProperties ? () => editor.showAdditionalProperties : (Func <bool>)null, () => editor.showAdditionalProperties ^= true, documentationURL ); if (displayContent) { using (new EditorGUI.DisabledScope(!editor.activeProperty.boolValue)) editor.OnInternalInspectorGUI(); } } if (m_Editors.Count > 0) { CoreEditorUtils.DrawSplitter(); } else { EditorGUILayout.HelpBox("This Volume Profile contains no overrides.", MessageType.Info); } EditorGUILayout.Space(); using (var hscope = new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button(EditorGUIUtility.TrTextContent("Add Override"), EditorStyles.miniButton)) { var r = hscope.rect; var pos = new Vector2(r.x + r.width / 2f, r.yMax + 18f); FilterWindow.Show(pos, new VolumeComponentProvider(asset, this)); } } } }
protected void DrawOverrideCheckbox(SerializedDataParameter property) { var overrideRect = GUILayoutUtility.GetRect(17f, 17f, GUILayout.ExpandWidth(false)); overrideRect.yMin += 4f; property.overrideState.boolValue = GUI.Toggle(overrideRect, property.overrideState.boolValue, CoreEditorUtils.GetContent("|Override this setting for this volume."), CoreEditorStyles.smallTickbox); }
protected void PropertyField(SerializedDataParameter property) { var title = CoreEditorUtils.GetContent(property.displayName); PropertyField(property, title); }
/// <summary> /// Implement this function to make a custom inspector /// </summary> public override void OnInspectorGUI() { LensFlareComponentSRP lensFlareData = m_Intensity.serializedObject.targetObject as LensFlareComponentSRP; bool attachedToLight = false; bool lightIsDirLight = false; Light light = null; if (lensFlareData != null && (light = lensFlareData.GetComponent <Light>()) != null) { attachedToLight = true; if (light.type == LightType.Directional) { lightIsDirLight = true; } } EditorGUI.BeginChangeCheck(); EditorGUILayout.LabelField(Styles.generalData.text, EditorStyles.boldLabel); { using (new EditorGUILayout.HorizontalScope()) { bool showCopy = m_LensFlareData.objectReferenceValue != null; int buttonWidth = showCopy ? 45 : 60; EditorGUILayout.PropertyField(m_LensFlareData, Styles.lensFlareData); if (GUILayout.Button(Styles.newButton, showCopy ? EditorStyles.miniButtonLeft : EditorStyles.miniButton, GUILayout.Width(buttonWidth))) { // By default, try to put assets in a folder next to the currently active // scene file. If the user isn't a scene, put them in root instead. var actualTarget = target as LensFlareComponentSRP; var targetName = actualTarget.name + " Lens Flare (SRP)"; var scene = actualTarget.gameObject.scene; var asset = LensFlareEditorUtils.CreateLensFlareDataSRPAsset(scene, targetName); m_LensFlareData.objectReferenceValue = asset; } if (showCopy && GUILayout.Button(Styles.cloneButton, EditorStyles.miniButtonRight, GUILayout.Width(buttonWidth))) { // Duplicate the currently assigned profile and save it as a new profile var origin = m_LensFlareData.objectReferenceValue; var path = AssetDatabase.GetAssetPath(m_LensFlareData.objectReferenceValue); path = CoreEditorUtils.IsAssetInReadOnlyPackage(path) // We may be in a read only package, in that case we need to clone the volume profile in an // editable area, such as the root of the project. ? AssetDatabase.GenerateUniqueAssetPath(Path.Combine("Assets", Path.GetFileName(path))) // Otherwise, duplicate next to original asset. : AssetDatabase.GenerateUniqueAssetPath(path); var asset = Instantiate(origin); AssetDatabase.CreateAsset(asset, path); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); m_LensFlareData.objectReferenceValue = asset; } } EditorGUILayout.PropertyField(m_Intensity, Styles.intensity); EditorGUILayout.PropertyField(m_Scale, Styles.scale); if (!lightIsDirLight) { if (attachedToLight) { EditorGUILayout.PropertyField(m_AttenuationByLightShape, Styles.attenuationByLightShape); } EditorGUILayout.PropertyField(m_MaxAttenuationDistance, Styles.maxAttenuationDistance); ++EditorGUI.indentLevel; EditorGUILayout.PropertyField(m_DistanceAttenuationCurve, Styles.distanceAttenuationCurve); --EditorGUI.indentLevel; EditorGUILayout.PropertyField(m_MaxAttenuationScale, Styles.maxAttenuationScale); ++EditorGUI.indentLevel; EditorGUILayout.PropertyField(m_ScaleByDistanceCurve, Styles.scaleByDistanceCurve); --EditorGUI.indentLevel; } EditorGUILayout.PropertyField(m_RadialScreenAttenuationCurve, Styles.radialScreenAttenuationCurve); } EditorGUILayout.LabelField(Styles.occlusionData.text, EditorStyles.boldLabel); EditorGUILayout.PropertyField(m_UseOcclusion, Styles.enableOcclusion); if (m_UseOcclusion.boolValue) { EditorGUILayout.PropertyField(m_OcclusionRadius, Styles.occlusionRadius); ++EditorGUI.indentLevel; EditorGUILayout.PropertyField(m_SamplesCount, Styles.sampleCount); --EditorGUI.indentLevel; EditorGUILayout.PropertyField(m_OcclusionOffset, Styles.occlusionOffset); } EditorGUILayout.PropertyField(m_AllowOffScreen, Styles.allowOffScreen); if (EditorGUI.EndChangeCheck()) { m_LensFlareData.serializedObject.ApplyModifiedProperties(); } }