Exemplo n.º 1
0
        public override void OnInspectorGUI()
        {
            ProbeVolume probeVolume = target as ProbeVolume;

            bool hasChanges = false;

            if (probeVolume.cachedTransform != probeVolume.gameObject.transform.worldToLocalMatrix)
            {
                hasChanges = true;
            }

            if (!probeVolume.cachedParameters.IsEquivalent(probeVolume.parameters))
            {
                hasChanges = true;
            }

            probeVolume.mightNeedRebaking = hasChanges;

            var renderPipelineAsset = GraphicsSettings.renderPipelineAsset;

            if (renderPipelineAsset != null && renderPipelineAsset.GetType().Name == "HDRenderPipelineAsset")
            {
                serializedObject.Update();

                ProbeVolumeUI.Inspector.Draw(m_SerializedProbeVolume, this);
            }
            else
            {
                EditorGUILayout.HelpBox("Probe Volume is not a supported feature by this SRP.", MessageType.Error, wide: true);
            }

            m_SerializedProbeVolume.Apply();
        }
Exemplo n.º 2
0
        protected void OnSceneGUI()
        {
            ProbeVolume probeVolume = target as ProbeVolume;

            //important: if the origin of the handle's space move along the handle,
            //handles displacement will appears as moving two time faster.
            using (new Handles.DrawingScope(Matrix4x4.TRS(Vector3.zero, probeVolume.transform.rotation, Vector3.one)))
            {
                //contained must be initialized in all case
                s_ShapeBox.center = Quaternion.Inverse(probeVolume.transform.rotation) * probeVolume.transform.position;
                s_ShapeBox.size   = probeVolume.parameters.size;

                s_ShapeBox.monoHandle = false;
                EditorGUI.BeginChangeCheck();
                s_ShapeBox.DrawHandle();
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObjects(new Object[] { probeVolume, probeVolume.transform }, "Change Probe Volume Bounding Box");

                    probeVolume.parameters.size = s_ShapeBox.size;

                    Vector3 delta = probeVolume.transform.rotation * s_ShapeBox.center - probeVolume.transform.position;
                    probeVolume.transform.position += delta;;
                }
            }
        }
Exemplo n.º 3
0
        static void DrawGizmosSelected(ProbeVolume probeVolume, GizmoType gizmoType)
        {
            using (new Handles.DrawingScope(Matrix4x4.TRS(probeVolume.transform.position, probeVolume.transform.rotation, Vector3.one)))
            {
                // Blend box
                if (!blendBoxes.TryGetValue(probeVolume, out HierarchicalBox blendBox))
                {
                    return;
                }
                blendBox.center = CenterBlendLocalPosition(probeVolume);
                blendBox.size   = BlendSize(probeVolume);
                Color baseColor = probeVolume.parameters.debugColor;
                baseColor.a        = 8 / 255f;
                blendBox.baseColor = baseColor;
                blendBox.DrawHull(EditMode.editMode == k_EditBlend);

                // Bounding box.
                if (!shapeBoxes.TryGetValue(probeVolume, out HierarchicalBox shapeBox))
                {
                    return;
                }
                shapeBox.center = Vector3.zero;
                shapeBox.size   = probeVolume.parameters.size;
                shapeBox.DrawHull(EditMode.editMode == k_EditShape);
            }
        }
Exemplo n.º 4
0
 static void DrawGizmosSelected(ProbeVolume probeVolume, GizmoType gizmoType)
 {
     using (new Handles.DrawingScope(Matrix4x4.TRS(probeVolume.transform.position, probeVolume.transform.rotation, Vector3.one)))
     {
         // Bounding box.
         s_ShapeBox.center = Vector3.zero;
         s_ShapeBox.size   = probeVolume.parameters.size;
         s_ShapeBox.DrawHull(EditMode.editMode == k_EditShape);
     }
 }
Exemplo n.º 5
0
        static Vector3 BlendSize(ProbeVolume probeVolume)
        {
            Vector3 size      = probeVolume.parameters.size;
            Vector3 blendSize = (Vector3.one - probeVolume.parameters.positiveFade - probeVolume.parameters.negativeFade);

            blendSize.x *= size.x;
            blendSize.y *= size.y;
            blendSize.z *= size.z;
            return(blendSize);
        }
