Files
DebugVisualizerExtension/NrxDebuggerVisualizerProvider/NrxDebuggerVisualizerProvider.cs
T

44 lines
2.5 KiB
C#
Raw Normal View History

using Microsoft.VisualStudio.Extensibility;
using Microsoft.VisualStudio.Extensibility.DebuggerVisualizers;
using Microsoft.VisualStudio.RpcContracts.RemoteUI;
using NamedPipes;
using System;
using System.Numerics;
using System.Threading;
using System.Threading.Tasks;
2026-04-02 10:09:10 +02:00
namespace NrxDebugVisualizer;
[VisualStudioContribution]
2026-04-02 10:09:10 +02:00
internal sealed class NrxDebuggerVisualizerProvider : DebuggerVisualizerProvider
{
public override DebuggerVisualizerProviderConfiguration DebuggerVisualizerProviderConfiguration => new(
[
new VisualizerTargetType("%Vector3Visualizer_DisplayName%", @"System.Numerics.Vector3, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"),
new VisualizerTargetType("%QuaternionVisualizer_DisplayName%", typeof(Quaternion)),
new VisualizerTargetType("%FrameVisualizer_DisplayName%", @"Num.Roto.Visualization.Math.Geometry.Frame, Num.Roto.Visualization.Math, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"),
new VisualizerTargetType("%NrxIEnumerableVisualizer_DisplayName%", @"System.Collections.Generic.IEnumerable`1, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"),
])
{
2026-04-02 10:09:10 +02:00
VisualizerObjectSourceType = new VisualizerObjectSourceType(typeof(NrxVisualizerObjectSource.NrxVisualizerObjectSource)),
Style = VisualizerStyle.ToolWindow,
};
public override async Task<IRemoteUserControl> CreateVisualizerAsync(VisualizerTarget visualizerTarget, CancellationToken cancellationToken)
{
2026-04-02 15:20:12 +02:00
VisualizerModel? model = await visualizerTarget.ObjectSource.RequestDataAsync<VisualizerModel?>(jsonSerializer: null, cancellationToken);
2026-04-08 08:20:33 +02:00
await SendToVisualizerAsync(model);
2026-04-02 10:09:10 +02:00
//throw new InvalidOperationException("This is a test exception to demonstrate the visualizer. Please remove this line and implement the visualizer logic.");
var control = new Vector3VisualizerUserControl(dataContext: model);
return await Task.FromResult<IRemoteUserControl>(control);
2026-04-02 10:09:10 +02:00
}
2026-04-02 10:40:46 +02:00
private static NamedPipeClient? PipeClient { get; set; }
2026-04-08 08:20:33 +02:00
private static async Task SendToVisualizerAsync(VisualizerModel? visualizerModel)
2026-04-02 10:40:46 +02:00
{
2026-04-02 15:20:12 +02:00
if (visualizerModel is null) return;
2026-04-02 10:40:46 +02:00
PipeClient ??= new NamedPipeClient("testPipe", serverName: @"TestServer", logger: (m) => Console.WriteLine(m));
2026-04-08 08:20:33 +02:00
await PipeClient.SetVisualizerModelAsync(visualizerModel);
await PipeClient.SetMessageAsync($"Hello from {nameof(CreateVisualizerAsync)},visualizerModel.Content = {visualizerModel.Content}");
2026-04-02 10:40:46 +02:00
}
}