/// <summary>Repopulate the tree grid of trades</summary> private void UpdateGrid(object sender = null, EventArgs args = null) { // Update the tree grid using differences so that expanded/collapsed nodes are preserved using (m_grid.SuspendLayout(true)) { var trades = Trades.Where(x => Bit.AllSet(x.State, Settings.UI.ShowTrades)).ToHashSet(); // Remove any root level nodes that aren't in the trades list m_grid.RootNode.Nodes.RemoveIf(x => !trades.Contains(x.DataBoundItem)); // Update the trades foreach (var trade in Trades.Where(x => Bit.AllSet(x.State, Settings.UI.ShowTrades))) { // Get the node for 'trade'. If the trade is not yet in the tree grid, add it var node = m_grid.RootNode.Nodes.FirstOrDefault(x => x.DataBoundItem == trade) ?? m_grid.RootNode.Nodes.Bind(trade); var orders = trade.Orders.Where(x => Bit.AllSet(x.State, Settings.UI.ShowTrades)).ToHashSet(); // Remove any orders not in the trade node.Nodes.RemoveIf(x => !orders.Contains(x.DataBoundItem)); // Add any orders not yet in the grid orders.RemoveWhere(x => node.Nodes.Any(n => n.DataBoundItem == x)); foreach (var order in orders.Where(x => Bit.AllSet(x.State, Settings.UI.ShowTrades))) { node.Nodes.Bind(order); } } } m_grid.Invalidate(); }
/// <summary>Update UI elements</summary> private void UpdateUI(object sender = null, EventArgs args = null) { m_btn_active_trades.Checked = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.ActivePosition); m_btn_pending_orders.Checked = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.PendingOrder); m_btn_visualising_orders.Checked = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.Visualising); m_btn_closed_orders.Checked = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.Closed); m_grid.Invalidate(); }
public void OnMouseDblClick(object sender, MouseEventArgs e) { if (Window == null) { return; } if (Bit.AllSet((int)e.Button, (int)MouseButtons.Middle) || Bit.AllSet((int)e.Button, (int)(MouseButtons.Left | MouseButtons.Right))) { Camera.ResetZoom(); Invalidate(); } }
[Test] public void HasFlag() { const NonFlags nf = NonFlags.One; const Flags f = Flags.One; Assert.Throws(typeof(ArgumentException), () => Assert.True(f.HasFlag(nf))); Assert.True(f.HasFlag(Flags.One)); Assert.False(f.HasFlag(Flags.One | Flags.Two)); Assert.True(Bit.AllSet(f, Flags.One)); Assert.False(Bit.AllSet(f, Flags.Two)); var mask = Bit.SetBits(f, Flags.One | Flags.Two | Flags.Three, true); Assert.Equal(mask, Flags.One | Flags.Two | Flags.Three); }
public ListBoxUI() { InitializeComponent(); m_lb.DataSource = new[] { "Item1", "Item2", "Item3", "Item4", "Item5" }; m_lb.DrawItem += (s, a) => { if (a.Index < 0 || a.Index >= m_lb.Items.Count) { return; } var item = (string)m_lb.Items[a.Index]; a.Graphics.FillRectangle(Bit.AllSet(a.State, DrawItemState.Selected) ? Brushes.WhiteSmoke : Brushes.White, a.Bounds); a.Graphics.DrawString(item, a.Font, Brushes.Blue, a.Bounds.TopLeft()); }; }
/// <summary>Called to 'discover' a new element</summary> public void DiscoverElement(int atomic_number) { var element = m_elements[atomic_number - 1]; Debug.Assert(!Bit.AllSet((int)element.KnownProperties, (int)EElemProp.Existence), "Element already discovered"); element.KnownProperties |= EElemProp.Existence; element.KnownProperties |= EElemProp.Name; var e = new Element(atomic_number, m_consts); // Update any materials that are based on this element foreach (var m in m_compounds.Related(element)) { m.UpdateName(); } // We now know of it's existence, and it's been named UpdateKnown(); RaiseDiscovery(element); }
/// <summary>Convert this mouse button flag into an index of first button that is down</summary> public static int ButtonIndex(MouseButtons button) { if (Bit.AllSet(button, MouseButtons.Left)) { return(1); } if (Bit.AllSet(button, MouseButtons.Right)) { return(2); } if (Bit.AllSet(button, MouseButtons.Middle)) { return(3); } if (Bit.AllSet(button, MouseButtons.XButton1)) { return(4); } if (Bit.AllSet(button, MouseButtons.XButton2)) { return(5); } return(0); }
/// <summary>Called after 'path' has been added to the collection</summary> private void HandlePathAdded(Path path) { // Look for paths that would include 'path' already var p = new StringBuilder(); var parts = path.Name.Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0, iend = parts.Length - 1; i < iend; ++i) { p.Append(parts[i]).Append("\\"); // If a parent path is in the collection already, we don't need 'path' var idx = Paths.BinarySearch(p.ToString(), Path.Compare); if (idx >= 0) { idx = Paths.BinarySearch(path, Path.Compare); if (idx >= 0) { Paths.RemoveAt(idx); } return; } } // Remove any paths that are children of 'path' { var idx = Paths.BinarySearch(path, Path.Compare); if (idx < 0) { idx = ~idx; } else { ++idx; } // Find the range of paths to remove var count = Paths.Skip(idx).Count(x => x.Name.StartsWith(path.Name)); Paths.RemoveRange(idx, count); } // Check the siblings of 'path', if all are in 'Paths' then we can remove // all of these child paths and replace it with the parent path p.Clear().Append(path.Name); for (int i = parts.Length; i-- != 0;) { p.Length -= parts[i].Length + 1; if (p.Length == 0 || !Path_.EnumFileSystem(p.ToString(), SearchOption.TopDirectoryOnly) .Where(x => Bit.AllSet(x.Attributes, FileAttributes.Directory)) .All(x => Paths.BinarySearch(x.FullName, Path.Compare) >= 0)) { break; // Not all child paths of 'p' are in 'Paths' } // Do this as we go, because the test above needs paths we add here using (Paths.SuspendEvents(true)) { var parent = new Path(path.Text.Substring(0, p.Length)); var idx = Paths.BinarySearch(parent, Path.Compare); if (idx < 0) { idx = ~idx; } else { throw new Exception($"Paths contains {parent} and {Paths[idx]}. {Paths[idx]} should not be in 'Paths' as it's covered by {parent}"); } // Remove all children of 'parent' var count = Paths.Skip(idx).Count(x => x.Name.StartsWith(parent.Name)); Paths.RemoveRange(idx, count); // Add 'parent' Paths.Insert(idx, parent); } } // Update the check boxes UpdateTree(); }
/// <summary>Set the values in the dialog from the settings</summary> private void SetValues() { // Image files m_check_image_files.Checked = Bit.AllSet((int)m_settings.MediaType, (int)EMediaType.Image); m_tt.SetToolTip(m_check_image_files, "Include image file formats when searching for media files"); // Video files m_check_video_files.Checked = Bit.AllSet((int)m_settings.MediaType, (int)EMediaType.Video); m_tt.SetToolTip(m_check_image_files, "Include video file formats when searching for media files"); // Audio files m_check_audio_files.Checked = Bit.AllSet((int)m_settings.MediaType, (int)EMediaType.Audio); m_tt.SetToolTip(m_check_image_files, "Include audio file formats when searching for media files"); // Image extns ExtnStringToList(m_settings.ImageExtensions, m_chklist_image_formats); m_tt.SetToolTip(m_chklist_image_formats, "Image file extensions to include when searching for media files"); // Video extns ExtnStringToList(m_settings.VideoExtensions, m_chklist_video_formats); m_tt.SetToolTip(m_chklist_video_formats, m_settings.DescAttr("VideoExtensions")); // Audio extns ExtnStringToList(m_settings.AudioExtensions, m_chklist_audio_formats); m_tt.SetToolTip(m_chklist_audio_formats, m_settings.DescAttr("AudioExtensions")); // Primary display m_combo_primary_display.Items.Clear(); m_combo_primary_display.Items.Add("Not Set"); foreach (Screen s in Screen.AllScreens) { m_combo_primary_display.Items.Add(s.DeviceName.TrimStart(new[] { '\\', '.' })); } m_combo_primary_display.SelectedIndex = m_settings.PrimaryDisplay; m_tt.SetToolTip(m_combo_primary_display, m_settings.DescAttr("PrimaryDisplay")); // Always on top m_check_always_on_top.Checked = m_settings.AlwaysOnTop; m_tt.SetToolTip(m_check_always_on_top, m_settings.DescAttr("AlwaysOnTop")); // Startup version check m_check_startup_version_check.Checked = m_settings.StartupVersionCheck; m_tt.SetToolTip(m_check_startup_version_check, m_settings.DescAttr("StartupVersionCheck")); // Allow duplicates m_check_allow_duplicates.Checked = m_settings.AllowDuplicates; m_tt.SetToolTip(m_check_allow_duplicates, m_settings.DescAttr("AllowDuplicates")); // Cache media list m_check_cache_media_list.Checked = m_settings.CacheSSMediaList; m_tt.SetToolTip(m_check_cache_media_list, m_settings.DescAttr("CacheSSMediaList")); // Reset zoom on load m_check_reset_zoom_on_load.Checked = m_settings.ResetZoomOnLoad; m_tt.SetToolTip(m_check_reset_zoom_on_load, m_settings.DescAttr("ResetZoomOnLoad")); // Zoom type m_combo_zoom_type.Items.Clear(); foreach (EZoomType e in Enum.GetValues(typeof(EZoomType))) { m_combo_zoom_type.Items.Add(e.StrAttr()); } m_combo_zoom_type.SelectedIndex = (int)m_settings.ZoomType; m_tt.SetToolTip(m_combo_zoom_type, m_settings.DescAttr("ZoomType")); // Slide show rate m_edit_slide_show_rate.Text = m_settings.SlideShowRate.ToString(); m_tt.SetToolTip(m_edit_slide_show_rate, m_settings.DescAttr("SlideShowRate")); // Folder sort order m_combo_folder_order.Items.Clear(); foreach (ESortOrder e in Enum.GetValues(typeof(ESortOrder))) { m_combo_folder_order.Items.Add(e.StrAttr()); } m_combo_folder_order.SelectedIndex = (int)m_settings.FolderOrder; m_tt.SetToolTip(m_combo_folder_order, m_settings.DescAttr("FolderOrder")); // SS Folder sort order m_combo_ss_folder_order.Items.Clear(); foreach (ESortOrder e in Enum.GetValues(typeof(ESortOrder))) { m_combo_ss_folder_order.Items.Add(e.StrAttr()); } m_combo_ss_folder_order.SelectedIndex = (int)m_settings.SSFolderOrder; m_tt.SetToolTip(m_combo_ss_folder_order, m_settings.DescAttr("SSFolderOrder")); // File sort order m_combo_file_order.Items.Clear(); foreach (ESortOrder e in Enum.GetValues(typeof(ESortOrder))) { m_combo_file_order.Items.Add(e.StrAttr()); } m_combo_file_order.SelectedIndex = (int)m_settings.FilesOrder; m_tt.SetToolTip(m_combo_file_order, m_settings.DescAttr("FilesOrder")); // SS File sort order m_combo_ss_file_order.Items.Clear(); foreach (ESortOrder e in Enum.GetValues(typeof(ESortOrder))) { m_combo_ss_file_order.Items.Add(e.StrAttr()); } m_combo_ss_file_order.SelectedIndex = (int)m_settings.SSFilesOrder; m_tt.SetToolTip(m_combo_ss_file_order, m_settings.DescAttr("SSFilesOrder")); // Show filenames m_check_show_filenames.Checked = m_settings.ShowFilenames; m_tt.SetToolTip(m_check_show_filenames, m_settings.DescAttr("ShowFilenames")); // SS Volume m_track_ss_volume.Value = m_settings.SSVolume; m_tt.SetToolTip(m_track_ss_volume, m_settings.DescAttr("SSVolume")); m_btn_apply.Enabled = false; }
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(); }
/// <summary>Set up UI elements</summary> private void SetupUI() { #region Tool bar m_btn_active_trades.Checked = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.ActivePosition); m_btn_active_trades.CheckedChanged += (s, a) => { Settings.UI.ShowTrades = Bit.SetBits(Settings.UI.ShowTrades, Trade.EState.ActivePosition, m_btn_active_trades.Checked); UpdateGrid(); }; m_btn_pending_orders.Checked = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.PendingOrder); m_btn_pending_orders.CheckedChanged += (s, a) => { Settings.UI.ShowTrades = Bit.SetBits(Settings.UI.ShowTrades, Trade.EState.PendingOrder, m_btn_pending_orders.Checked); UpdateGrid(); }; m_btn_visualising_orders.Checked = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.Visualising); m_btn_visualising_orders.CheckedChanged += (s, a) => { Settings.UI.ShowTrades = Bit.SetBits(Settings.UI.ShowTrades, Trade.EState.Visualising, m_btn_visualising_orders.Checked); UpdateGrid(); }; m_btn_closed_orders.Checked = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.Closed); m_btn_closed_orders.CheckedChanged += (s, a) => { Settings.UI.ShowTrades = Bit.SetBits(Settings.UI.ShowTrades, Trade.EState.Closed, m_btn_closed_orders.Checked); UpdateGrid(); }; #endregion #region Grid m_grid.AutoGenerateColumns = false; m_grid.Columns.Add(new TreeGridColumn { HeaderText = "Symbol/Order Id", DataPropertyName = nameof(Trade.SymbolCode), }); m_grid.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "State", DataPropertyName = nameof(IPosition.State), }); m_grid.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Trade Type", DataPropertyName = nameof(IPosition.TradeType), }); m_grid.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Volume", DataPropertyName = nameof(IPosition.Volume), }); m_grid.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Stop Loss", DataPropertyName = nameof(IPosition.StopLossValue), }); m_grid.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Take Profit", DataPropertyName = nameof(IPosition.TakeProfitValue), }); m_grid.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Entry Time", DataPropertyName = nameof(IPosition.EntryTimeUTC), }); m_grid.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Gross Profit", DataPropertyName = nameof(IPosition.GrossProfit), }); m_grid.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = "Net Profit", DataPropertyName = nameof(IPosition.NetProfit), }); m_grid.CellFormatting += HandleCellFormatting; m_grid.MouseClick += HandleMouseClick; m_grid.CellMouseDoubleClick += HandleCellDoubleClick; m_grid.SelectionChanged += HandleOrderSelectionChanged; #endregion }
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(); }
/// <summary>Set up UI elements</summary> private void SetupUI() { m_cb_symbols.AutoCompleteMode = AutoCompleteMode.Suggest; m_cb_symbols.AutoCompleteSource = AutoCompleteSource.ListItems; m_cb_symbols.DataSource = Misc.KnownSymbols.Keys.ToArray(); m_cb_symbols.Format += (s, a) => { var sym = (string)a.ListItem; a.Value = "{0} - {1}".Fmt(sym, Misc.KnownSymbols[sym].Desc); }; // Add trading pair m_btn_add.Click += (s, a) => { Model.AddTransmitter((string)m_cb_symbols.SelectedItem); }; // Show current pairs m_lb_symbols.BackColor = SystemColors.ControlDark; m_lb_symbols.DrawMode = DrawMode.OwnerDrawFixed; m_lb_symbols.DataSource = Model.Transmitters; m_lb_symbols.ItemHeight = 58; m_lb_symbols.DrawItem += (s, a) => { if (Model == null || a.Index < 0 || a.Index >= Model.Transmitters.Count) { a.Graphics.FillRectangle(SystemBrushes.ControlLightLight, a.Bounds); return; } var item = Model.Transmitters[a.Index]; var bnds = a.Bounds.Inflated(0, 0, -1, -1); var col = Bit.AllSet(a.State, DrawItemState.Selected) ? Brushes.WhiteSmoke : !item.Enabled ? SystemBrushes.ControlLight : SystemBrushes.ControlLightLight; var x = bnds.Left + 2f; var y = bnds.Top + 2f; a.Graphics.SmoothingMode = SmoothingMode.AntiAlias; a.Graphics.FillRectangle(SystemBrushes.ControlDark, a.Bounds); a.Graphics.FillRectangleRounded(col, bnds, 6f); a.Graphics.DrawRectangleRounded(Pens.Black, bnds, 6f); { // Paint the symbol name var str = "{0} - {1}".Fmt(item.SymbolCode, item.SymbolDescription.Desc); var font = a.Font.Dup(FontStyle.Bold); var sz = a.Graphics.MeasureString(str, font); a.Graphics.DrawString(str, font, !item.Enabled ? SystemBrushes.ControlDark : Brushes.Black, x, y); y += sz.Height; } { // Paint the time frames var tfs = item.Data.Keys.Select(t => t.ToTradeeTimeframe()).OrderBy(t => t).ToArray(); var str = "Time Frames: {0}".Fmt(string.Join(" ", tfs.Select(t => t.Desc()))); var sz = a.Graphics.MeasureString(str, a.Font); a.Graphics.DrawString(str, a.Font, !item.Enabled ? SystemBrushes.ControlDark : item.RequestingSeriesData ? Brushes.DarkRed : Brushes.Green, x, y); y += sz.Height; } { // Paint the last update time var tss = item.Data.Values.Select(v => v.LastTransmitUTC).ToArray(); var ts = tss.Length != 0 ? tss.MaxBy(t => t) : DateTimeOffset.MinValue; var str = "Last Update: {0}".Fmt(ts != DateTimeOffset.MinValue ? ts.ToString("yyyy/MM/dd HH:mm:ss") : "never"); var sz = a.Graphics.MeasureString(str, a.Font); a.Graphics.DrawString(str, a.Font, !item.Enabled ? SystemBrushes.ControlDark : Brushes.Blue, x, y); y += sz.Height; } { // Paint the status var msg = item.StatusMsg; var str = "Status: {0}".Fmt(msg); var sz = a.Graphics.MeasureString(str, a.Font); a.Graphics.DrawString(str, a.Font, !item.Enabled ? SystemBrushes.ControlDark : SystemBrushes.ControlDarkDark, x, y); y += sz.Height; } }; m_lb_symbols.MouseDown += (s, a) => { if (a.Button == MouseButtons.Right) { ShowContextMenu(a.Location); } }; }
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(); }