Exemplo n.º 6
0
        public override void OnInspectorGUI()
        {
            ProbeVolume probeVolume = target as ProbeVolume;

            bool hasChanges = false;

            if (probeVolume.cachedTransform != probeVolume.gameObject.transform.worldToLocalMatrix)
            {
                hasChanges = true;
            }

            if (probeVolume.cachedHashCode != probeVolume.GetHashCode())
            {
                hasChanges = true;
            }

            probeVolume.mightNeedRebaking = hasChanges;

            bool drawInspector = true;

            if (ProbeReferenceVolume._GetLightingSettingsOrDefaultsFallback.Invoke().realtimeGI)
            {
                EditorGUILayout.HelpBox("The Probe Volume feature is not supported when using Enlighten.", MessageType.Warning, wide: true);
                drawInspector = false;
            }

            var renderPipelineAsset = GraphicsSettings.renderPipelineAsset;

            if (!ProbeReferenceVolume.instance.isInitialized || !ProbeReferenceVolume.instance.enabledBySRP)
            {
                if (renderPipelineAsset == null || renderPipelineAsset.GetType().Name != "HDRenderPipelineAsset")
                {
                    EditorGUILayout.HelpBox("Probe Volume is not a supported feature by this SRP.", MessageType.Error, wide: true);
                }
                else
                {
                    EditorGUILayout.HelpBox("The probe volumes feature is not enabled or not available on current SRP.", MessageType.Warning, wide: true);
                }

                drawInspector = false;
            }

            if (drawInspector)
            {
                serializedObject.Update();

                ProbeVolumeUI.Inspector.Draw(m_SerializedProbeVolume, this);
            }


            m_SerializedProbeVolume.Apply();
        }
Exemplo n.º 7
0
 static void DrawGizmosSelected(ProbeVolume probeVolume, GizmoType gizmoType)
 {
     using (new Handles.DrawingScope(Matrix4x4.TRS(probeVolume.transform.position, probeVolume.transform.rotation, Vector3.one)))
     {
         // Bounding box.
         if (!shapeBoxes.TryGetValue(probeVolume, out HierarchicalBox shapeBox))
         {
             return;
         }
         shapeBox.center = Vector3.zero;
         shapeBox.size   = probeVolume.parameters.size;
         shapeBox.DrawHull(EditMode.editMode == k_EditShape);
     }
 }
Exemplo n.º 8
0
        static Vector3 CenterBlendLocalPosition(ProbeVolume probeVolume)
        {
            Vector3 size     = probeVolume.parameters.size;
            Vector3 posBlend = probeVolume.parameters.positiveFade;

            posBlend.x *= size.x;
            posBlend.y *= size.y;
            posBlend.z *= size.z;
            Vector3 negBlend = probeVolume.parameters.negativeFade;

            negBlend.x *= size.x;
            negBlend.y *= size.y;
            negBlend.z *= size.z;
            Vector3 localPosition = (negBlend - posBlend) * 0.5f;

            return(localPosition);
        }
