Exemple #1
0
 protected override void OnEnable()
 {
     m_AdditionalLightData = lightProperty.gameObject.GetComponent <UniversalAdditionalLightData>();
     settings.OnEnable();
     init(m_AdditionalLightData);
     UpdateShowOptions(true);
 }
Exemple #2
0
        void init(UniversalAdditionalLightData additionalLightData)
        {
            if (additionalLightData == null)
            {
                return;
            }
            m_AdditionalLightDataSO = new SerializedObject(additionalLightData);
            m_UseAdditionalDataProp = m_AdditionalLightDataSO.FindProperty("m_UsePipelineSettings");

            settings.ApplyModifiedProperties();
        }
Exemple #3
0
        /// <summary>
        /// Gets or creates UP Light data
        /// </summary>
        /// <param name="light"></param>
        /// <returns></returns>
        public static UniversalAdditionalLightData GetUPLightData(Light light)
        {
            if (light == null)
            {
                return(null);
            }

            UniversalAdditionalLightData lightData = light.GetComponent <UniversalAdditionalLightData>();

            if (lightData == null)
            {
                lightData = light.gameObject.AddComponent <UniversalAdditionalLightData>();
            }

            return(lightData);
        }
Exemple #4
0
        static internal UniversalAdditionalLightData GetAdditionalLightData(Light light)
        {
            UniversalAdditionalLightData add = null;

            // Light reference can be null for particle lights.
            if (light != null)
            {
                light.TryGetComponent <UniversalAdditionalLightData>(out add);
            }

            // Light should always have additional data, however preview light right don't have, so we must handle the case by assigning HDUtils.s_DefaultHDAdditionalLightData
            if (add == null)
            {
                add = s_DefaultAdditionalLightData;
            }

            return(add);
        }
        void MultipleAdditionalLightDataCheck()
        {
            var additionalLightList = new List <Object>();

            foreach (var lightTarget in targets)
            {
                var additionData = (lightTarget as Component).gameObject.GetComponent <UniversalAdditionalLightData>();
                if (additionData == null)
                {
                    additionData = (lightTarget as Component).gameObject.AddComponent <UniversalAdditionalLightData>();
                }

                additionalLightList.Add(additionData);
            }
            m_AdditionalLightData = (target as Component).gameObject.GetComponent <UniversalAdditionalLightData>();

            init(additionalLightList);
        }
Exemple #6
0
        void InitializeLightConstants(NativeArray <VisibleLight> lights, int lightIndex, out Vector4 lightPos, out Vector4 lightColor, out Vector4 lightAttenuation, out Vector4 lightSpotDir, out Vector4 lightOcclusionProbeChannel, out uint lightLayerMask)
        {
            UniversalRenderPipeline.InitializeLightConstants_Common(lights, lightIndex, out lightPos, out lightColor, out lightAttenuation, out lightSpotDir, out lightOcclusionProbeChannel);
            lightLayerMask = 0;

            // When no lights are visible, main light will be set to -1.
            // In this case we initialize it to default values and return
            if (lightIndex < 0)
            {
                return;
            }

            VisibleLight lightData = lights[lightIndex];
            Light        light     = lightData.light;

            if (light == null)
            {
                return;
            }

            if (light.bakingOutput.lightmapBakeType == LightmapBakeType.Mixed &&
                lightData.light.shadows != LightShadows.None &&
                m_MixedLightingSetup == MixedLightingSetup.None)
            {
                switch (light.bakingOutput.mixedLightingMode)
                {
                case MixedLightingMode.Subtractive:
                    m_MixedLightingSetup = MixedLightingSetup.Subtractive;
                    break;

                case MixedLightingMode.Shadowmask:
                    m_MixedLightingSetup = MixedLightingSetup.ShadowMask;
                    break;
                }
            }

            UniversalAdditionalLightData additionalLightData = GetAdditionalLightData(light);

            lightLayerMask = (uint)additionalLightData.lightLayerMask;
        }
Exemple #7
0
        void DrawAdditionalShadowData()
        {
            bool hasChanged = false;
            int  selectedUseAdditionalData;

            if (m_AdditionalLightDataSO == null)
            {
                selectedUseAdditionalData = 1;
            }
            else
            {
                m_AdditionalLightDataSO.Update();
                selectedUseAdditionalData = !m_AdditionalLightData.usePipelineSettings ? 0 : 1;
            }

            Rect controlRectAdditionalData = EditorGUILayout.GetControlRect(true);

            if (m_AdditionalLightDataSO != null)
            {
                EditorGUI.BeginProperty(controlRectAdditionalData, Styles.shadowBias, m_UseAdditionalDataProp);
            }
            EditorGUI.BeginChangeCheck();

            selectedUseAdditionalData = EditorGUI.IntPopup(controlRectAdditionalData, Styles.shadowBias, selectedUseAdditionalData, Styles.displayedDefaultOptions, Styles.optionDefaultValues);
            if (EditorGUI.EndChangeCheck())
            {
                hasChanged = true;
            }
            if (m_AdditionalLightDataSO != null)
            {
                EditorGUI.EndProperty();
            }

            if (selectedUseAdditionalData != 1 && m_AdditionalLightDataSO != null)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.Slider(settings.shadowsBias, 0f, 10f, "Depth");
                EditorGUILayout.Slider(settings.shadowsNormalBias, 0f, 10f, "Normal");
                EditorGUI.indentLevel--;

                m_AdditionalLightDataSO.ApplyModifiedProperties();
            }

            if (hasChanged)
            {
                if (m_AdditionalLightDataSO == null)
                {
                    lightProperty.gameObject.AddComponent <UniversalAdditionalLightData>();
                    m_AdditionalLightData = lightProperty.gameObject.GetComponent <UniversalAdditionalLightData>();

                    UniversalRenderPipelineAsset asset = GraphicsSettings.renderPipelineAsset as UniversalRenderPipelineAsset;
                    settings.shadowsBias.floatValue       = asset.shadowDepthBias;
                    settings.shadowsNormalBias.floatValue = asset.shadowNormalBias;

                    init(m_AdditionalLightData);
                }

                m_UseAdditionalDataProp.intValue = selectedUseAdditionalData;
                m_AdditionalLightDataSO.ApplyModifiedProperties();
            }
        }
