/// <summary>Create a point cloud plot</summary> private ChartGfxPiece CreatePointPlot(RangeI idx_range) { var n = idx_range.Sizei; // Resize the geometry buffers m_vbuf.Resize(n); m_ibuf.Resize(n); m_nbuf.Resize(1); // Create the vertex/index data var col = Options.Colour; var x_range = RangeF.Invalid; for (int i = 0, iend = n; i != iend; ++i) { var pt = m_data[i + idx_range.Begi]; m_vbuf[i] = new View3d.Vertex(new v4((float)pt.xf, (float)pt.yf, 0f, 1f), col); m_ibuf[i] = (ushort)i; x_range.Grow(pt.xf); } // Create a nugget for the points using the sprite shader { var mat = View3d.Material.New(); mat.m_diff_tex = View3d.Texture.FromStock((View3d.EStockTexture)Options.PointStyle)?.Handle ?? IntPtr.Zero; mat.Use(View3d.ERenderStep.ForwardRender, View3d.EShaderGS.PointSpritesGS, $"*PointSize {{{Options.PointSize} {Options.PointSize}}} *Depth {{{false}}}"); m_nbuf[0] = new View3d.Nugget(View3d.ETopo.PointList, View3d.EGeom.Vert | View3d.EGeom.Colr | View3d.EGeom.Tex0, mat: mat); } // Create the graphics var gfx = new View3d.Object($"{Name}-[{idx_range.Beg},{idx_range.End})", 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray(), Id); return(new ChartGfxPiece(gfx, x_range)); }
public ChartUI() { InitializeComponent(); m_chart.Options.Orthographic = true; m_chart.Options.SceneBorderThickness = 1; m_chart.Options.SceneBorderColour = Colour32.Black; m_chart.Scene.ContextMenu.DataContext = this; m_obj0 = new View3d.Object( "test_object", 0xFFFFFFFF, 5, 18, 1, new View3d.Vertex[] { new View3d.Vertex(new v4(+0, +1, +0, 1), new v4(+0.00f, +1.00f, +0.00f, 0), 0xffff0000, new v2(0.50f, 1)), new View3d.Vertex(new v4(-1, -1, -1, 1), new v4(-0.57f, -0.57f, -0.57f, 0), 0xff00ff00, new v2(0.00f, 0)), new View3d.Vertex(new v4(-1, -1, +1, 1), new v4(-0.57f, -0.57f, +0.57f, 0), 0xff0000ff, new v2(0.25f, 0)), new View3d.Vertex(new v4(+1, -1, +1, 1), new v4(+0.57f, -0.57f, +0.57f, 0), 0xffff00ff, new v2(0.50f, 0)), new View3d.Vertex(new v4(+1, -1, -1, 1), new v4(+0.57f, -0.57f, -0.57f, 0), 0xff00ffff, new v2(0.75f, 0)), }, new ushort[] { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1, 4, 3, 2, 2, 1, 4, }, new View3d.Nugget[] { new View3d.Nugget(View3d.ETopo.TriList, View3d.EGeom.Vert | View3d.EGeom.Norm | View3d.EGeom.Colr), }, null); m_chart.BuildScene += (s, a) => { m_chart.Scene.Window.AddObject(m_obj0); }; m_series = new ChartDataSeries("waves", ChartDataSeries.EFormat.XRealYReal); m_series.Options.Colour = Colour32.Blue; m_series.Options.PlotType = ChartDataSeries.EPlotType.Bar; m_series.Options.PointStyle = EPointStyle.Triangle; m_series.Options.PointSize = 50f; m_series.Options.LineWidth = 3f; m_series.Chart = m_chart; { using var lk = m_series.Lock(); for (int i = 0; i != 100000; ++i) { lk.Add(new ChartDataSeries.Pt(0.01 * i, Math.Sin(0.01 * i * Math_.Tau))); } } m_legend = new ChartDataLegend(); m_chart.Elements.Add(m_legend); MyLegendItems = new ListCollectionView(new[] { m_series }); ShowBoobs = Command.Create(this, ShowBoobsInternal); DataContext = this; }
/// <summary>Create a step line plot</summary> private ChartGfxPiece CreateStepLinePlot(RangeI idx_range) { var n = idx_range.Sizei; // Resize the geometry buffers m_vbuf.Resize(2 * n); m_ibuf.Resize(2 * n + (Options.PointsOnLinePlot ? n : 0)); m_nbuf.Resize(1 + (Options.PointsOnLinePlot ? 1 : 0)); // Create the vertex/index data int vert = 0, indx = 0; var col = Options.Colour; var x_range = RangeF.Invalid; for (int i = 0, iend = Math.Min(n + 1, m_data.Count - idx_range.Begi); i != iend; ++i) { // Get the point and the next point var j = i + idx_range.Begi; var pt = m_data[j]; var pt_r = j + 1 != m_data.Count ? m_data[j + 1] : pt; var v = vert; m_vbuf[vert++] = new View3d.Vertex(new v4((float)pt.xf, (float)pt.yf, 0f, 1f), col); m_vbuf[vert++] = new View3d.Vertex(new v4((float)pt_r.xf, (float)pt.yf, 0f, 1f), col); m_ibuf[indx++] = (ushort)(v + 0); m_ibuf[indx++] = (ushort)(v + 1); x_range.Grow(pt.xf); } // Create a nugget for the list strip using the thick line shader { var mat = View3d.Material.New(); mat.Use(View3d.ERenderStep.ForwardRender, View3d.EShaderGS.ThickLineListGS, $"*LineWidth {{{Options.LineWidth}}}"); m_nbuf[0] = new View3d.Nugget(View3d.ETopo.LineStrip, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, (uint)vert, 0, (uint)indx, View3d.ENuggetFlag.None, false, mat); } // Create a nugget for the points (if visible) if (Options.PointsOnLinePlot) { // Add indices for the points var i0 = indx; for (int i = 0, iend = n; i != iend; ++i) { m_ibuf[indx++] = (ushort)(i * 2); } var mat = View3d.Material.New(); mat.m_diff_tex = View3d.Texture.FromStock((View3d.EStockTexture)Options.PointStyle)?.Handle ?? IntPtr.Zero; mat.Use(View3d.ERenderStep.ForwardRender, View3d.EShaderGS.PointSpritesGS, $"*PointSize {{{Options.PointSize} {Options.PointSize}}} *Depth {{{false}}}"); m_nbuf[1] = new View3d.Nugget(View3d.ETopo.PointList, View3d.EGeom.Vert | View3d.EGeom.Colr | View3d.EGeom.Tex0, 0, (uint)vert, (uint)i0, (uint)indx, View3d.ENuggetFlag.None, false, mat); } // Create the graphics var gfx = new View3d.Object($"{Name}-[{idx_range.Beg},{idx_range.End})", 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray(), Id); return(new ChartGfxPiece(gfx, x_range)); }
protected override void UpdateGfxCore() { // Create lines that fit the chart var w = (float)Chart.XAxis.Span; GfxBid = new View3d.Object(Ldr.Line("BidPrice", Model.Settings.UI.BidColour, v4.Origin, new v4(-w, 0, 0, 1)), file: false); GfxAsk = new View3d.Object(Ldr.Line("AskPrice", Model.Settings.UI.AskColour, v4.Origin, new v4(-w, 0, 0, 1)), file: false); base.UpdateGfxCore(); }
public ChartUI() { InitializeComponent(); m_chart = Controls.Add2(new ChartControl { Dock = DockStyle.Fill, Title = "My Chart" }); m_chart.Options.Orthographic = true; m_chart.XAxis.Label = "X Axis"; m_chart.YAxis.Label = "Y Axis"; m_obj0 = new View3d.Object( "test_object", 0xFFFFFFFF, 5, 18, 1, new View3d.Vertex[] { new View3d.Vertex(new v4(+0, +1, +0, 1), new v4(+0.00f, +1.00f, +0.00f, 0), 0xffff0000, new v2(0.50f, 1)), new View3d.Vertex(new v4(-1, -1, -1, 1), new v4(-0.57f, -0.57f, -0.57f, 0), 0xff00ff00, new v2(0.00f, 0)), new View3d.Vertex(new v4(+1, -1, -1, 1), new v4(+0.57f, -0.57f, -0.57f, 0), 0xff0000ff, new v2(0.25f, 0)), new View3d.Vertex(new v4(+1, -1, +1, 1), new v4(+0.57f, -0.57f, +0.57f, 0), 0xffff00ff, new v2(0.50f, 0)), new View3d.Vertex(new v4(-1, -1, +1, 1), new v4(-0.57f, -0.57f, +0.57f, 0), 0xff00ffff, new v2(0.75f, 0)), }, new ushort[] { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1, 4, 3, 2, 2, 1, 4, }, new View3d.Nugget[] { new View3d.Nugget(View3d.ETopo.TriList, View3d.EGeom.Vert | View3d.EGeom.Norm | View3d.EGeom.Colr), }, null); m_chart.ChartRendering += (s, a) => { a.AddToScene(m_obj0); }; m_series = new ChartDataSeries("waves", ChartDataSeries.EFormat.XRealYReal); using (var lk = m_series.Lock()) { for (int i = 0; i != 100000; ++i) { lk.Add(new ChartDataSeries.Pt(0.01 * i, Math.Sin(0.01 * i * Math_.Tau))); } } m_series.Options.Colour = Colour32.Blue; m_series.Options.PlotType = ChartDataSeries.EPlotType.Bar; m_series.Options.PointStyle = ChartDataSeries.EPointStyle.Triangle; m_series.Options.PointSize = 50f; m_series.Options.LineWidth = 3f; m_series.Chart = m_chart; m_legend = new ChartDataLegend(); m_chart.Elements.Add(m_legend); }
public Connector(XElement node) : base(node) { m_anc0 = new AnchorPoint(); m_anc1 = new AnchorPoint(); m_centre_offset = node.Element(XmlTag.CentreOffset).As(v4.Zero); Anc0 = node.Element(XmlTag.Anchor0).As <AnchorPoint>(); Anc1 = node.Element(XmlTag.Anchor1).As <AnchorPoint>(); Type = node.Element(XmlTag.Type).As <EType>(); Style = new ConnectorStyle(node.Element(XmlTag.Style).As <Guid>()); Gfx = new View3d.Object("*Group{}", false, Id); }
public Connector(Node?node0, Node?node1, EType?type = null, Guid?id = null, ConnectorStyle?style = null, string?text = null) : base(id ?? Guid.NewGuid(), text, m4x4.Identity) { m_anc0 = new AnchorPoint(); m_anc1 = new AnchorPoint(); m_centre_offset = v4.Zero; Type = type ?? EType.Line; Style = style ?? new ConnectorStyle(); Gfx = new View3d.Object("*Group{}", false, Id); Node0 = node0; Node1 = node1; }
protected override void UpdateGfxCore() { base.UpdateGfxCore(); var ldr = $"Group* price_range\n" + $"{{\n" + $"}}\n"; Gfx = new View3d.Object(ldr, false, Id, null); }
/// <summary>Create a line plot</summary> private ChartGfxPiece CreateLinePlot(RangeI idx_range) { var n = idx_range.Sizei; if (n == 0) { throw new ArgumentException($"{nameof(ChartControl)}.{nameof(CreateLinePlot)} Index range must not be empty"); } // Resize the geometry buffers m_vbuf.Resize(n); m_ibuf.Resize(n); m_nbuf.Resize(1 + (Options.PointsOnLinePlot ? 1 : 0)); // Create the vertex/index data int vert = 0, indx = 0; var col = Options.Colour; var x_range = RangeF.Invalid; for (int i = 0, iend = Math.Min(n, m_data.Count - idx_range.Begi); i != iend; ++i) { var j = i + idx_range.Begi; var pt = m_data[j]; var v = vert; m_vbuf[vert++] = new View3d.Vertex(new v4((float)pt.xf, (float)pt.yf, 0f, 1f), col); m_ibuf[indx++] = (ushort)(v); x_range.Grow(pt.xf); } // Create a nugget for the list strip using the thick line shader { var mat = View3d.Material.New(); mat.Use(View3d.ERenderStep.ForwardRender, View3d.EShaderGS.ThickLineListGS, $"*LineWidth {{{Options.LineWidth}}}"); m_nbuf[0] = new View3d.Nugget(View3d.ETopo.LineStrip, View3d.EGeom.Vert | View3d.EGeom.Colr, mat: mat); } // Create a nugget for the points (if visible) if (Options.PointsOnLinePlot) { var mat = View3d.Material.New(); mat.m_diff_tex = View3d.Texture.FromStock((View3d.EStockTexture)Options.PointStyle)?.Handle ?? IntPtr.Zero; mat.Use(View3d.ERenderStep.ForwardRender, View3d.EShaderGS.PointSpritesGS, $"*PointSize {{{Options.PointSize} {Options.PointSize}}} *Depth {{{false}}}"); m_nbuf[1] = new View3d.Nugget(View3d.ETopo.PointList, View3d.EGeom.Vert | View3d.EGeom.Colr | View3d.EGeom.Tex0, range_overlaps: true, mat: mat); } // Create the graphics var gfx = new View3d.Object($"{Name}-[{idx_range.Beg},{idx_range.End})", 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray(), Id); return(new ChartGfxPiece(gfx, x_range)); }
public QuadNode(string text, v4?size = null, m4x4?position = null, NodeStyle?style = null) : base(size ?? new v4(50, 50, 0, 0), Guid.NewGuid(), text, position, style) { Size = Style.AutoSize ? PreferredSize(SizeMax) : Size; // Create a texture for drawing the node content into Surf = new Surface(Size.xi, Size.yi); // Create a quad model var ldr = new LdrBuilder(); ldr.Rect("node", Colour32.White, EAxisId.PosZ, Size.x, Size.y, true, (float)Style.CornerRadius, v4.Origin); Gfx = new View3d.Object(ldr, false, null, null); Gfx.SetTexture(Surf.Surf); }
protected override void UpdateGfxCore() { var snr_colour = Settings.Colour.ToArgbU(); var width = Settings.GraphicsWidth * Chart.XAxis.Span; var attr = Settings.Attribute; var power = Settings.Power; var count = Levels.Count; if (count <= 1) { Gfx = null; return; } // Create graphics for the support and resistance data m_vbuf.Resize(count * 2); m_ibuf.Resize(count * 2); m_nbuf.Resize(1); var values = attr == EAttribute.MedianCount ? Levels.Select(x => x.Median).Normalise() : attr == EAttribute.TradeVolume ? Levels.Select(x => x.Volume).Normalise() : attr == EAttribute.TimeAtLevel ? Levels.Select(x => x.Time).Normalise() : null; int l = 0, v = 0, i = 0; foreach (var value in values) { var x = (float)(Math.Pow(value, power) * width); var y = (float)(Levels[l].Price); ++l; m_ibuf[i++] = (ushort)v; m_vbuf[v++] = new View3d.Vertex(new v4(-x, y, 0, 1)); m_ibuf[i++] = (ushort)v; m_vbuf[v++] = new View3d.Vertex(new v4(0, y, 0, 1)); } m_nbuf[0] = new View3d.Nugget(View3d.EPrim.TriStrip, View3d.EGeom.Vert, 0, (uint)v, 0, (uint)i, !Bit.AllSet(snr_colour, 0xFF000000)); // Create the graphics Gfx = new View3d.Object(Name, snr_colour, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray()); base.UpdateGfxCore(); }
protected override void UpdateGfxCore() { var line_colour = (Selected ? Settings.Colour.Lerp(Color.Gray, 0.2f) : Settings.Colour).ToArgbU(); var region_colour = (Selected ? Settings.RegionColour.Lerp(Color.Gray, 0.2f) : Settings.RegionColour).ToArgbU(); var width = (float)Chart.XAxis.Span; // Create graphics for the horizontal line m_vbuf.Resize(2 + (Level.WidthPips != 0 ? 4 : 0)); m_ibuf.Resize(2 + (Level.WidthPips != 0 ? 6 : 0)); m_nbuf.Resize(1 + (Level.WidthPips != 0 ? 1 : 0)); m_vbuf[0] = new View3d.Vertex(new v4(0, 0, 0, 1), line_colour); m_vbuf[1] = new View3d.Vertex(new v4(width, 0, 0, 1), line_colour); m_ibuf[0] = 0; m_ibuf[1] = 1; var mat = new View3d.Material(shader: View3d.EShader.ThickLineListGS, shader_data: new int[4] { Settings.LineWidth, 0, 0, 0 }); m_nbuf[0] = new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, 2, 0, 2, !Bit.AllSet(line_colour, 0xFF000000), mat); if (Level.WidthPips != 0) { var hh = (float)(Instrument.PriceData.PipSize * Level.WidthPips / 2.0); m_vbuf[2] = new View3d.Vertex(new v4(0, -hh, 0, 1), region_colour); m_vbuf[3] = new View3d.Vertex(new v4(width, -hh, 0, 1), region_colour); m_vbuf[4] = new View3d.Vertex(new v4(0, +hh, 0, 1), region_colour); m_vbuf[5] = new View3d.Vertex(new v4(width, +hh, 0, 1), region_colour); m_ibuf[2] = 2; m_ibuf[3] = 3; m_ibuf[4] = 5; m_ibuf[5] = 5; m_ibuf[6] = 4; m_ibuf[7] = 2; m_nbuf[1] = new View3d.Nugget(View3d.EPrim.TriList, View3d.EGeom.Vert | View3d.EGeom.Colr, 2, 6, 2, 8, !Bit.AllSet(region_colour, 0xFF000000)); } // Create the graphics Gfx = new View3d.Object(Name, 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray()); base.UpdateGfxCore(); }
protected override void UpdateGfxCore() { // Generate the line plot for the visible area of the chart // Get the visible X axis range, and convert it to positive indices var first_idx = Instrument.FirstIdx; var rng = Instrument.IndexRange((int)(Chart.XAxis.Min - 1), (int)(Chart.XAxis.Max + 1)); rng.Beg = Maths.Clamp(rng.Beg - first_idx, 0, m_trend.Count); rng.End = Maths.Clamp(rng.End - first_idx, 0, m_trend.Count); if (rng.Counti == 0) { Gfx = null; return; } m_vbuf.Clear(); m_ibuf.Clear(); m_nbuf.Clear(); var bullish_colour = Settings.BullishColour.ToArgbU(); var bearish_colour = Settings.BearishColour.ToArgbU(); var y_scale = Chart.YAxis.Span * Settings.Scale; for (var i = rng.Begi; i < rng.Endi - 1; ++i) { var trend0 = m_trend[i]; var trend1 = m_trend[i + 1]; m_vbuf.Add(new View3d.Vertex(new v4(first_idx + i + 0, (float)Math.Abs(trend0 * y_scale), 0, 1f), trend0 >= 0 ? bullish_colour : bearish_colour)); m_vbuf.Add(new View3d.Vertex(new v4(first_idx + i + 1, (float)Math.Abs(trend1 * y_scale), 0, 1f), trend0 >= 0 ? bullish_colour : bearish_colour)); m_ibuf.Add((ushort)(m_vbuf.Count - 2)); m_ibuf.Add((ushort)(m_vbuf.Count - 1)); } var mat = new View3d.Material(shader: View3d.EShader.ThickLineListGS, shader_data: new[] { Settings.Width, 0, 0, 0 }); m_nbuf.Add(new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, (uint)m_vbuf.Count, 0, (uint)m_ibuf.Count, false, mat)); // Create the graphics Gfx = new View3d.Object(Name, 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray()); base.UpdateGfxCore(); }
protected override void UpdateGfxCore() { var line_colour = (Selected ? Settings.Colour.Lerp(Color.Gray, 0.5f) : Settings.Colour).ToArgbU(); var region_colour = (Selected ? Settings.RegionColour.Lerp(Color.Gray, 0.5f) : Settings.RegionColour).ToArgbU(); var region_height = Settings.RegionHeight; var width = (float)Chart.XAxis.Span; // Create graphics for the horizontal line m_vbuf.Resize(2 + (region_height != 0 ? 4 : 0)); m_ibuf.Resize(2 + (region_height != 0 ? 6 : 0)); m_nbuf.Resize(1 + (region_height != 0 ? 1 : 0)); m_vbuf[0] = new View3d.Vertex(new v4(0, 0, 0, 1), line_colour); m_vbuf[1] = new View3d.Vertex(new v4(width, 0, 0, 1), line_colour); m_ibuf[0] = 0; m_ibuf[1] = 1; m_nbuf[0] = new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, 2, 0, 2); if (region_height != 0) { var half_height = (float)(Instrument.PriceData.PipSize * region_height / 2.0); m_vbuf[2] = new View3d.Vertex(new v4(0, -half_height, 0, 1), region_colour); m_vbuf[3] = new View3d.Vertex(new v4(width, -half_height, 0, 1), region_colour); m_vbuf[4] = new View3d.Vertex(new v4(0, +half_height, 0, 1), region_colour); m_vbuf[5] = new View3d.Vertex(new v4(width, +half_height, 0, 1), region_colour); m_ibuf[2] = 2; m_ibuf[3] = 3; m_ibuf[4] = 5; m_ibuf[5] = 5; m_ibuf[6] = 4; m_ibuf[7] = 2; m_nbuf[1] = new View3d.Nugget(View3d.EPrim.TriList, View3d.EGeom.Vert | View3d.EGeom.Colr, 2, 6, 2, 8, !Bit.AllSet(region_colour, 0xFF000000)); } // Create the graphics Gfx = new View3d.Object(Name, 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray()); base.UpdateGfxCore(); }
public Joypad() { m_gfx = new View3d.Object(); EditControl = null; }
public FormView3d() { InitializeComponent(); m_view3d = new View3dControl { Name = "m_view3d", BorderStyle = BorderStyle.FixedSingle, Dock = DockStyle.Fill, }; Controls.Add(m_view3d); m_demo_objs = m_view3d.Window.CreateDemoScene(); m_view3d.Camera.ResetView(); m_view3d.Camera.Lookat(new v4(10f, 10f, 5f, 1f), v4.Origin, v4.YAxis); // Simple create object m_obj0 = new View3d.Object("*Box test FFFFFFFF {1 2 3}", false, null); m_obj0.O2P = m4x4.Transform(0.5f, -0.3f, 0.2f, new v4(-0.3f, 1.2f, 0.5f, 1f)); m_view3d.Window.AddObject(m_obj0); m_obj0.ShowNormals = true; m_view3d.Window.Diag.NormalsLength = 0.5f; m_view3d.Window.Diag.NormalsColour = Colour32.Yellow; // Create a texture and assign it to an object m_tex0 = new View3d.Texture(100, 100, new View3d.TextureOptions { GdiCompatible = true }); using (var tex = new View3d.Texture.Lock(m_tex0, discard: true)) { tex.Gfx.Clear(Color.DarkBlue); tex.Gfx.FillEllipse(Brushes.RoyalBlue, 10, 10, 80, 80); tex.Gfx.DrawString("Paul Rulz", SystemFonts.DefaultFont, Brushes.Black, new PointF(30, 40)); } m_view3d.Window.RestoreRT(); m_obj0.SetTexture(m_tex0); // Create object via callback m_obj1 = new View3d.Object("net", 0xFF0000FF, 20, 20, 1, CreateOnlyCB, null); m_view3d.Window.AddObject(m_obj1); // Create an object with a texture from a rendered scene m_obj2 = new View3d.Object("*Box Rt FFFFFFFF {0.7 0.9 0.4}", false, null); m_obj2.O2P = m4x4.Transform(-0.5f, 0.4f, 0.6f, new v4(0.5f, -0.2f, -0.3f, 1f)); m_view3d.Window.AddObject(m_obj2); // Create a texture and use it as a render target m_tex2 = new View3d.Texture(200, 200, new View3d.TextureOptions { Format = View3d.EFormat.DXGI_FORMAT_R8G8B8A8_UNORM, Mips = 1U, Filter = View3d.EFilter.D3D11_FILTER_MIN_MAG_MIP_LINEAR, AddrU = View3d.EAddrMode.D3D11_TEXTURE_ADDRESS_CLAMP, AddrV = View3d.EAddrMode.D3D11_TEXTURE_ADDRESS_CLAMP, BindFlags = View3d.EBindFlags.D3D11_BIND_SHADER_RESOURCE | View3d.EBindFlags.D3D11_BIND_RENDER_TARGET, MiscFlags = View3d.EResMiscFlags.NONE, ColourKey = 0, HasAlpha = false, GdiCompatible = false, DbgName = "Test RT", }); m_view3d.Paint += (s, a) => { // Make sure 'm_obj' is not rendered (because it uses the texture we're rendering to) m_view3d.Window.RemoveObject(m_obj2); m_view3d.Window.SetRT(m_tex2, null, false); m_view3d.Window.AddObject(m_obj2); }; m_obj2.SetTexture(m_tex2); // Create a gizmo for moving objects in the scene // Position it at the origin of m_obj0 and scale by 2 m_giz = new View3d.Gizmo(View3d.Gizmo.EMode.Scale, m_obj0.O2P * m4x4.Scale(0.1f, v4.Origin)); m_giz.Attach(m_obj0); m_giz.Moved += (s, a) => { m_status.SetStatusMessage(msg: "Gizmo", display_time: TimeSpan.FromSeconds(2)); }; m_view3d.Window.AddGizmo(m_giz); m_btn_translate.Click += (s, a) => m_giz.Mode = View3d.Gizmo.EMode.Translate; m_btn_rotate.Click += (s, a) => m_giz.Mode = View3d.Gizmo.EMode.Rotate; m_btn_scale.Click += (s, a) => m_giz.Mode = View3d.Gizmo.EMode.Scale; // Create an object from buffers created in C# { var verts = new View3d.Vertex[] { new View3d.Vertex(new v4(1f, 1f, 0f, 1f), 0xFFFF0000), new View3d.Vertex(new v4(2f, 0f, 0f, 1f), 0xFF00FF00), new View3d.Vertex(new v4(3f, 1f, 0f, 1f), 0xFF0000FF), }; var indcs = new ushort[] { 0, 1, 2 }; var nuggets = new View3d.Nugget[] { new View3d.Nugget(View3d.ETopo.TriList, View3d.EGeom.Vert | View3d.EGeom.Colr) }; m_obj3 = new View3d.Object("Obj3", 0xFFFFFFFF, 3, 3, 1, verts, indcs, nuggets, null); m_view3d.Window.AddObject(m_obj3); } }
/// <summary>Create a bar graph</summary> private ChartGfxPiece CreateBarPlot(RangeI idx_range) { var n = idx_range.Sizei; // Resize the geometry buffers m_vbuf.Resize(4 * n); m_ibuf.Resize(6 * n); m_nbuf.Resize(1); // Create the vertex/index data int vidx = 0, iidx = 0, nidx = 0; var col = Options.Colour; var lwidth = (0.0 - Options.BarHorizontalAlignment) * Options.BarWidth; var rwidth = (1.0 - Options.BarHorizontalAlignment) * Options.BarWidth; var x_range = RangeF.Invalid; for (int i = 0; i != n; ++i) { // Get the points on either side of 'i' var j = i + idx_range.Begi; var pt_l = j != 0 ? m_data[j - 1] : null; var pt = m_data[j]; var pt_r = j + 1 != m_data.Count ? m_data[j + 1] : null; // Get the distance to the left and right of 'pt.x' var l = pt_l != null ? lwidth * (pt_l.xf - pt.xf) : 0; var r = pt_r != null ? rwidth * (pt_r.xf - pt.xf) : 0; if (j == 0 && j + 1 != m_data.Count && pt_r != null) { l = -lwidth * (pt_r.xf - pt.xf); } if (j + 1 == m_data.Count && j != 0 && pt_l != null) { r = -rwidth * (pt_l.xf - pt.xf); } var v = vidx; m_vbuf[vidx++] = new View3d.Vertex(new v4((float)(pt.xf + r), (float)(pt.yf >= 0f ? pt.yf : 0f), 0f, 1f), col); m_vbuf[vidx++] = new View3d.Vertex(new v4((float)(pt.xf - l), (float)(pt.yf >= 0f ? pt.yf : 0f), 0f, 1f), col); m_vbuf[vidx++] = new View3d.Vertex(new v4((float)(pt.xf - l), (float)(pt.yf >= 0f ? 0f : pt.yf), 0f, 1f), col); m_vbuf[vidx++] = new View3d.Vertex(new v4((float)(pt.xf + r), (float)(pt.yf >= 0f ? 0f : pt.yf), 0f, 1f), col); m_ibuf[iidx++] = (ushort)(v + 0); m_ibuf[iidx++] = (ushort)(v + 1); m_ibuf[iidx++] = (ushort)(v + 2); m_ibuf[iidx++] = (ushort)(v + 2); m_ibuf[iidx++] = (ushort)(v + 3); m_ibuf[iidx++] = (ushort)(v + 0); x_range.Grow(pt.xf); } // Create a nugget for the tri list uint v0 = 0, v1 = (uint)vidx; uint i0 = 0, i1 = (uint)iidx; var flags = col.A != 0xff ? View3d.ENuggetFlag.GeometryHasAlpha : View3d.ENuggetFlag.None; m_nbuf[nidx++] = new View3d.Nugget(View3d.ETopo.TriList, View3d.EGeom.Vert | View3d.EGeom.Colr, v0, v1, i0, i1, flags); // Add the bar 'tops' if (Options.LinesOnBarPlot) { // Use line strips m_vbuf.Resize(m_vbuf.Count + n * 2); m_ibuf.Resize(m_ibuf.Count + n * 2); m_nbuf.Resize(m_nbuf.Count + 1); var line_colour = col.Darken(0.25f).Alpha(1f); for (int i = 0; i != n; ++i) { var vert0 = m_vbuf[i * 4 + 0]; var vert1 = m_vbuf[i * 4 + 1]; var v = vidx; m_vbuf[vidx++] = new View3d.Vertex(vert0.m_pos, line_colour); m_vbuf[vidx++] = new View3d.Vertex(vert1.m_pos, line_colour); m_ibuf[iidx++] = (ushort)(v + 0); m_ibuf[iidx++] = (ushort)(v + 1); } // Create a nugget for the bar tops v0 = v1; v1 += (uint)(n * 2); i0 = i1; i1 += (uint)(n * 2); m_nbuf[nidx++] = new View3d.Nugget(View3d.ETopo.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, v0, v1, i0, i1); } // Create the graphics var gfx = new View3d.Object($"{Name}-[{idx_range.Beg},{idx_range.End})", 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray(), Id); return(new ChartGfxPiece(gfx, x_range)); }
protected override void UpdateGfxCore() { // Generate the EMA line for the visible area of the chart var ema_colour = Settings.ColourEMA.ToArgbU(); var bol_colour = Settings.ColourBollingerBands.ToArgbU(); // Get the visible X axis range, and convert it to positive indices var first_idx = Instrument.FirstIdx; var rng = Instrument.IndexRange((int)(Chart.XAxis.Min - 1), (int)(Chart.XAxis.Max + 1)); rng.Beg = Maths.Clamp(rng.Beg - first_idx, 0, m_ema.Count); rng.End = Maths.Clamp(rng.End - first_idx, 0, m_ema.Count); if (rng.Counti == 0) { Gfx = null; return; } var count = rng.Counti; m_vbuf.Resize(count); m_ibuf.Resize((count - 1) * 2); m_nbuf.Resize(1); // EMA model var v = 0; var i = 0; foreach (var candle_index in rng) { var ema = m_ema[(int)candle_index]; m_vbuf[v++] = new View3d.Vertex(new v4(candle_index + first_idx, (float)ema.Mean, ChartUI.Z.Indicators, 1f), ema_colour); } for (var vi = 0; i != m_ibuf.Count; ++vi) { m_ibuf[i++] = (ushort)(vi); m_ibuf[i++] = (ushort)(vi + 1); } var mat = new View3d.Material(shader: View3d.EShader.ThickLineListGS, shader_data: new[] { Settings.Width, 0, 0, 0 }); m_nbuf[0] = new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, (uint)v, 0, (uint)i, false, mat); // Add geometry for Bollinger bands if (Settings.BollingerBands != 0) { m_vbuf.Resize(m_vbuf.Count + 2 * count); m_ibuf.Resize(m_ibuf.Count + 2 * count); m_nbuf.Resize(m_nbuf.Count + 2); // Lower/Upper band foreach (var candle_index in rng) { var ema = m_ema[(int)candle_index]; m_vbuf[v++] = new View3d.Vertex(new v4(candle_index + first_idx, (float)(ema.Mean - Settings.BollingerBands * ema.PopStdDev), ChartUI.Z.Indicators, 1f), bol_colour); m_ibuf[i++] = (ushort)(v - 1); } m_nbuf[1] = new View3d.Nugget(View3d.EPrim.LineStrip, View3d.EGeom.Vert | View3d.EGeom.Colr, (uint)(v - count), (uint)v, (uint)(i - count), (uint)i); foreach (var candle_index in rng) { var ema = m_ema[(int)candle_index]; m_vbuf[v++] = new View3d.Vertex(new v4(candle_index + first_idx, (float)(ema.Mean + Settings.BollingerBands * ema.PopStdDev), ChartUI.Z.Indicators, 1f), bol_colour); m_ibuf[i++] = (ushort)(v - 1); } m_nbuf[2] = new View3d.Nugget(View3d.EPrim.LineStrip, View3d.EGeom.Vert | View3d.EGeom.Colr, (uint)(v - count), (uint)v, (uint)(i - count), (uint)i); } // Create the graphics Gfx = new View3d.Object(Name, 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray()); base.UpdateGfxCore(); }
protected override void UpdateGfxCore() { // Find the index range in the Instrument history that 'Order' maps to var t0 = new TFTime(Order.EntryTimeUTC.Ticks, Instrument.TimeFrame); var t1 = new TFTime(Order.ExitTimeUTC.Ticks, Instrument.TimeFrame); var range = Instrument.TimeToIndexRange(t0, t1); // If the expiry is in the future, add on the expected number of candles var t2 = t1.ExactUTC > Instrument.Latest.TimestampUTC ? (int)new TFTime(t1.ExactUTC - Instrument.Latest.TimestampUTC, Instrument.TimeFrame).IntgTF : 0; // Determine the width and position of the order var x = (float)(range.Begi - range.Endi); var w = (float)(range.Sizei + t2); // Get the entry price, stop loss, and take profit values var ep = (float)Order.EntryPrice; var sl = (float)Order.StopLossRel; var tp = (float)Order.TakeProfitRel; // Create graphics for the order switch (Order.TradeType) { default: { Debug.Assert(false, "Unknown trade type"); Gfx = null; break; } case ETradeType.None: { Gfx = null; break; } case ETradeType.Short: case ETradeType.Long: { var sign = Order.TradeType == ETradeType.Long ? +1 : -1; var selected = Selected || Hovered; var alpha = selected ? 0.5f : 0.25f; var z = ChartUI.Z.Trades + (selected ? 0.0001f : 0f); var sl_col = Settings.Chart.TradeLossColour.Alpha(alpha); var tp_col = Settings.Chart.TradeProfitColour.Alpha(alpha); var ep_col = Color.DarkBlue; var line_col = Order.TradeType == ETradeType.Long ? Settings.UI.BullishColour.Alpha(0x60) : Settings.UI.BearishColour.Alpha(0x60); var xmin = selected ? (float)Chart.XAxis.Min : x - 0; var xmax = selected ? (float)Chart.XAxis.Max : x + w; m_vbuf.Clear(); m_ibuf.Clear(); m_nbuf.Clear(); var V = 0U; var I = 0U; // Take profit area if (tp > 0) { var v = m_vbuf.Count; var y0 = sign > 0 ? Math.Max(ep, ep - sl) : ep - tp; var y1 = sign > 0 ? ep + tp : Math.Min(ep, ep + sl); m_vbuf.Add(new View3d.Vertex(new v4(x, y0, z, 1), tp_col.ToArgbU())); m_vbuf.Add(new View3d.Vertex(new v4(x + w, y0, z, 1), tp_col.ToArgbU())); m_vbuf.Add(new View3d.Vertex(new v4(x, y1, z, 1), tp_col.ToArgbU())); m_vbuf.Add(new View3d.Vertex(new v4(x + w, y1, z, 1), tp_col.ToArgbU())); m_ibuf.AddRange(new[] { (ushort)v, (ushort)(v + 1), (ushort)(v + 3), (ushort)(v + 3), (ushort)(v + 2), (ushort)v }); } // Stop loss area if (sl > 0) { var v = m_vbuf.Count; var y0 = sign > 0 ? ep - sl : Math.Max(ep, ep - tp); var y1 = sign > 0 ? Math.Min(ep, ep + tp) : ep + sl; m_vbuf.Add(new View3d.Vertex(new v4(x, y0, z, 1), sl_col.ToArgbU())); m_vbuf.Add(new View3d.Vertex(new v4(x + w, y0, z, 1), sl_col.ToArgbU())); m_vbuf.Add(new View3d.Vertex(new v4(x, y1, z, 1), sl_col.ToArgbU())); m_vbuf.Add(new View3d.Vertex(new v4(x + w, y1, z, 1), sl_col.ToArgbU())); m_ibuf.AddRange(new[] { (ushort)v, (ushort)(v + 1), (ushort)(v + 3), (ushort)(v + 3), (ushort)(v + 2), (ushort)v }); } m_nbuf.Add(new View3d.Nugget(View3d.EPrim.TriList, View3d.EGeom.Vert | View3d.EGeom.Colr, V, (uint)m_vbuf.Count, I, (uint)m_ibuf.Count, true)); V = (uint)m_vbuf.Count; I = (uint)m_ibuf.Count; // Entry Price line { var v = m_vbuf.Count; m_vbuf.Add(new View3d.Vertex(new v4(xmin, ep, z, 1), Color.DarkBlue.ToArgbU())); m_vbuf.Add(new View3d.Vertex(new v4(xmax, ep, z, 1), Color.DarkBlue.ToArgbU())); m_ibuf.AddRange(new[] { (ushort)v, (ushort)(v + 1) }); } // Take Profit line { var v = m_vbuf.Count; m_vbuf.Add(new View3d.Vertex(new v4(xmin, ep + sign * tp, z, 1), Color.DarkGreen.ToArgbU())); m_vbuf.Add(new View3d.Vertex(new v4(xmax, ep + sign * tp, z, 1), Color.DarkGreen.ToArgbU())); m_ibuf.AddRange(new[] { (ushort)v, (ushort)(v + 1) }); } // Stop Loss line { var v = m_vbuf.Count; m_vbuf.Add(new View3d.Vertex(new v4(xmin, ep - sign * sl, z, 1), Color.DarkRed.ToArgbU())); m_vbuf.Add(new View3d.Vertex(new v4(xmax, ep - sign * sl, z, 1), Color.DarkRed.ToArgbU())); m_ibuf.AddRange(new[] { (ushort)v, (ushort)(v + 1) }); } m_nbuf.Add(new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, V, (uint)m_vbuf.Count, I, (uint)m_ibuf.Count, true)); // Create the geometry Gfx = new View3d.Object("Order", 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray()); break; } } base.UpdateGfxCore(); }