using System; using System.Diagnostics.CodeAnalysis; using System.Reactive.Linq; using DynamicData; using Intromat.Graphics; using Intromat.Model.Compiler; using Intromat.Nodes.Code; using Intromat.Nodes.Meshes; using Intromat.PersistentModel; using Intromat.ViewModels; using Intromat.ViewModels.Editors; using Intromat.ViewModels.Previews; using NodeNetwork.Toolkit.ValueNode; using NodeNetwork.ViewModels; using ReactiveUI; using SharpDX.Direct3D11; using SharpDX.DXGI; using Splat; using Xceed.Wpf.Toolkit.PropertyGrid.Attributes; using Device = SharpDX.Direct3D11.Device; namespace Intromat.Nodes.Meshs { [CategoryOrder("Mesh", 0)] public abstract class DxMeshNodeBase : DxNodeBase { protected MeshValue? _output; protected bool _resourcesCreated; protected DxMeshNodeBase() { var meshGroup = new EndpointGroup("Mesh"); Outputs.Add(Output = new CodeGenOutputViewModel(EPortType.Mesh) { Name = "Output", Group = meshGroup }); var dxHost = Locator.Current.GetService()!; Output.Value = this .WhenAnyObservable(vm => vm.ParentChanged, vm => vm.AnyInputChanged, (parent, _) => parent) .Where(parent => parent != null) .Throttle(TimeSpan.FromMilliseconds(1)) .ObserveOn(dxHost.RenderDispatcher) .Do(_ => { UpdateFrame(dxHost.Device, dxHost.Device.ImmediateContext); }) .Select(_ => new MeshValue(_output!)); var dxMeshPreviewViewModel = new DxMeshPreviewViewModel(this, Output.Value); Preview = dxMeshPreviewViewModel; } [MemberNotNull(nameof(_output))] protected bool EnsureBuffers(Device device) { return EnsureMesh(device, ref _output); } protected bool EnsureMesh(Device device, [NotNull] ref MeshValue? meshValue) { meshValue = null!; //if (false) // TODO: changed //{ // return true; //} return false; } protected virtual void UpdateFrame(Device device, DeviceContext deviceContext) { if (!_resourcesCreated) { _resourcesCreated = true; CreateDeviceResources(device); } EnsureBuffers(device); } protected virtual void CreateDeviceResources(Device device) { } public override void SaveModel(NodeModelBase model) { base.SaveModel(model); var meshModel = (DxMeshModelBase)model; } public override void LoadModel(NodeModelBase model) { base.LoadModel(model); var meshModel = (DxMeshModelBase)model; } public ValueNodeOutputViewModel Output { get; } } }