Exemple #8
0
        void DrawShadowsResolutionGUI()
        {
            int shadowResolutionTier;

            if (m_AdditionalLightDataSO == null)
            {
                shadowResolutionTier = UniversalAdditionalLightData.AdditionalLightsShadowDefaultResolutionTier;
            }
            else
            {
                m_AdditionalLightDataSO.Update();
                shadowResolutionTier = m_AdditionalLightData.additionalLightsShadowResolutionTier;
            }

            Rect controlRectAdditionalData = EditorGUILayout.GetControlRect(true);

            if (m_AdditionalLightDataSO != null)
            {
                EditorGUI.BeginProperty(controlRectAdditionalData, Styles.ShadowResolution, m_AdditionalLightsShadowResolutionTierProp);
            }

            EditorGUI.BeginChangeCheck();

            // UI code adapted from HDRP LevelFieldGUI in com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/SerializedScalableSettingValue.cs
            const int k_IndentPerLevel     = 15;
            const int k_PrefixPaddingRight = 2;
            const int k_ValueUnitSeparator = 2;
            const int k_EnumWidth          = 70;
            float     indent = k_IndentPerLevel * EditorGUI.indentLevel;

            Rect labelRect = controlRectAdditionalData;
            Rect levelRect = controlRectAdditionalData;
            Rect fieldRect = controlRectAdditionalData;

            labelRect.width = EditorGUIUtility.labelWidth;
            // Dealing with indentation add space before the actual drawing
            // Thus resize accordingly to have a coherent aspect
            levelRect.x     += labelRect.width - indent + k_PrefixPaddingRight;
            levelRect.width  = k_EnumWidth + indent;
            fieldRect.x      = levelRect.x + levelRect.width + k_ValueUnitSeparator - indent;
            fieldRect.width -= fieldRect.x - controlRectAdditionalData.x;

            EditorGUI.LabelField(labelRect, Styles.ShadowResolution);

            shadowResolutionTier = EditorGUI.IntPopup(levelRect, GUIContent.none, shadowResolutionTier, Styles.ShadowResolutionDefaultOptions, Styles.ShadowResolutionDefaultValues);

            bool hasResolutionTierChanged = EditorGUI.EndChangeCheck();

            if (m_AdditionalLightDataSO != null)
            {
                EditorGUI.EndProperty();
            }

            // Same logic as in DrawAdditionalShadowData
            if (shadowResolutionTier == UniversalAdditionalLightData.AdditionalLightsShadowResolutionTierCustom && m_AdditionalLightDataSO != null)
            {
                // show the custom value field GUI.
                var newResolution = EditorGUI.IntField(fieldRect, settings.shadowsResolution.intValue);
                settings.shadowsResolution.intValue = Mathf.Max(UniversalAdditionalLightData.AdditionalLightsShadowMinimumResolution, Mathf.NextPowerOfTwo(newResolution));

                m_AdditionalLightDataSO.ApplyModifiedProperties();
            }
            if (shadowResolutionTier != UniversalAdditionalLightData.AdditionalLightsShadowResolutionTierCustom)
            {
                // show resolution tier values defined in pipeline settings
                UniversalRenderPipelineAsset urpAsset = GraphicsSettings.renderPipelineAsset as UniversalRenderPipelineAsset;
                EditorGUI.LabelField(fieldRect, $"{urpAsset.GetAdditionalLightsShadowResolution(shadowResolutionTier)} ({urpAsset.name})");
            }

            if (hasResolutionTierChanged)
            {
                if (m_AdditionalLightDataSO == null)
                {
                    lightProperty.gameObject.AddComponent <UniversalAdditionalLightData>();
                    m_AdditionalLightData = lightProperty.gameObject.GetComponent <UniversalAdditionalLightData>();

                    UniversalRenderPipelineAsset asset = GraphicsSettings.renderPipelineAsset as UniversalRenderPipelineAsset;
                    settings.shadowsBias.floatValue       = asset.shadowDepthBias;
                    settings.shadowsNormalBias.floatValue = asset.shadowNormalBias;
                    settings.shadowsResolution.intValue   = UniversalAdditionalLightData.AdditionalLightsShadowDefaultCustomResolution;

                    init(m_AdditionalLightData);
                }

                m_AdditionalLightsShadowResolutionTierProp.intValue = shadowResolutionTier;
                m_AdditionalLightDataSO.ApplyModifiedProperties();
            }
        }