public override void OnInspectorGUI()
        {
            PropertyField(m_MaxShadowDistance, EditorGUIUtility.TrTextContent("Max Distance"));
            Rect firstLine = GUILayoutUtility.GetLastRect();

            EditorGUILayout.Space();
            PropertyField(m_CascadeShadowSplitCount, EditorGUIUtility.TrTextContent("Cascade Count"));

            if (!m_CascadeShadowSplitCount.value.hasMultipleDifferentValues)
            {
                EditorGUI.indentLevel++;
                int cascadeCount = m_CascadeShadowSplitCount.value.intValue;
                for (int i = 0; i < cascadeCount - 1; i++)
                {
                    PropertyField(m_CascadeShadowSplits[i], EditorGUIUtility.TrTextContent(string.Format("Split {0}", i + 1)));
                }

                if (LightLoop.s_UseCascadeBorders)
                {
                    EditorGUILayout.Space();

                    for (int i = 0; i < cascadeCount; i++)
                    {
                        PropertyField(m_CascadeShadowBorders[i], EditorGUIUtility.TrTextContent(string.Format("Border {0}", i + 1)));
                    }
                }

                EditorGUILayout.Space();

                GUILayout.Label("Cascade splits");
                Rect rect = GUILayoutUtility.GetLastRect();
                rect.x    += rect.width - 100;
                rect.width = 60f;
                EditorGUI.LabelField(rect, EditorGUIUtility.TrTextContent("Unit"));
                rect.x    += 25;
                rect.width = 75;
                s_Unit     = (Unit)EditorGUI.EnumPopup(rect, s_Unit);
                ShadowCascadeGUI.DrawCascadeSplitGUI(m_CascadeShadowSplits, LightLoop.s_UseCascadeBorders ? m_CascadeShadowBorders : null, (uint)cascadeCount, blendLastCascade: true, useMetric: s_Unit == Unit.Metric, baseMetric: m_MaxShadowDistance.value.floatValue);
                EditorGUI.indentLevel--;
            }

            HDRenderPipeline hdrp = UnityEngine.Rendering.RenderPipelineManager.currentPipeline as HDRenderPipeline;

            if (hdrp == null)
            {
                return;
            }

            firstLine.y      -= EditorGUIUtility.singleLineHeight;
            firstLine.height -= 2;
            firstLine.x      += EditorGUIUtility.labelWidth + 20;
            firstLine.width  -= EditorGUIUtility.labelWidth + 20;
            bool currentCascadeValue = hdrp.showCascade;
            bool newCascadeValue     = GUI.Toggle(firstLine, currentCascadeValue, EditorGUIUtility.TrTextContent("Visualize Cascades"), EditorStyles.miniButton);

            if (currentCascadeValue ^ newCascadeValue)
            {
                hdrp.showCascade = newCascadeValue;
            }
        }
