Esempio n. 1
0
            static void RenderInCustomAsset(HDProbe probe, bool useExistingCustomAsset)
            {
                var provider = new TProvider();

                string assetPath = null;

                if (useExistingCustomAsset && probe.customTexture != null && !probe.customTexture.Equals(null))
                {
                    assetPath = AssetDatabase.GetAssetPath(probe.customTexture);
                }

                if (string.IsNullOrEmpty(assetPath))
                {
                    assetPath = EditorUtility.SaveFilePanelInProject(
                        "Save custom capture",
                        probe.name, "exr",
                        "Save custom capture");
                }

                if (!string.IsNullOrEmpty(assetPath))
                {
                    var target = HDProbeSystem.CreateRenderTargetForMode(
                        probe, ProbeSettings.Mode.Custom
                        );
                    HDProbeSystem.Render(
                        probe, null, target,
                        out HDProbe.RenderData renderData,
                        forceFlipY: probe.type == ProbeSettings.ProbeType.ReflectionProbe
                        );
                    HDTextureUtilities.WriteTextureFileToDisk(target, assetPath);
                    AssetDatabase.ImportAsset(assetPath);
                    HDBakedReflectionSystem.ImportAssetAt(probe, assetPath);
                    CoreUtils.Destroy(target);

                    var assetTarget = AssetDatabase.LoadAssetAtPath <Texture>(assetPath);
                    probe.SetTexture(ProbeSettings.Mode.Custom, assetTarget);
                    probe.SetRenderData(ProbeSettings.Mode.Custom, renderData);
                    EditorUtility.SetDirty(probe);
                }
            }
Esempio n. 2
0
            public static void DrawBakeButton(SerializedHDProbe serialized, Editor owner)
            {
                // Disable baking of multiple probes with different modes
                if (serialized.probeSettings.mode.hasMultipleDifferentValues)
                {
                    EditorGUILayout.HelpBox(
                        "Baking is not possible when selecting probe with different modes",
                        MessageType.Info
                        );
                    return;
                }

                // Check if current mode support baking
                var mode = (ProbeSettings.Mode)serialized.probeSettings.mode.intValue;
                var doesModeSupportBaking = mode == ProbeSettings.Mode.Custom || mode == ProbeSettings.Mode.Baked;

                if (!doesModeSupportBaking)
                {
                    return;
                }

                // Check if all scene are saved to a file (requirement to bake probes)
                foreach (var target in serialized.serializedObject.targetObjects)
                {
                    var comp  = (Component)target;
                    var go    = comp.gameObject;
                    var scene = go.scene;
                    if (string.IsNullOrEmpty(scene.path))
                    {
                        EditorGUILayout.HelpBox(
                            "Baking is possible only if all open scenes are saved on disk. " +
                            "Please save the scenes before baking.",
                            MessageType.Info
                            );
                        return;
                    }
                }

                switch (mode)
                {
                case ProbeSettings.Mode.Custom:
                {
                    if (ButtonWithDropdownList(
                            EditorGUIUtility.TrTextContent(
                                "Bake", "Bakes Probe's texture, overwriting the existing texture asset (if any)."
                                ),
                            k_BakeCustomOptionText,
                            data =>
                        {
                            switch ((int)data)
                            {
                            case 0:
                                RenderInCustomAsset(serialized.target, false);
                                break;
                            }
                        }))
                    {
                        RenderInCustomAsset(serialized.target, true);
                    }
                    break;
                }

                case ProbeSettings.Mode.Baked:
                {
                    if (UnityEditor.Lightmapping.giWorkflowMode
                        != UnityEditor.Lightmapping.GIWorkflowMode.OnDemand)
                    {
                        EditorGUILayout.HelpBox("Baking of this probe is automatic because this probe's type is 'Baked' and the Lighting window is using 'Auto Baking'. The texture created is stored in the GI cache.", MessageType.Info);
                        break;
                    }

                    GUI.enabled = serialized.target.enabled;

                    // Bake button in non-continous mode
                    if (ButtonWithDropdownList(
                            EditorGUIUtility.TrTextContent("Bake"),
                            k_BakeButtonsText,
                            data =>
                        {
                            if ((int)data == 0)
                            {
                                var system = ScriptableBakedReflectionSystemSettings.system;
                                system.BakeAllReflectionProbes();
                            }
                        },
                            GUILayout.ExpandWidth(true)))
                    {
                        HDBakedReflectionSystem.BakeProbes(new HDProbe[] { serialized.target });
                        GUIUtility.ExitGUI();
                    }

                    GUI.enabled = true;
                    break;
                }

                case ProbeSettings.Mode.Realtime:
                    break;

                default: throw new ArgumentOutOfRangeException();
                }
            }