2026-03-31 13:32:19 +02:00
using Microsoft.VisualStudio.Extensibility ;
using Microsoft.VisualStudio.Extensibility.DebuggerVisualizers ;
using Microsoft.VisualStudio.RpcContracts.RemoteUI ;
2026-04-01 15:47:54 +02:00
using NamedPipes ;
using System ;
2026-03-31 13:32:19 +02:00
using System.Numerics ;
using System.Threading ;
using System.Threading.Tasks ;
2026-04-01 15:47:54 +02:00
2026-04-02 10:09:10 +02:00
namespace NrxDebugVisualizer ;
2026-03-31 13:32:19 +02:00
[VisualStudioContribution]
2026-04-02 10:09:10 +02:00
internal sealed class NrxDebuggerVisualizerProvider : DebuggerVisualizerProvider
2026-03-31 13:32:19 +02:00
{
2026-04-02 09:32:48 +02:00
2026-03-31 13:32:19 +02:00
public override DebuggerVisualizerProviderConfiguration DebuggerVisualizerProviderConfiguration = > new (
[
2026-04-02 09:32:48 +02:00
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-03-31 13:32:19 +02:00
] )
{
2026-04-02 10:09:10 +02:00
VisualizerObjectSourceType = new VisualizerObjectSourceType ( typeof ( NrxVisualizerObjectSource . NrxVisualizerObjectSource ) ) ,
2026-03-31 13:32:19 +02:00
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-01 15:47:54 +02:00
SendToVisualizer ( 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.");
2026-04-01 15:47:54 +02:00
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-02 15:20:12 +02:00
private static void SendToVisualizer ( 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-07 12:21:37 +02:00
_ = PipeClient . SetVisualizerModelAsync ( visualizerModel ) ;
2026-04-02 15:20:12 +02:00
_ = PipeClient . SetMessageAsync ( $"Hello from {nameof(CreateVisualizerAsync)},visualizerModel.Content = {visualizerModel.Content}" ) ;
2026-04-02 10:40:46 +02:00
}
2026-03-31 13:32:19 +02:00
}