Exemplo n.º 9
0
        static void Drawer_BakeToolBar(SerializedProbeVolume serialized, Editor owner)
        {
            if (!ProbeReferenceVolume.instance.isInitialized)
            {
                return;
            }

            ProbeVolume pv = (serialized.serializedObject.targetObject as ProbeVolume);

            Bounds bounds                        = new Bounds();
            bool   foundABound                   = false;
            bool   performFitting                = false;
            bool   performFittingOnlyOnScene     = false;
            bool   performFittingOnlyOnSelection = false;

            bool ContributesToGI(Renderer renderer)
            {
                var flags = GameObjectUtility.GetStaticEditorFlags(renderer.gameObject) & StaticEditorFlags.ContributeGI;

                return((flags & StaticEditorFlags.ContributeGI) != 0);
            }

            void ExpandBounds(Bounds currBound)
            {
                if (!foundABound)
                {
                    bounds      = currBound;
                    foundABound = true;
                }
                else
                {
                    bounds.Encapsulate(currBound);
                }
            }

            EditorGUI.BeginDisabledGroup(pv.globalVolume);

            if (GUILayout.Button(EditorGUIUtility.TrTextContent("Fit to all Scenes", "Fits the Probe Volume's boundary to all open Scenes"), EditorStyles.miniButton))
            {
                performFitting = true;
            }
            if (GUILayout.Button(EditorGUIUtility.TrTextContent("Fit to Scene", "Fits the Probe Volume's boundary to the Scene it belongs to."), EditorStyles.miniButton))
            {
                performFitting            = true;
                performFittingOnlyOnScene = true;
            }
            if (GUILayout.Button(EditorGUIUtility.TrTextContent("Fit to Selection", "Fits the Probe Volume's boundary to the selected GameObjects. Lock the Probe Volume's Inspector to allow for the selection of other GameObjects."), EditorStyles.miniButton))
            {
                performFitting = true;
                performFittingOnlyOnSelection = true;
            }
            EditorGUI.EndDisabledGroup();

            if (performFitting)
            {
                Undo.RecordObject(pv.transform, "Fitting Probe Volume");

                if (performFittingOnlyOnSelection)
                {
                    var transforms = Selection.transforms;
                    foreach (var transform in transforms)
                    {
                        var childrens = transform.gameObject.GetComponentsInChildren <Transform>();
                        foreach (var children in childrens)
                        {
                            Renderer childRenderer;
                            if (children.gameObject.TryGetComponent <Renderer>(out childRenderer))
                            {
                                bool childContributeGI = ContributesToGI(childRenderer) && childRenderer.gameObject.activeInHierarchy && childRenderer.enabled;

                                if (childContributeGI)
                                {
                                    ExpandBounds(childRenderer.bounds);
                                }
                            }
                        }
                    }
                }
                else
                {
                    var renderers = UnityEngine.GameObject.FindObjectsOfType <Renderer>();

                    foreach (Renderer renderer in renderers)
                    {
                        bool useRendererToExpand = false;
                        bool contributeGI        = ContributesToGI(renderer) && renderer.gameObject.activeInHierarchy && renderer.enabled;

                        if (contributeGI)
                        {
                            useRendererToExpand = performFittingOnlyOnScene ? (renderer.gameObject.scene == pv.gameObject.scene) : true;
                        }

                        if (useRendererToExpand)
                        {
                            ExpandBounds(renderer.bounds);
                        }
                    }
                }

                pv.transform.position = bounds.center;
                float   minBrickSize = ProbeReferenceVolume.instance.MinBrickSize();
                Vector3 tmpClamp     = (bounds.size + new Vector3(minBrickSize, minBrickSize, minBrickSize));
                tmpClamp.x = Mathf.Max(0f, tmpClamp.x);
                tmpClamp.y = Mathf.Max(0f, tmpClamp.y);
                tmpClamp.z = Mathf.Max(0f, tmpClamp.z);
                serialized.size.vector3Value = tmpClamp;
            }
        }
