public override void OnGUI(Rect rect) { GUILayout.BeginVertical(); { GUILayout.Label(styles.sEnvironment, EditorStyles.miniLabel); EditorGUI.BeginChangeCheck(); float angleOffset = EditorGUILayout.Slider(styles.sAngleOffset, m_CubemapInfo.angleOffset % 360.0f, -360.0f, 360.0f); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_LookDevView.envLibrary, "Changed environment settings"); m_CubemapInfo.angleOffset = angleOffset; m_LookDevView.envLibrary.dirty = true; m_LookDevView.Repaint(); } if (GUILayout.Button(styles.sResetEnv, EditorStyles.toolbarButton)) { Undo.RecordObject(m_LookDevView.envLibrary, "Changed environment settings"); m_CubemapInfo.ResetEnvInfos(); m_LookDevView.envLibrary.dirty = true; m_LookDevView.Repaint(); } using (new EditorGUI.DisabledScope(!m_LookDevView.config.enableShadowCubemap)) { DrawSeparator(); GUILayout.Label(styles.sShadows, EditorStyles.miniLabel); EditorGUI.BeginChangeCheck(); float shadowIntensity = EditorGUILayout.Slider(styles.sShadowIntensity, m_CubemapInfo.shadowInfo.shadowIntensity, 0.0f, 5.0f); Color shadowColor = EditorGUILayout.ColorField(styles.sShadowColor, m_CubemapInfo.shadowInfo.shadowColor); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_LookDevView.envLibrary, "Changed shadow settings"); m_CubemapInfo.shadowInfo.shadowIntensity = shadowIntensity; m_CubemapInfo.shadowInfo.shadowColor = shadowColor; m_LookDevView.envLibrary.dirty = true; m_LookDevView.Repaint(); } if (GUILayout.Button(styles.sBrightest, EditorStyles.toolbarButton)) { Undo.RecordObject(m_LookDevView.envLibrary, "Changed shadow settings"); LookDevResources.UpdateShadowInfoWithBrightestSpot(m_CubemapInfo); m_LookDevView.envLibrary.dirty = true; m_LookDevView.Repaint(); } if (GUILayout.Button(styles.sResetShadow, EditorStyles.toolbarButton)) { Undo.RecordObject(m_LookDevView.envLibrary, "Changed shadow settings"); m_CubemapInfo.SetCubemapShadowInfo(m_CubemapInfo); m_LookDevView.envLibrary.dirty = true; m_LookDevView.Repaint(); } } } GUILayout.EndVertical(); }
public void UpdateFloatProperty(LookDevProperty property, float value, bool recordUndo, bool forceLinked) { if (recordUndo) { Undo.RecordObject(this, "Update Float property for " + property + " with value " + value); } lookDevContexts[m_CurrentEditionContextIndex].UpdateProperty(property, value); if (m_LookDevProperties[(int)property].linked || forceLinked) { lookDevContexts[(m_CurrentEditionContextIndex + 1) % 2].UpdateProperty(property, value); } m_LookDevView.Repaint(); }
// If insertionIndex is -1 it mean we insert at the end of the list public void InsertHDRI(Cubemap cubemap, int insertionIndex) { Undo.RecordObject(m_LookDevView.envLibrary, "Insert HDRI"); Undo.RecordObject(m_LookDevView.config, "Insert HDRI"); // Handle cubemap index remapping for both context. Simply do it brute force in all cases. // Save the cubemap info before any modification to m_HDRIList. // Also if we are inserting m_DefaultHDRI, it mean we have an empty m_HDRIList Cubemap cubemap0 = null; Cubemap cubemap1 = null; if (cubemap == LookDevResources.m_DefaultHDRI) { cubemap0 = LookDevResources.m_DefaultHDRI; cubemap1 = LookDevResources.m_DefaultHDRI; } else { cubemap0 = m_HDRIList[m_LookDevView.config.lookDevContexts[0].currentHDRIIndex].cubemap; cubemap1 = m_HDRIList[m_LookDevView.config.lookDevContexts[1].currentHDRIIndex].cubemap; } // Check if the cubemap already exist int iIndex = m_HDRIList.FindIndex(x => x.cubemap == cubemap); // Create cubemap if it doesn't exist if (iIndex == -1) { m_Dirty = true; CubemapInfo newInfo = null; // Check if the cubemap exist but as a shadow cubemap only // in this case we don't recreate the CubemapInfo, but we still insert it as a new one. for (int i = 0; i < m_HDRIList.Count; ++i) { if (m_HDRIList[i].cubemapShadowInfo.cubemap == cubemap) { newInfo = m_HDRIList[i].cubemapShadowInfo; // Prevent recursion with shadow cubemap info newInfo.SetCubemapShadowInfo(newInfo); break; } } if (newInfo == null) { newInfo = new CubemapInfo(); newInfo.cubemap = cubemap; newInfo.ambientProbe.Clear(); newInfo.alreadyComputed = false; newInfo.SetCubemapShadowInfo(newInfo); // By default we use the same cubemap for the version without sun. } int newCubemapIndex = m_HDRIList.Count; // Add the cubemap to the specified location or last if no location provide m_HDRIList.Insert(insertionIndex == -1 ? newCubemapIndex : insertionIndex, newInfo); // When inserting the default HDRI the first time, the lookdev env is not yet ready. // But as we default the latlong light position of ShadowInfo to brightest location of default HDRI this is not a problem to not call the function. if (newInfo.cubemap != LookDevResources.m_DefaultHDRI) { LookDevResources.UpdateShadowInfoWithBrightestSpot(newInfo); } } // If we haven't inserted at end of the list, if it is not a new cubemap and if we do not insert at the same place, we need to shift current cubemap position in the list if (iIndex != insertionIndex && iIndex != -1 && insertionIndex != -1) { // Get cubemap info before modifying m_LookDevSetup.m_HDRIList; CubemapInfo infos = m_HDRIList[iIndex]; m_HDRIList.RemoveAt(iIndex); // If we insert after the removed cubemap we need to increase the index m_HDRIList.Insert(iIndex > insertionIndex ? insertionIndex : insertionIndex - 1, infos); } m_LookDevView.config.lookDevContexts[0].UpdateProperty(LookDevProperty.HDRI, m_HDRIList.FindIndex(x => x.cubemap == cubemap0)); m_LookDevView.config.lookDevContexts[1].UpdateProperty(LookDevProperty.HDRI, m_HDRIList.FindIndex(x => x.cubemap == cubemap1)); m_LookDevView.Repaint(); }
public override void OnGUI(Rect rect) { if (m_LookDevView == null) { return; } GUILayout.BeginVertical(); { // We need to have a sufficient size to display negative float number EditorGUIUtility.labelWidth = 130; EditorGUIUtility.fieldWidth = 35; // Look Dev view mode DrawHeader(styles.sMultiView); for (int i = 0; i < (int)LookDevMode.Count; ++i) { EditorGUI.BeginChangeCheck(); bool value = GUILayout.Toggle(m_LookDevView.config.lookDevMode == (LookDevMode)i, styles.sMultiViewMode[i], styles.sMenuItem); if (EditorGUI.EndChangeCheck()) { m_LookDevView.UpdateLookDevModeToggle((LookDevMode)i, value); m_LookDevView.Repaint(); GUIUtility.ExitGUI(); } } // Camera settings DrawSeparator(); DrawHeader(styles.sCamera); if (GUILayout.Button(styles.sResetCamera, styles.sMenuItem)) { m_LookDevView.Frame(); } m_LookDevView.config.enableToneMap = GUILayout.Toggle(m_LookDevView.config.enableToneMap, styles.sEnableToneMap, styles.sMenuItem); EditorGUI.BeginChangeCheck(); // Cast to int to have integer step float newExposureRange = (float)EditorGUILayout.IntSlider(styles.sExposureRange, (int)m_LookDevView.config.exposureRange, 1, 32); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_LookDevView.config, "Change exposure range"); m_LookDevView.config.exposureRange = newExposureRange; } DrawSeparator(); DrawHeader(styles.sLighting); EditorGUI.BeginChangeCheck(); GUILayout.BeginHorizontal(); m_LookDevView.config.enableShadowCubemap = GUILayout.Toggle(m_LookDevView.config.enableShadowCubemap, styles.sEnableShadows, styles.sMenuItem); GUILayout.EndHorizontal(); if (EditorGUI.EndChangeCheck()) { m_LookDevView.Repaint(); } EditorGUI.BeginChangeCheck(); float newShadowDistance = EditorGUILayout.Slider(styles.sShadowDistance, m_LookDevView.config.shadowDistance, 0.0f, 1000.0f); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_LookDevView.config, "Change shadow distance"); m_LookDevView.config.shadowDistance = newShadowDistance; } DrawSeparator(); DrawHeader(styles.sAnimation); GUILayout.BeginHorizontal(); m_LookDevView.config.rotateObjectMode = GUILayout.Toggle(m_LookDevView.config.rotateObjectMode, styles.sRotateObjectMode, styles.sMenuItem); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); m_LookDevView.config.rotateEnvMode = GUILayout.Toggle(m_LookDevView.config.rotateEnvMode, styles.sRotateEnvMode, styles.sMenuItem); GUILayout.EndHorizontal(); EditorGUI.BeginChangeCheck(); float newObjRotationSpeed = EditorGUILayout.Slider(styles.sObjRotationSpeed, m_LookDevView.config.objRotationSpeed, -5.0f, 5.0f); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_LookDevView.config, "Change rotation speed"); m_LookDevView.config.objRotationSpeed = newObjRotationSpeed; } EditorGUI.BeginChangeCheck(); float newEnvRotationSpeed = EditorGUILayout.Slider(styles.sEnvRotationSpeed, m_LookDevView.config.envRotationSpeed, -5.0f, 5.0f); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_LookDevView.config, "Change env speed"); m_LookDevView.config.envRotationSpeed = newEnvRotationSpeed; } DrawSeparator(); DrawHeader(styles.sViewport); if (GUILayout.Button(styles.sResetView, styles.sMenuItem)) { m_LookDevView.ResetView(); } DrawSeparator(); DrawHeader(styles.sEnvLibrary); using (new EditorGUI.DisabledScope(!m_LookDevView.envLibrary.dirty)) { if (GUILayout.Button(styles.sSaveCurrentLibrary, styles.sMenuItem)) { editorWindow.Close(); if (m_LookDevView.SaveLookDevLibrary()) { m_LookDevView.envLibrary.dirty = false; } GUIUtility.ExitGUI(); } } if (GUILayout.Button(styles.sCreateNewLibrary, styles.sMenuItem)) { editorWindow.Close(); string assetPath = EditorUtility.SaveFilePanelInProject("Save New Environment Library", "New Env Library", "asset", ""); if (!string.IsNullOrEmpty(assetPath)) { m_LookDevView.CreateNewLibrary(assetPath); } GUIUtility.ExitGUI(); } EditorGUI.BeginChangeCheck(); LookDevEnvironmentLibrary library = EditorGUILayout.ObjectField(m_LookDevView.userEnvLibrary, typeof(LookDevEnvironmentLibrary), false) as LookDevEnvironmentLibrary; if (EditorGUI.EndChangeCheck()) { m_LookDevView.envLibrary = library; } DrawSeparator(); DrawHeader(styles.sMisc); m_LookDevView.config.showBalls = GUILayout.Toggle(m_LookDevView.config.showBalls, styles.sShowBalls, styles.sMenuItem); m_LookDevView.config.showControlWindows = GUILayout.Toggle(m_LookDevView.config.showControlWindows, styles.sShowControlWindows, styles.sMenuItem); EditorGUI.BeginChangeCheck(); bool allowDifferentObjects = GUILayout.Toggle(m_LookDevView.config.allowDifferentObjects, styles.sAllowDifferentObjects, styles.sMenuItem); if (EditorGUI.EndChangeCheck()) { m_LookDevView.config.allowDifferentObjects = allowDifferentObjects; } if (GUILayout.Button(styles.sResyncObjects, styles.sMenuItem)) { m_LookDevView.config.ResynchronizeObjects(); } } GUILayout.EndVertical(); // Use mouse move so we get hover state correctly in the menu item rows if (Event.current.type == EventType.MouseMove) { Event.current.Use(); } // Escape closes the window if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Escape) { editorWindow.Close(); GUIUtility.ExitGUI(); } }
private void HandleMouseInput() { List <CubemapInfo> cubemapList = m_LookDevView.envLibrary.hdriList; Vector2 scrollFixedPosition = new Vector2(Event.current.mousePosition.x, Event.current.mousePosition.y + m_ScrollPosition.y); Event evt = Event.current; switch (evt.GetTypeForControl(m_LookDevView.hotControl)) { // Update overlay position for next repaint event case EventType.MouseDrag: { if (m_SelectedCubeMapOffsetIndex != -1) { Undo.RecordObject(m_LookDevView.envLibrary, ""); CubemapInfo info = cubemapList[m_SelectedCubeMapOffsetIndex]; info.angleOffset = ComputeAngleOffsetFromMouseCoord(scrollFixedPosition) + m_SelectedCubeMapOffsetValue; m_LookDevView.envLibrary.dirty = true; Event.current.Use(); } if (m_SelectedCubemapInfo != null) { if (IsPositionInInsertionArea(scrollFixedPosition) == -1) { m_HoveringCubeMapIndex = IsPositionInThumbnailArea(scrollFixedPosition); } else { m_HoveringCubeMapIndex = -1; } } m_LookDevView.Repaint(); break; } // Handles environment drop case EventType.MouseUp: { if (m_SelectedCubemap != null) { // The rect needs to include an extra slot when moving to last position Rect extendedGUIRect = m_GUIRect; extendedGUIRect.yMax += EditorGUI.kSingleLineHeight; if (extendedGUIRect.Contains(Event.current.mousePosition)) { int insertionRectIndex = IsPositionInInsertionArea(scrollFixedPosition); if (insertionRectIndex != -1) { // Must be called before we do any modification to HDRI list ResetShadowCubemap(); m_LookDevView.envLibrary.InsertHDRI(m_SelectedCubemap, insertionRectIndex); } else { int thumbnailRectIndex = IsPositionInThumbnailArea(scrollFixedPosition); if (thumbnailRectIndex != -1 && m_LookDevView.config.enableShadowCubemap) { Undo.RecordObject(m_LookDevView.envLibrary, "Update shadow cubemap"); CubemapInfo cubemapInfo = m_LookDevView.envLibrary.hdriList[thumbnailRectIndex]; // We don't want the user to drop a cubemap on itself and reset the shadows (it would happen all the time by mistake) if (cubemapInfo != m_SelectedCubemapInfo) { cubemapInfo.SetCubemapShadowInfo(m_SelectedCubemapInfo); } m_LookDevView.envLibrary.dirty = true; } } CancelSelection(); } } m_LookDevView.Repaint(); if (m_SelectedCubeMapOffsetIndex != -1) { // Fall back to zero when near the center if (Mathf.Abs(cubemapList[m_SelectedCubeMapOffsetIndex].angleOffset) <= 10.0f) { Undo.RecordObject(m_LookDevView.envLibrary, ""); cubemapList[m_SelectedCubeMapOffsetIndex].angleOffset = 0.0f; m_LookDevView.envLibrary.dirty = true; } } m_SelectedCubemapInfo = null; m_SelectedShadowCubemapOwnerInfo = null; m_SelectedLightIconIndex = -1; m_SelectedShadowInfo = null; m_SelectedCubeMapOffsetIndex = -1; m_HoveringCubeMapIndex = -1; m_SelectedCubeMapOffsetValue = 0.0f; GUIUtility.hotControl = 0; break; } // Escape closes the window case EventType.KeyDown: { if (Event.current.keyCode == KeyCode.Escape) { CancelSelection(); m_LookDevView.Repaint(); } break; } case EventType.DragPerform: { int insertionIndex = IsPositionInInsertionArea(scrollFixedPosition); foreach (UnityEngine.Object o in DragAndDrop.objectReferences) { Cubemap cubemap = o as Cubemap; if (cubemap) { // When insertion outside the list the index is -1 which mean in InsertHDRI that it will be add at the end m_LookDevView.envLibrary.InsertHDRI(cubemap, insertionIndex); } } DragAndDrop.AcceptDrag(); m_DragBeingPerformed = false; evt.Use(); break; } case EventType.DragUpdated: { bool hasCubemap = false; foreach (UnityEngine.Object o in DragAndDrop.objectReferences) { Cubemap cubemap = o as Cubemap; if (cubemap) { hasCubemap = true; } } DragAndDrop.visualMode = hasCubemap ? DragAndDropVisualMode.Link : DragAndDropVisualMode.Rejected; if (hasCubemap) { m_DragBeingPerformed = true; } evt.Use(); } break; case EventType.DragExited: break; case EventType.Repaint: if (m_SelectedCubeMapOffsetIndex != -1) { EditorGUIUtility.AddCursorRect(m_displayRect, MouseCursor.SlideArrow); } break; } }