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; } }
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; } }