コード例 #1
0
            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();
            }
コード例 #2
0
        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();
        }
コード例 #3
0
        // 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();
        }
コード例 #4
0
        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();
            }
        }
コード例 #5
0
        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;
            }
        }