Files
bluflame/intromat/Intromat/Nodes/Meshes/DxMeshNodeBase.cs
2026-04-18 22:31:51 +02:00

98 lines
2.9 KiB
C#

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<MeshValue?>(EPortType.Mesh)
{
Name = "Output",
Group = meshGroup
});
var dxHost = Locator.Current.GetService<DxHost>()!;
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<MeshValue?> Output { get; }
}
}