Example #1
0
        /// <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));
        }
Example #2
0
        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;
        }
Example #3
0
        /// <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));
        }
Example #4
0
        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();
        }
Example #5
0
        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);
        }
Example #6
0
 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);
 }
Example #7
0
 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;
 }
Example #8
0
        protected override void UpdateGfxCore()
        {
            base.UpdateGfxCore();

            var ldr =
                $"Group* price_range\n" +
                $"{{\n" +

                $"}}\n";

            Gfx = new View3d.Object(ldr, false, Id, null);
        }
Example #9
0
        /// <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));
        }
Example #10
0
        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);
        }
Example #11
0
        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();
        }
Example #12
0
        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();
        }
Example #13
0
        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();
        }
Example #14
0
        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();
        }
Example #15
0
 public Joypad()
 {
     m_gfx       = new View3d.Object();
     EditControl = null;
 }
Example #16
0
        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);
            }
        }
Example #17
0
        /// <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));
        }
Example #18
0
        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();
        }
Example #19
0
        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();
        }