Exemplo n.º 10
0
        static void Drawer_VolumeContent(SerializedProbeVolume serialized, Editor owner)
        {
            ProbeVolume pv = (serialized.serializedObject.targetObject as ProbeVolume);

            bool hasProfile = (ProbeReferenceVolume.instance.sceneData?.GetProfileForScene(pv.gameObject.scene) != null);

            EditorGUI.BeginChangeCheck();
            if (pv.mightNeedRebaking)
            {
                var helpBoxRect = GUILayoutUtility.GetRect(new GUIContent(Styles.s_ProbeVolumeChangedMessage, EditorGUIUtility.IconContent("Warning@2x").image), EditorStyles.helpBox);
                EditorGUI.HelpBox(helpBoxRect, Styles.s_ProbeVolumeChangedMessage, MessageType.Warning);
            }

            EditorGUILayout.PropertyField(serialized.globalVolume, Styles.s_GlobalVolume);
            if (!serialized.globalVolume.boolValue)
            {
                EditorGUILayout.PropertyField(serialized.size, Styles.s_Size);
            }

            if (!hasProfile)
            {
                EditorGUILayout.HelpBox("No profile information is set for the scene that owns this probe volume so no subdivision information can be retrieved.", MessageType.Warning);
            }

            EditorGUI.BeginDisabledGroup(!hasProfile);
            var rect = EditorGUILayout.GetControlRect(true);

            EditorGUI.BeginProperty(rect, Styles.s_HighestSubdivLevel, serialized.highestSubdivisionLevelOverride);
            EditorGUI.BeginProperty(rect, Styles.s_LowestSubdivLevel, serialized.lowestSubdivisionLevelOverride);

            // Round min and max subdiv
            int maxSubdiv = ProbeReferenceVolume.instance.GetMaxSubdivision() - 1;

            if (ProbeReferenceVolume.instance.sceneData != null)
            {
                var profile = ProbeReferenceVolume.instance.sceneData.GetProfileForScene(pv.gameObject.scene);

                if (profile != null)
                {
                    ProbeReferenceVolume.instance.SetMinBrickAndMaxSubdiv(profile.minBrickSize, profile.maxSubdivision);
                    maxSubdiv = ProbeReferenceVolume.instance.GetMaxSubdivision() - 1;
                }
                else
                {
                    maxSubdiv = Mathf.Max(0, maxSubdiv);
                }
            }

            EditorGUILayout.LabelField("Subdivision Overrides", EditorStyles.boldLabel);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(serialized.overridesSubdivision, Styles.s_OverridesSubdivision);
            EditorGUI.BeginDisabledGroup(!serialized.overridesSubdivision.boolValue);

            int value = serialized.highestSubdivisionLevelOverride.intValue;

            // We were initialized, but we cannot know the highest subdiv statically, so we need to resort to this.
            if (serialized.highestSubdivisionLevelOverride.intValue < 0)
            {
                serialized.highestSubdivisionLevelOverride.intValue = maxSubdiv;
            }

            using (new EditorGUI.IndentLevelScope())
            {
                serialized.highestSubdivisionLevelOverride.intValue = Mathf.Min(maxSubdiv, EditorGUILayout.IntSlider(Styles.s_HighestSubdivLevel, serialized.highestSubdivisionLevelOverride.intValue, 0, maxSubdiv));
                serialized.lowestSubdivisionLevelOverride.intValue  = Mathf.Min(maxSubdiv, EditorGUILayout.IntSlider(Styles.s_LowestSubdivLevel, serialized.lowestSubdivisionLevelOverride.intValue, 0, maxSubdiv));
                serialized.lowestSubdivisionLevelOverride.intValue  = Mathf.Min(serialized.lowestSubdivisionLevelOverride.intValue, serialized.highestSubdivisionLevelOverride.intValue);
            }
            EditorGUI.EndProperty();
            EditorGUI.EndProperty();

            int minSubdivInVolume = serialized.overridesSubdivision.boolValue ? serialized.lowestSubdivisionLevelOverride.intValue : 0;
            int maxSubdivInVolume = serialized.overridesSubdivision.boolValue ? serialized.highestSubdivisionLevelOverride.intValue : maxSubdiv;

            EditorGUI.indentLevel--;

            if (hasProfile)
            {
                EditorGUILayout.HelpBox($"The distance between probes will fluctuate between : {ProbeReferenceVolume.instance.GetDistanceBetweenProbes(maxSubdiv - maxSubdivInVolume)}m and {ProbeReferenceVolume.instance.GetDistanceBetweenProbes(maxSubdiv - minSubdivInVolume)}m", MessageType.Info);
            }

            EditorGUI.EndDisabledGroup();
            EditorGUI.EndDisabledGroup();

            if (EditorGUI.EndChangeCheck())
            {
                Vector3 tmpClamp = serialized.size.vector3Value;
                tmpClamp.x = Mathf.Max(0f, tmpClamp.x);
                tmpClamp.y = Mathf.Max(0f, tmpClamp.y);
                tmpClamp.z = Mathf.Max(0f, tmpClamp.z);
                serialized.size.vector3Value = tmpClamp;
            }

            EditorGUILayout.LabelField("Geometry Settings", EditorStyles.boldLabel);

            EditorGUILayout.PropertyField(serialized.overrideRendererFilters, Styles.s_OverrideRendererFilters);
            if (serialized.overrideRendererFilters.boolValue)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(serialized.objectLayerMask, Styles.s_ObjectLayerMask);
                EditorGUILayout.PropertyField(serialized.minRendererVolumeSize, Styles.s_MinRendererVolumeSize);
                EditorGUI.indentLevel--;
            }
        }