Esempio n. 2
0
        private void DrawShadowCascades(int cascadeCount, bool useMetric, float baseMetric)
        {
            var cascades = new ShadowCascadeGUI.Cascade[cascadeCount];

            float lastCascadePartitionSplit = 0;

            for (int i = 0; i < cascadeCount - 1; ++i)
            {
                cascades[i] = new ShadowCascadeGUI.Cascade()
                {
                    size               = i == 0 ? m_CascadeShadowSplits[i].value.floatValue : m_CascadeShadowSplits[i].value.floatValue - lastCascadePartitionSplit, // Calculate the size of cascade
                    borderSize         = m_CascadeShadowBorders[i].value.floatValue,
                    cascadeHandleState = m_CascadeShadowSplits[i].overrideState.boolValue ? ShadowCascadeGUI.HandleState.Enabled : ShadowCascadeGUI.HandleState.Disabled,
                    borderHandleState  = m_CascadeShadowBorders[i].overrideState.boolValue ? ShadowCascadeGUI.HandleState.Enabled : ShadowCascadeGUI.HandleState.Disabled,
                };
                lastCascadePartitionSplit = m_CascadeShadowSplits[i].value.floatValue;
            }

            // Last cascade is special
            var lastCascade = cascadeCount - 1;

            cascades[lastCascade] = new ShadowCascadeGUI.Cascade()
            {
                size               = lastCascade == 0 ? 1.0f : 1 - m_CascadeShadowSplits[lastCascade - 1].value.floatValue, // Calculate the size of cascade
                borderSize         = m_CascadeShadowBorders[lastCascade].value.floatValue,
                cascadeHandleState = ShadowCascadeGUI.HandleState.Hidden,
                borderHandleState  = m_CascadeShadowBorders[lastCascade].overrideState.boolValue ? ShadowCascadeGUI.HandleState.Enabled : ShadowCascadeGUI.HandleState.Disabled,
            };

            EditorGUI.BeginChangeCheck();
            ShadowCascadeGUI.DrawCascades(ref cascades, useMetric, baseMetric);
            if (EditorGUI.EndChangeCheck())
            {
                float lastCascadeSize = 0;
                for (int i = 0; i < cascadeCount - 1; ++i)
                {
                    m_CascadeShadowSplits[i].value.floatValue = lastCascadeSize + cascades[i].size;
                    lastCascadeSize = m_CascadeShadowSplits[i].value.floatValue;
                }

                for (int i = 0; i < cascadeCount; ++i)
                {
                    m_CascadeShadowBorders[i].value.floatValue = cascades[i].borderSize;
                }
            }
        }
        public override void OnInspectorGUI()
        {
            PropertyField(m_MaxShadowDistance, EditorGUIUtility.TrTextContent("Max Distance", "In Meter"));
            Rect firstLine = GUILayoutUtility.GetLastRect();

            EditorGUILayout.Space();

            EditorGUILayout.LabelField("Directional Light");

            Rect shiftedRect = EditorGUILayout.GetControlRect();

            shiftedRect.x     += 20;
            shiftedRect.width -= 20;
            EditorGUI.BeginChangeCheck();
            Unit unit = (Unit)EditorGUI.EnumPopup(shiftedRect, EditorGUIUtility.TrTextContent("Working Unit", "Except Max Distance which will be still in meter"), m_State.value);

            if (EditorGUI.EndChangeCheck())
            {
                m_State.value = unit;
                (serializedObject.targetObject as HDShadowSettings).InitNormalized(m_State.value == Unit.Percent);
            }

            PropertyField(m_DirectionalTransmissionMultiplier, EditorGUIUtility.TrTextContent("Transmission  Multiplier"));

            EditorGUI.BeginChangeCheck();
            PropertyField(m_CascadeShadowSplitCount, EditorGUIUtility.TrTextContent("Cascade Count"));
            if (EditorGUI.EndChangeCheck())
            {
                //fix newly activated cascade split not respecting ordering
                for (int i = 1; i < m_CascadeShadowSplitCount.value.intValue - 1; i++)
                {
                    if (m_CascadeShadowSplits[i - 1].value.floatValue > m_CascadeShadowSplits[i].value.floatValue)
                    {
                        m_CascadeShadowSplits[i].value.floatValue = m_CascadeShadowSplits[i - 1].value.floatValue;
                    }
                }
            }

            if (!m_CascadeShadowSplitCount.value.hasMultipleDifferentValues)
            {
                EditorGUI.indentLevel++;
                int cascadeCount = m_CascadeShadowSplitCount.value.intValue;
                for (int i = 0; i < cascadeCount - 1; i++)
                {
                    PropertyField(m_CascadeShadowSplits[i], EditorGUIUtility.TrTextContent(string.Format("Split {0}", i + 1)));
                }

                if (HDRenderPipeline.s_UseCascadeBorders)
                {
                    EditorGUILayout.Space();

                    for (int i = 0; i < cascadeCount; i++)
                    {
                        PropertyField(m_CascadeShadowBorders[i], EditorGUIUtility.TrTextContent(string.Format("Border {0}", i + 1)));
                    }
                }

                EditorGUILayout.Space();

                GUILayout.Label("Cascade splits");
                ShadowCascadeGUI.DrawCascadeSplitGUI(m_CascadeShadowSplits, HDRenderPipeline.s_UseCascadeBorders ? m_CascadeShadowBorders : null, (uint)cascadeCount, blendLastCascade: true, useMetric: unit == Unit.Metric, baseMetric: m_MaxShadowDistance.value.floatValue);
                EditorGUI.indentLevel--;
            }

            HDRenderPipeline hdrp = UnityEngine.Rendering.RenderPipelineManager.currentPipeline as HDRenderPipeline;

            if (hdrp == null)
            {
                return;
            }

            Rect visualizeCascade = firstLine;

            visualizeCascade.y      -= (EditorGUIUtility.singleLineHeight - 2);
            visualizeCascade.height -= 2;
            visualizeCascade.x      += EditorGUIUtility.labelWidth + 20;
            visualizeCascade.width  -= EditorGUIUtility.labelWidth + 20;
            bool currentCascadeValue = hdrp.showCascade;
            bool newCascadeValue     = GUI.Toggle(visualizeCascade, currentCascadeValue, EditorGUIUtility.TrTextContent("Visualize Cascades"), EditorStyles.miniButton);

            if (currentCascadeValue ^ newCascadeValue)
            {
                hdrp.showCascade = newCascadeValue;
            }
        }
        private void DrawCascades(int cascadeCount, bool useMetric, float baseMetric)
        {
            var cascades = new ShadowCascadeGUI.Cascade[cascadeCount];

            Vector3 shadowCascadeSplit = Vector3.zero;

            if (cascadeCount == 4)
            {
                shadowCascadeSplit = m_ShadowCascade4SplitProp.vector3Value;
            }
            else if (cascadeCount == 3)
            {
                shadowCascadeSplit = m_ShadowCascade3SplitProp.vector2Value;
            }
            else if (cascadeCount == 2)
            {
                shadowCascadeSplit.x = m_ShadowCascade2SplitProp.floatValue;
            }
            else
            {
                shadowCascadeSplit.x = m_ShadowCascade2SplitProp.floatValue;
            }

            float lastCascadePartitionSplit = 0;

            for (int i = 0; i < cascadeCount - 1; ++i)
            {
                cascades[i] = new ShadowCascadeGUI.Cascade()
                {
                    size               = i == 0 ? shadowCascadeSplit[i] : shadowCascadeSplit[i] - lastCascadePartitionSplit, // Calculate the size of cascade
                    borderSize         = 0,
                    cascadeHandleState = ShadowCascadeGUI.HandleState.Enabled,
                    borderHandleState  = ShadowCascadeGUI.HandleState.Hidden,
                };
                lastCascadePartitionSplit = shadowCascadeSplit[i];
            }

            // Last cascade is special
            var lastCascade = cascadeCount - 1;

            cascades[lastCascade] = new ShadowCascadeGUI.Cascade()
            {
                size               = lastCascade == 0 ? 1.0f : 1 - shadowCascadeSplit[lastCascade - 1], // Calculate the size of cascade
                borderSize         = m_ShadowCascadeBorderProp.floatValue,
                cascadeHandleState = ShadowCascadeGUI.HandleState.Hidden,
                borderHandleState  = ShadowCascadeGUI.HandleState.Enabled,
            };

            EditorGUI.BeginChangeCheck();
            ShadowCascadeGUI.DrawCascades(ref cascades, useMetric, baseMetric);
            if (EditorGUI.EndChangeCheck())
            {
                if (cascadeCount == 4)
                {
                    m_ShadowCascade4SplitProp.vector3Value = new Vector3(
                        cascades[0].size,
                        cascades[0].size + cascades[1].size,
                        cascades[0].size + cascades[1].size + cascades[2].size
                        );
                }
                else if (cascadeCount == 3)
                {
                    m_ShadowCascade3SplitProp.vector2Value = new Vector2(
                        cascades[0].size,
                        cascades[0].size + cascades[1].size
                        );
                }
                else if (cascadeCount == 2)
                {
                    m_ShadowCascade2SplitProp.floatValue = cascades[0].size;
                }

                m_ShadowCascadeBorderProp.floatValue = cascades[lastCascade].borderSize;
            }
        }