using System; using System.Collections.Generic; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; namespace Veldrid.Common.Plot { public class DataReViewPlot : BaseVeldridRender,IZoomRender { public float HScale { get; set; } = 1; public float VScale { get; set; } = 1; public float HOffset { get; set; } public float VOffset { get; set; } public bool ZoomEnbled { get; set; } = true; struct ProjView { public Matrix4x4 Proj; public Matrix4x4 View; } private ProjView projView; Pipeline pipeline; private PlotInfo plotInfo; DeviceBuffer plotInfoBuffer; DeviceBuffer projViewBuffer; DeviceBuffer dataBuffer; ResourceLayout dataLayout; ResourceSet dataSet; ResourceLayout infoLayout; ResourceSet infoSet; Shader[] shaders; private Info info; private object locker = new object(); public DataReViewPlot(VeldridContent control) : base(control) { } internal override void DisposeResources() { base.DisposeResources(); pipeline?.Dispose(); plotInfoBuffer?.Dispose(); projViewBuffer?.Dispose(); dataBuffer?.Dispose(); dataLayout?.Dispose(); dataSet?.Dispose(); infoLayout?.Dispose(); infoSet?.Dispose(); resultBuffer?.Dispose(); cpuBuffer?.Dispose(); } internal override void CreateResources() { base.CreateResources(); plotInfoBuffer = ResourceFactory.CreateBuffer(new BufferDescription((uint)Unsafe.SizeOf(), BufferUsage.UniformBuffer)); projViewBuffer = ResourceFactory.CreateBuffer(new BufferDescription((uint)Unsafe.SizeOf(), BufferUsage.UniformBuffer)); infoLayout = ResourceFactory.CreateResourceLayout(new ResourceLayoutDescription( new ResourceLayoutElementDescription("InfoBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex), new ResourceLayoutElementDescription("ProjView", ResourceKind.UniformBuffer, ShaderStages.Vertex))); infoSet = ResourceFactory.CreateResourceSet(new ResourceSetDescription(infoLayout, plotInfoBuffer, projViewBuffer)); shaders = CreateShader("DataReViewPlot"); CreateBuffer(100); } public Vector2 WindowScale { get; set; } = Vector2.One; public void SetData(IntPtr ptr,uint bytescount) { if(dataBuffer.SizeInBytes()); if (dataBuffer.SizeInBytes < bytescount) { CreateBuffer(bytescount); } GraphicsDevice.UpdateBuffer(dataBuffer, 0, datas); } private void CreateBuffer(uint bytescount) { dataBuffer?.Dispose(); dataLayout?.Dispose(); dataSet?.Dispose(); pipeline?.Dispose(); dataBuffer = ResourceFactory.CreateBuffer(new BufferDescription(bytescount, BufferUsage.StructuredBufferReadWrite,(uint)Unsafe.SizeOf())); dataLayout = ResourceFactory.CreateResourceLayout(new ResourceLayoutDescription(new ResourceLayoutElementDescription("DataBuffer", ResourceKind.StructuredBufferReadOnly, ShaderStages.Vertex))); dataSet = ResourceFactory.CreateResourceSet(new ResourceSetDescription(dataLayout, dataBuffer)); pipeline = CreatePipLine(PrimitiveTopology.LineStrip, new[] { dataLayout, infoLayout }, Array.Empty(), shaders); } internal override void DrawData() { base.DrawData(); if (PlotInfos == null || PlotInfos.Length == 0 || TotalCount == 0) return; projView.Proj = base.OrthographicMatrix; projView.View = GetLineMatrix(HScale,VScale,HOffset/(MainSwapchainBuffer.Width/ WindowScale.X)*2 * (Rectangle.Width/MainSwapchainBuffer.Width),VOffset/(MainSwapchainBuffer.Height/ WindowScale.Y)*2*(Rectangle.Width/MainSwapchainBuffer.Width)); CommandList.UpdateBuffer(projViewBuffer,0, projView); CommandList.SetFramebuffer(MainSwapchainBuffer); CommandList.SetPipeline(pipeline); CommandList.SetGraphicsResourceSet(0, dataSet); CommandList.SetGraphicsResourceSet(1, infoSet); info.PlotCount = (uint)PlotInfos.Length; for (uint i=0;i