using NamedPipes; using NrxDebugVisualizer.Scenes; using Num.Roto.Visualization.Math.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Threading; using KontractFrame = System.ValueTuple; namespace NrxDebugVisualizer.Models; internal sealed class PipeServer { private string PipeName { get; } private NamedPipesServer? NamedPipesServer { get; set; } public PipeServer(string pipeName, DebugVisualizerScene debuggerScene,CancellationToken cancellationToken) { PipeName = pipeName; DebugVisualizerScene = debuggerScene; StartPipeServer(cancellationToken); } private void NamedPipesServer_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName != nameof(NamedPipesServer.VisualizerModel)) return; var visualizerObject = NamedPipesServer?.VisualizerModel; if (visualizerObject is null) return; SetPoint(visualizerObject.Point); SetPointList(visualizerObject.PointArray); SetFrame(visualizerObject.Frame); SetFrameList(visualizerObject.FrameArray); } #region NamedPipesServer private async void StartPipeServer(CancellationToken cancellationToken) { NamedPipesServer = new NamedPipesServer(PipeName, logger: Console.WriteLine); NamedPipesServer.PropertyChanged += NamedPipesServer_PropertyChanged; await NamedPipesServer.RunAsync(cancellationToken); } #endregion #region DebugVisualizerScene private DebugVisualizerScene DebugVisualizerScene { get; } private static Frame ToFrame(KontractFrame kontractFrame) { var (translation, orientation, scale) = kontractFrame; return new Frame(translation, scale, orientation); } private static Frame[] ToFrameArray(IEnumerable frameList) { return [.. frameList.Select(ToFrame)]; } private void SetPoint(Vector3? point) { if (point is null) return; DebugVisualizerScene.AddPointGeometry(point.Value, 20f); } private void SetPointList(Vector3[]? pointList) { if (pointList == null || pointList.Length < 1) return; DebugVisualizerScene.AddPointListGeometry(pointList, 5); } private void SetFrame(KontractFrame? kontractFrame) { if (kontractFrame is null) return; DebugVisualizerScene.AddFrameGeometry(ToFrame(kontractFrame.Value), 1); } private void SetFrameList(KontractFrame[]? frameArray) { if (frameArray == null || frameArray.Length < 1) return; DebugVisualizerScene.AddFrameListGeometry(ToFrameArray(frameArray), 1); } #endregion }