Exemplo n.º 11
0
        protected void OnSceneGUI()
        {
            ProbeVolume probeVolume = target as ProbeVolume;

            if (Event.current.type == EventType.Layout)
            {
                probeVolume.DrawSelectedProbes();
            }

            if (!blendBoxes.TryGetValue(probeVolume, out HierarchicalBox blendBox))
            {
                return;
            }
            if (!shapeBoxes.TryGetValue(probeVolume, out HierarchicalBox shapeBox))
            {
                return;
            }

            switch (EditMode.editMode)
            {
            case k_EditBlend:
                using (new Handles.DrawingScope(Matrix4x4.TRS(probeVolume.transform.position, probeVolume.transform.rotation, Vector3.one)))
                {
                    //contained must be initialized in all case
                    shapeBox.center = Vector3.zero;
                    shapeBox.size   = probeVolume.parameters.size;

                    blendBox.monoHandle = !probeVolume.parameters.advancedFade;
                    blendBox.center     = CenterBlendLocalPosition(probeVolume);
                    blendBox.size       = BlendSize(probeVolume);
                    EditorGUI.BeginChangeCheck();
                    blendBox.DrawHandle();
                    if (EditorGUI.EndChangeCheck())
                    {
                        Undo.RecordObject(probeVolume, "Change Probe Volume Blend");

                        //work in local space to compute the change on positiveFade and negativeFade
                        Vector3 newCenterBlendLocalPosition = blendBox.center;
                        Vector3 halfSize = blendBox.size * 0.5f;
                        Vector3 size     = probeVolume.parameters.size;
                        Vector3 posFade  = newCenterBlendLocalPosition + halfSize;
                        posFade.x = 0.5f - posFade.x / size.x;
                        posFade.y = 0.5f - posFade.y / size.y;
                        posFade.z = 0.5f - posFade.z / size.z;
                        Vector3 negFade = newCenterBlendLocalPosition - halfSize;
                        negFade.x = 0.5f + negFade.x / size.x;
                        negFade.y = 0.5f + negFade.y / size.y;
                        negFade.z = 0.5f + negFade.z / size.z;
                        probeVolume.parameters.positiveFade = posFade;
                        probeVolume.parameters.negativeFade = negFade;
                    }
                }
                break;

            case k_EditShape:
                //important: if the origin of the handle's space move along the handle,
                //handles displacement will appears as moving two time faster.
                using (new Handles.DrawingScope(Matrix4x4.TRS(Vector3.zero, probeVolume.transform.rotation, Vector3.one)))
                {
                    //contained must be initialized in all case
                    shapeBox.center = Quaternion.Inverse(probeVolume.transform.rotation) * probeVolume.transform.position;
                    shapeBox.size   = probeVolume.parameters.size;

                    shapeBox.monoHandle = !probeVolume.parameters.advancedFade;
                    EditorGUI.BeginChangeCheck();
                    shapeBox.DrawHandle();
                    if (EditorGUI.EndChangeCheck())
                    {
                        Undo.RecordObjects(new Object[] { probeVolume, probeVolume.transform }, "Change Probe Volume Bounding Box");

                        probeVolume.parameters.size = shapeBox.size;

                        Vector3 delta = probeVolume.transform.rotation * shapeBox.center - probeVolume.transform.position;
                        probeVolume.transform.position += delta;;
                    }
                }
                break;
            }
        }