98 lines
2.9 KiB
C#
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; }
|
|
}
|
|
}
|