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