Files
2026-07-13 13:13:17 +08:00

99 lines
3.2 KiB
C#

using T3.Core.Utils;
namespace Lib.point._internal;
[Guid("7ad3a38a-9f04-43ba-a16f-6982b87dd2d4")]
internal sealed class AnalyzeBuffers : Instance<AnalyzeBuffers>
{
[Output(Guid = "4906B2CE-7AAF-4025-B48E-49E6D660C13B")]
public readonly Slot<int> BufferCount = new();
[Output(Guid = "5638E071-A0A7-4EE2-AA04-9B651821BEBB")]
public readonly Slot<BufferWithViews> SelectedBuffer = new();
[Output(Guid = "D7BBD6D5-57EB-4C3A-8C84-E497E490AF83")]
public readonly Slot<int> StartPositionForSelected = new();
[Output(Guid = "0702a722-0b93-4840-9abd-f8ee348c3647")]
public readonly Slot<int> TotalSize = new();
[Output(Guid = "79FE54BE-6841-4F4D-8216-0FA26FF21F21")]
public readonly Slot<int> Stride = new();
public AnalyzeBuffers()
{
BufferCount.UpdateAction += Update;
StartPositionForSelected.UpdateAction += Update;
TotalSize.UpdateAction += Update;
SelectedBuffer.UpdateAction += Update;
Stride.UpdateAction += Update;
}
private void Update(EvaluationContext context)
{
var connections = Input.GetCollectedTypedInputs();
var selectedIndex = Index.GetValue(context).Clamp(0, connections.Count-1);
if (connections.Count == 0)
{
TotalSize.Value = 0;
StartPositionForSelected.Value = 0;
BufferCount.Value = 0;
return;
}
var totalSize = 0;
var startPosition = 0;
BufferWithViews selectedBuffer = null;
var hadErrors = false;
for (var connectionIndex = 0; connectionIndex < connections.Count; connectionIndex++)
{
var input = connections[connectionIndex];
var bufferWithViews = input.GetValue(context);
if (bufferWithViews !=null && bufferWithViews.Srv != null && !bufferWithViews.Srv.IsDisposed)
{
var length = bufferWithViews.Srv.Description.Buffer.ElementCount;
if (connectionIndex == selectedIndex)
{
startPosition = totalSize;
selectedBuffer = input.Value;
}
totalSize += length;
}
else
{
hadErrors = true;
if (_complainedOnce)
continue;
Log.Warning($"Undefined BufferWithViews at index {connectionIndex}", this);
_complainedOnce = true;
}
}
if (!hadErrors)
{
_complainedOnce = false;
}
SelectedBuffer.Value = selectedBuffer;
StartPositionForSelected.Value = startPosition;
BufferCount.Value = connections.Count;
TotalSize.Value = totalSize;
if (selectedBuffer?.Buffer != null)
{
Stride.Value = selectedBuffer.Buffer.Description.StructureByteStride;
}
}
private bool _complainedOnce;
[Input(Guid = "c8a5769e-2536-4caa-8380-22fbeed1ef12")]
public readonly MultiInputSlot<BufferWithViews> Input = new();
[Input(Guid = "bf9c64ac-39b5-41c0-a896-84809b12fff6")]
public readonly InputSlot<int> Index = new();
}