using System; using System.Reactive.Disposables; using Intromat.Graphics; using Intromat.Pipelines; using Intromat.ViewModels; using Intromat.ViewModels.Previews; using ReactiveUI; using SharpDX.Direct3D11; using Splat; namespace Intromat.Views.Previews { /// /// Interaction logic for DxTexturePreview.xaml /// public partial class DxTexturePreview : IViewFor { private DisplayTexturePipeline? _pipeline; public DxTexturePreview() { InitializeComponent(); MouseDoubleClick += (_, _) => { if (ViewModel == null) return; var network = (CodeGenNetworkViewModel)ViewModel.Parent.Parent; var main = network.Document.MainViewModel; main.Preview2dContext = ViewModel; }; this.WhenActivated(d => { _pipeline = Locator.Current.GetService()!; this.WhenAnyObservable(v => v.ViewModel!.TextureValue).Subscribe(textureValue => { var srv = textureValue?.ShaderResourceView; if (srv != null) { _pipeline.ShaderResourceView = srv; _dxView.Render(); } }).DisposeWith(d); _dxView.SetUpdateHandler(UpdateFrameAction); }); } private void UpdateFrameAction(Device device, DeviceContext context) { _pipeline?.Apply(); } object? IViewFor.ViewModel { get => ViewModel; set => ViewModel = (DxTexturePreviewViewModel?)value; } public DxTexturePreviewViewModel? ViewModel { get; set; } } }