port from perforce
This commit is contained in:
97
intromat/Intromat/Nodes/Meshes/DxMeshNodeBase.cs
Normal file
97
intromat/Intromat/Nodes/Meshes/DxMeshNodeBase.cs
Normal file
@@ -0,0 +1,97 @@
|
||||
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; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user