#nullable enable
using ImGuiNET;
using T3.Core.Animation;
using T3.Core.DataTypes;
using T3.Core.Operator;
using T3.Core.Operator.Interfaces;
using T3.Editor.Gui.Interaction.Camera;
using T3.Editor.Gui.OutputUi;
using T3.Editor.Gui.Styling;
using T3.Editor.Gui.UiHelpers;
using T3.Editor.Gui.Windows;
using T3.Editor.Gui.Windows.Output;
using T3.Editor.UiModel;
using T3.Editor.UiModel.ProjectHandling;
using T3.Editor.UiModel.Selection;
using Vector2 = System.Numerics.Vector2;
namespace T3.Editor.Gui;
///
/// A helper class to render an image output into the background of the graph window
///
internal sealed class GraphImageBackground
{
public bool IsActive => _backgroundNodePath != null;
public bool HasInteractionFocus;
public GraphImageBackground(NodeSelection nodeSelection, Structure structure)
{
//_window = window;
_camSelectionHandling = new CameraSelectionHandling(nodeSelection, () => Playback.Current);
_structure = structure;
_nodeSelection = nodeSelection;
}
public Instance? OutputInstance
{
set => _backgroundNodePath = value?.InstancePath;
get => _structure.GetInstanceFromIdPath(_backgroundNodePath);
}
///
/// The most recently rendered background texture. In focus mode the output window is hidden and
/// the output renders here instead, so the render export reads its source texture from this.
///
public Texture2D? GetCurrentTexture() => _imageCanvas.LastTexture;
private void DrawResolutionSelector()
{
ResolutionHandling.DrawSelector(ref _selectedResolution, null);
}
public void Draw(float imageOpacity)
{
if (_backgroundNodePath == null)
return;
// Prevent UiScaling for cropping image
var keepScale = T3Ui.UiScaleFactor;
T3Ui.UiScaleFactor = 1;
DrawNonScaledCanvasContent(imageOpacity);
T3Ui.UiScaleFactor = keepScale;
}
private void DrawNonScaledCanvasContent(float imageOpacity)
{
var selectedInstance = _nodeSelection.GetSelectedInstanceWithoutComposition();
if (selectedInstance is ICamera camera)
{
_cameraInteraction.Update(camera, HasInteractionFocus);
}
_evaluationContext.ShowGizmos = T3.Core.Operator.GizmoVisibility.Off;
_evaluationContext.Reset();
_imageCanvas.SetViewMode(ImageOutputCanvas.Modes.Fitted);
_imageCanvas.Update(T3Ui.EditingFlags.PreventMouseInteractions);
ImGui.SetCursorPos(Vector2.Zero);
var instanceForOutput = _structure.GetInstanceFromIdPath(_backgroundNodePath);
if (instanceForOutput == null || instanceForOutput.Outputs.Count == 0)
return;
var viewOutput = instanceForOutput.Outputs[0];
var preventCameraInteraction = !HasInteractionFocus
|| !string.IsNullOrEmpty(FrameStats.Last.OpenedPopUpName);
_camSelectionHandling.Update(instanceForOutput, instanceForOutput.Outputs[0].ValueType, preventCameraInteraction);
var viewSymbolUi = instanceForOutput.GetSymbolUi();
if (!viewSymbolUi.OutputUis.TryGetValue(viewOutput.Id, out IOutputUi? viewOutputUi))
return;
_imageCanvas.SetAsCurrent();
_evaluationContext.ShowGizmos = _showGizmos;
_evaluationContext.RequestedResolution = _selectedResolution.ComputeResolution();
_evaluationContext.SetDefaultCamera();
if (_camSelectionHandling.CameraForRendering != null)
{
_evaluationContext.SetViewFromCamera(_camSelectionHandling.CameraForRendering);
}
var hackToHideResolution = UserSettings.Config.ShowToolbar;
UserSettings.Config.ShowToolbar = false;
viewOutputUi.DrawValue(viewOutput, _evaluationContext, "graphBackground", recompute: true);
UserSettings.Config.ShowToolbar = hackToHideResolution;
ImageOutputCanvas.Deactivate();
if (imageOpacity < 1)
{
ImGui.GetWindowDrawList().AddRectFilled(Vector2.Zero,
Vector2.One * 10000,
UiColors.WindowBackground.Fade(1 - imageOpacity));
}
}
public void DrawToolbarItems()
{
if (!IsActive)
return;
//ImGui.SameLine();
if (ImGui.Button("Clear BG"))
{
ClearBackground();
}
ImGui.SameLine();
DrawResolutionSelector();
ImGui.SameLine();
var showGizmos = _showGizmos != T3.Core.Operator.GizmoVisibility.Off;
if (CustomComponents.ToggleIconButton(ref showGizmos, Icon.Grid, Vector2.One * ImGui.GetFrameHeight() * T3Ui.UiScaleFactor))
{
_showGizmos = showGizmos
? T3.Core.Operator.GizmoVisibility.On
: T3.Core.Operator.GizmoVisibility.Off;
}
ImGui.SameLine();
_camSelectionHandling.DrawCameraControlSelection();
ImGui.SameLine();
}
public void ClearBackground()
{
_backgroundNodePath = null;
HasInteractionFocus = false;
}
private GizmoVisibility _showGizmos;
private readonly ImageOutputCanvas _imageCanvas = new();
private readonly CameraSelectionHandling _camSelectionHandling;
private readonly EvaluationContext _evaluationContext = new();
private ResolutionHandling.Resolution _selectedResolution = ResolutionHandling.DefaultResolution;
private readonly CameraInteraction _cameraInteraction = new();
private IReadOnlyList? _backgroundNodePath;
//private readonly GraphWindow _window;
private readonly Structure _structure;
private readonly NodeSelection _nodeSelection;
}