mirror of
https://github.com/Ryujinx/Opentk.git
synced 2024-12-24 15:45:34 +00:00
New sample browser with documentation and source code display.
Reduced example categories to OpenGL, OpenAL, OpenTK. Updated all samples to reflect this change. Moved startup and loading code into separate files.
This commit is contained in:
parent
ce6dc6870f
commit
7851bbff84
|
@ -17,19 +17,22 @@ namespace Examples
|
|||
bool visible = true;
|
||||
public string Title { get { return title; } internal set { title = value; } }
|
||||
public readonly ExampleCategory Category;
|
||||
public readonly int Difficulty;
|
||||
public readonly string Subcategory;
|
||||
public int Difficulty;
|
||||
public string Documentation;
|
||||
public bool Visible { get { return visible; } set { visible = value; } }
|
||||
|
||||
public ExampleAttribute(string title, ExampleCategory category)
|
||||
: this(title, category, 0, true) { }
|
||||
public ExampleAttribute(string title, ExampleCategory category, string subcategory)
|
||||
: this(title, category, subcategory, 0, true) { }
|
||||
|
||||
public ExampleAttribute(string title, ExampleCategory category, int difficulty)
|
||||
: this(title, category, difficulty, true) { }
|
||||
public ExampleAttribute(string title, ExampleCategory category, string subcategory, int difficulty)
|
||||
: this(title, category, subcategory, difficulty, true) { }
|
||||
|
||||
public ExampleAttribute(string title, ExampleCategory category, int difficulty, bool visible)
|
||||
public ExampleAttribute(string title, ExampleCategory category, string subcategory, int difficulty, bool visible)
|
||||
{
|
||||
this.Title = title;
|
||||
this.Category = category;
|
||||
this.Subcategory = subcategory;
|
||||
this.Difficulty = difficulty;
|
||||
this.Visible = visible;
|
||||
}
|
||||
|
@ -44,12 +47,9 @@ namespace Examples
|
|||
|
||||
public enum ExampleCategory
|
||||
{
|
||||
OpenGL = 0,
|
||||
Default = 0,
|
||||
OpenTK = Default,
|
||||
OpenGL,
|
||||
OpenAL,
|
||||
Tutorial,
|
||||
GLSL,
|
||||
WinForms,
|
||||
Test,
|
||||
Last
|
||||
}
|
||||
}
|
||||
|
|
343
Source/Examples/ExampleBrowser.Designer.cs
generated
Normal file
343
Source/Examples/ExampleBrowser.Designer.cs
generated
Normal file
|
@ -0,0 +1,343 @@
|
|||
namespace Examples
|
||||
{
|
||||
partial class ExampleBrowser
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExampleBrowser));
|
||||
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
||||
this.treeViewSamples = new System.Windows.Forms.TreeView();
|
||||
this.contextMenuStripSamples = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||
this.runSampleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.viewDescriptionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.viewSourceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.imageListSampleCategories = new System.Windows.Forms.ImageList(this.components);
|
||||
this.tabControlSample = new System.Windows.Forms.TabControl();
|
||||
this.tabDescription = new System.Windows.Forms.TabPage();
|
||||
this.richTextBoxDescription = new System.Windows.Forms.RichTextBox();
|
||||
this.contextMenuStripDescription = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||
this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.tabSource = new System.Windows.Forms.TabPage();
|
||||
this.richTextBoxSource = new System.Windows.Forms.RichTextBox();
|
||||
this.contextMenuStripSource = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||
this.copyToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.tabPageOutput = new System.Windows.Forms.TabPage();
|
||||
this.textBoxOutput = new System.Windows.Forms.TextBox();
|
||||
this.contextMenuStripOutput = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||
this.copyToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolTipSamples = new System.Windows.Forms.ToolTip(this.components);
|
||||
this.splitContainer1.Panel1.SuspendLayout();
|
||||
this.splitContainer1.Panel2.SuspendLayout();
|
||||
this.splitContainer1.SuspendLayout();
|
||||
this.contextMenuStripSamples.SuspendLayout();
|
||||
this.tabControlSample.SuspendLayout();
|
||||
this.tabDescription.SuspendLayout();
|
||||
this.contextMenuStripDescription.SuspendLayout();
|
||||
this.tabSource.SuspendLayout();
|
||||
this.contextMenuStripSource.SuspendLayout();
|
||||
this.tabPageOutput.SuspendLayout();
|
||||
this.contextMenuStripOutput.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// splitContainer1
|
||||
//
|
||||
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
|
||||
this.splitContainer1.Name = "splitContainer1";
|
||||
//
|
||||
// splitContainer1.Panel1
|
||||
//
|
||||
this.splitContainer1.Panel1.Controls.Add(this.treeViewSamples);
|
||||
//
|
||||
// splitContainer1.Panel2
|
||||
//
|
||||
this.splitContainer1.Panel2.Controls.Add(this.tabControlSample);
|
||||
this.splitContainer1.Size = new System.Drawing.Size(784, 564);
|
||||
this.splitContainer1.SplitterDistance = 261;
|
||||
this.splitContainer1.TabIndex = 0;
|
||||
//
|
||||
// treeViewSamples
|
||||
//
|
||||
this.treeViewSamples.ContextMenuStrip = this.contextMenuStripSamples;
|
||||
this.treeViewSamples.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.treeViewSamples.FullRowSelect = true;
|
||||
this.treeViewSamples.HideSelection = false;
|
||||
this.treeViewSamples.HotTracking = true;
|
||||
this.treeViewSamples.ImageIndex = 0;
|
||||
this.treeViewSamples.ImageList = this.imageListSampleCategories;
|
||||
this.treeViewSamples.Indent = 71;
|
||||
this.treeViewSamples.Location = new System.Drawing.Point(0, 0);
|
||||
this.treeViewSamples.Name = "treeViewSamples";
|
||||
this.treeViewSamples.SelectedImageIndex = 0;
|
||||
this.treeViewSamples.Size = new System.Drawing.Size(261, 564);
|
||||
this.treeViewSamples.TabIndex = 0;
|
||||
this.toolTipSamples.SetToolTip(this.treeViewSamples, "Right-click a sample for more options.");
|
||||
this.treeViewSamples.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeViewSamples_NodeMouseDoubleClick);
|
||||
this.treeViewSamples.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewSamples_AfterSelect);
|
||||
this.treeViewSamples.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeViewSamples_MouseDown);
|
||||
this.treeViewSamples.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeViewSamples_KeyDown);
|
||||
this.treeViewSamples.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.treeViewSamples_AfterExpand);
|
||||
//
|
||||
// contextMenuStripSamples
|
||||
//
|
||||
this.contextMenuStripSamples.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.runSampleToolStripMenuItem,
|
||||
this.toolStripMenuItem1,
|
||||
this.viewDescriptionToolStripMenuItem,
|
||||
this.viewSourceToolStripMenuItem});
|
||||
this.contextMenuStripSamples.Name = "contextMenuStripSamples";
|
||||
this.contextMenuStripSamples.Size = new System.Drawing.Size(170, 76);
|
||||
this.contextMenuStripSamples.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuStripSamples_ItemClicked);
|
||||
//
|
||||
// runSampleToolStripMenuItem
|
||||
//
|
||||
this.runSampleToolStripMenuItem.Name = "runSampleToolStripMenuItem";
|
||||
this.runSampleToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
|
||||
this.runSampleToolStripMenuItem.Text = "&Run Sample";
|
||||
//
|
||||
// toolStripMenuItem1
|
||||
//
|
||||
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
|
||||
this.toolStripMenuItem1.Size = new System.Drawing.Size(166, 6);
|
||||
//
|
||||
// viewDescriptionToolStripMenuItem
|
||||
//
|
||||
this.viewDescriptionToolStripMenuItem.Name = "viewDescriptionToolStripMenuItem";
|
||||
this.viewDescriptionToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
|
||||
this.viewDescriptionToolStripMenuItem.Text = "View Description";
|
||||
//
|
||||
// viewSourceToolStripMenuItem
|
||||
//
|
||||
this.viewSourceToolStripMenuItem.Name = "viewSourceToolStripMenuItem";
|
||||
this.viewSourceToolStripMenuItem.Size = new System.Drawing.Size(169, 22);
|
||||
this.viewSourceToolStripMenuItem.Text = "View Source Code";
|
||||
//
|
||||
// imageListSampleCategories
|
||||
//
|
||||
this.imageListSampleCategories.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListSampleCategories.ImageStream")));
|
||||
this.imageListSampleCategories.TransparentColor = System.Drawing.Color.Transparent;
|
||||
this.imageListSampleCategories.Images.SetKeyName(0, "OpenAL.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(1, "OpenGL.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(2, "1.1.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(3, "1.2.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(4, "1.3.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(5, "1.4.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(6, "1.5.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(7, "2.0.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(8, "2.1.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(9, "3.0.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(10, "3.1.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(11, "GLSL.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(12, "FBO.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(13, "EFX.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(14, "GameWindow.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(15, "GLControl.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(16, "Test.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(17, "Fonts.jpg");
|
||||
this.imageListSampleCategories.Images.SetKeyName(18, "OpenTK.jpg");
|
||||
//
|
||||
// tabControlSample
|
||||
//
|
||||
this.tabControlSample.Controls.Add(this.tabDescription);
|
||||
this.tabControlSample.Controls.Add(this.tabSource);
|
||||
this.tabControlSample.Controls.Add(this.tabPageOutput);
|
||||
this.tabControlSample.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tabControlSample.Location = new System.Drawing.Point(0, 0);
|
||||
this.tabControlSample.Name = "tabControlSample";
|
||||
this.tabControlSample.SelectedIndex = 0;
|
||||
this.tabControlSample.Size = new System.Drawing.Size(519, 564);
|
||||
this.tabControlSample.TabIndex = 0;
|
||||
//
|
||||
// tabDescription
|
||||
//
|
||||
this.tabDescription.Controls.Add(this.richTextBoxDescription);
|
||||
this.tabDescription.Location = new System.Drawing.Point(4, 22);
|
||||
this.tabDescription.Name = "tabDescription";
|
||||
this.tabDescription.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.tabDescription.Size = new System.Drawing.Size(511, 538);
|
||||
this.tabDescription.TabIndex = 0;
|
||||
this.tabDescription.Text = "Description";
|
||||
this.tabDescription.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// richTextBoxDescription
|
||||
//
|
||||
this.richTextBoxDescription.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.richTextBoxDescription.ContextMenuStrip = this.contextMenuStripDescription;
|
||||
this.richTextBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.richTextBoxDescription.Location = new System.Drawing.Point(3, 3);
|
||||
this.richTextBoxDescription.Name = "richTextBoxDescription";
|
||||
this.richTextBoxDescription.ReadOnly = true;
|
||||
this.richTextBoxDescription.Size = new System.Drawing.Size(505, 532);
|
||||
this.richTextBoxDescription.TabIndex = 0;
|
||||
this.richTextBoxDescription.Text = "";
|
||||
this.richTextBoxDescription.MouseDown += new System.Windows.Forms.MouseEventHandler(this.richTextBoxDescription_MouseDown);
|
||||
//
|
||||
// contextMenuStripDescription
|
||||
//
|
||||
this.contextMenuStripDescription.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.copyToolStripMenuItem});
|
||||
this.contextMenuStripDescription.Name = "contextMenuStripDescription";
|
||||
this.contextMenuStripDescription.Size = new System.Drawing.Size(103, 26);
|
||||
this.contextMenuStripDescription.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuStripDescription_ItemClicked);
|
||||
//
|
||||
// copyToolStripMenuItem
|
||||
//
|
||||
this.copyToolStripMenuItem.Name = "copyToolStripMenuItem";
|
||||
this.copyToolStripMenuItem.Size = new System.Drawing.Size(102, 22);
|
||||
this.copyToolStripMenuItem.Text = "&Copy";
|
||||
//
|
||||
// tabSource
|
||||
//
|
||||
this.tabSource.Controls.Add(this.richTextBoxSource);
|
||||
this.tabSource.Location = new System.Drawing.Point(4, 22);
|
||||
this.tabSource.Name = "tabSource";
|
||||
this.tabSource.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.tabSource.Size = new System.Drawing.Size(511, 538);
|
||||
this.tabSource.TabIndex = 1;
|
||||
this.tabSource.Text = "Source Code";
|
||||
this.tabSource.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// richTextBoxSource
|
||||
//
|
||||
this.richTextBoxSource.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(242)))), ((int)(((byte)(240)))));
|
||||
this.richTextBoxSource.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.richTextBoxSource.ContextMenuStrip = this.contextMenuStripSource;
|
||||
this.richTextBoxSource.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.richTextBoxSource.Location = new System.Drawing.Point(3, 3);
|
||||
this.richTextBoxSource.Name = "richTextBoxSource";
|
||||
this.richTextBoxSource.ReadOnly = true;
|
||||
this.richTextBoxSource.Size = new System.Drawing.Size(505, 532);
|
||||
this.richTextBoxSource.TabIndex = 0;
|
||||
this.richTextBoxSource.Text = "";
|
||||
this.richTextBoxSource.MouseDown += new System.Windows.Forms.MouseEventHandler(this.richTextBoxSource_MouseDown);
|
||||
//
|
||||
// contextMenuStripSource
|
||||
//
|
||||
this.contextMenuStripSource.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.copyToolStripMenuItem1});
|
||||
this.contextMenuStripSource.Name = "contextMenuStripSource";
|
||||
this.contextMenuStripSource.Size = new System.Drawing.Size(103, 26);
|
||||
this.contextMenuStripSource.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuStripSource_ItemClicked);
|
||||
//
|
||||
// copyToolStripMenuItem1
|
||||
//
|
||||
this.copyToolStripMenuItem1.Name = "copyToolStripMenuItem1";
|
||||
this.copyToolStripMenuItem1.Size = new System.Drawing.Size(102, 22);
|
||||
this.copyToolStripMenuItem1.Text = "&Copy";
|
||||
//
|
||||
// tabPageOutput
|
||||
//
|
||||
this.tabPageOutput.Controls.Add(this.textBoxOutput);
|
||||
this.tabPageOutput.Location = new System.Drawing.Point(4, 22);
|
||||
this.tabPageOutput.Name = "tabPageOutput";
|
||||
this.tabPageOutput.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.tabPageOutput.Size = new System.Drawing.Size(511, 538);
|
||||
this.tabPageOutput.TabIndex = 2;
|
||||
this.tabPageOutput.Text = "Output";
|
||||
this.tabPageOutput.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// textBoxOutput
|
||||
//
|
||||
this.textBoxOutput.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(242)))), ((int)(((byte)(240)))));
|
||||
this.textBoxOutput.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.textBoxOutput.ContextMenuStrip = this.contextMenuStripOutput;
|
||||
this.textBoxOutput.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.textBoxOutput.Location = new System.Drawing.Point(3, 3);
|
||||
this.textBoxOutput.MaxLength = 1048576;
|
||||
this.textBoxOutput.Multiline = true;
|
||||
this.textBoxOutput.Name = "textBoxOutput";
|
||||
this.textBoxOutput.ReadOnly = true;
|
||||
this.textBoxOutput.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
|
||||
this.textBoxOutput.Size = new System.Drawing.Size(505, 532);
|
||||
this.textBoxOutput.TabIndex = 0;
|
||||
//
|
||||
// contextMenuStripOutput
|
||||
//
|
||||
this.contextMenuStripOutput.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.copyToolStripMenuItem2});
|
||||
this.contextMenuStripOutput.Name = "contextMenuStripOutput";
|
||||
this.contextMenuStripOutput.Size = new System.Drawing.Size(103, 26);
|
||||
//
|
||||
// copyToolStripMenuItem2
|
||||
//
|
||||
this.copyToolStripMenuItem2.Name = "copyToolStripMenuItem2";
|
||||
this.copyToolStripMenuItem2.Size = new System.Drawing.Size(102, 22);
|
||||
this.copyToolStripMenuItem2.Text = "&Copy";
|
||||
//
|
||||
// ExampleBrowser
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(784, 564);
|
||||
this.Controls.Add(this.splitContainer1);
|
||||
this.Name = "ExampleBrowser";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "The Open Toolkit Sample Browser";
|
||||
this.splitContainer1.Panel1.ResumeLayout(false);
|
||||
this.splitContainer1.Panel2.ResumeLayout(false);
|
||||
this.splitContainer1.ResumeLayout(false);
|
||||
this.contextMenuStripSamples.ResumeLayout(false);
|
||||
this.tabControlSample.ResumeLayout(false);
|
||||
this.tabDescription.ResumeLayout(false);
|
||||
this.contextMenuStripDescription.ResumeLayout(false);
|
||||
this.tabSource.ResumeLayout(false);
|
||||
this.contextMenuStripSource.ResumeLayout(false);
|
||||
this.tabPageOutput.ResumeLayout(false);
|
||||
this.tabPageOutput.PerformLayout();
|
||||
this.contextMenuStripOutput.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.SplitContainer splitContainer1;
|
||||
private System.Windows.Forms.TabControl tabControlSample;
|
||||
private System.Windows.Forms.TabPage tabDescription;
|
||||
private System.Windows.Forms.TabPage tabSource;
|
||||
private System.Windows.Forms.RichTextBox richTextBoxDescription;
|
||||
private System.Windows.Forms.RichTextBox richTextBoxSource;
|
||||
private System.Windows.Forms.TreeView treeViewSamples;
|
||||
private System.Windows.Forms.ImageList imageListSampleCategories;
|
||||
private System.Windows.Forms.ContextMenuStrip contextMenuStripDescription;
|
||||
private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;
|
||||
private System.Windows.Forms.ContextMenuStrip contextMenuStripSource;
|
||||
private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem1;
|
||||
private System.Windows.Forms.ContextMenuStrip contextMenuStripSamples;
|
||||
private System.Windows.Forms.ToolStripMenuItem runSampleToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
|
||||
private System.Windows.Forms.ToolStripMenuItem viewDescriptionToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem viewSourceToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolTip toolTipSamples;
|
||||
private System.Windows.Forms.TabPage tabPageOutput;
|
||||
private System.Windows.Forms.TextBox textBoxOutput;
|
||||
private System.Windows.Forms.ContextMenuStrip contextMenuStripOutput;
|
||||
private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem2;
|
||||
}
|
||||
}
|
315
Source/Examples/ExampleBrowser.cs
Normal file
315
Source/Examples/ExampleBrowser.cs
Normal file
|
@ -0,0 +1,315 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.Reflection;
|
||||
using Examples.Properties;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing.Text;
|
||||
|
||||
namespace Examples
|
||||
{
|
||||
public partial class ExampleBrowser : Form
|
||||
{
|
||||
#region Fields
|
||||
|
||||
PrivateFontCollection font_collection = new PrivateFontCollection();
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
public ExampleBrowser()
|
||||
{
|
||||
Font = SystemFonts.DialogFont;
|
||||
|
||||
InitializeComponent();
|
||||
|
||||
// Windows 6 (Vista) and higher come with Consolas, a high-quality monospace font. Use that or fallback to the generic
|
||||
// monospace font on other systems.
|
||||
if (System.Environment.OSVersion.Platform == PlatformID.Win32NT && System.Environment.OSVersion.Version.Major >= 6)
|
||||
{
|
||||
richTextBoxSource.Font = new Font("Consolas", 10.0f, FontStyle.Regular);
|
||||
}
|
||||
else
|
||||
{
|
||||
richTextBoxSource.Font = new Font(FontFamily.GenericMonospace, 10.0f, FontStyle.Regular);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Protected Members
|
||||
|
||||
protected override void OnLoad(EventArgs e)
|
||||
{
|
||||
base.OnLoad(e);
|
||||
LoadSamplesFromAssembly(Assembly.GetExecutingAssembly());
|
||||
Debug.Listeners.Add(new TextBoxTraceListener(textBoxOutput));
|
||||
treeViewSamples.TreeViewNodeSorter = new SamplesTreeViewSorter();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private Members
|
||||
|
||||
#region Events
|
||||
|
||||
#region TreeView
|
||||
|
||||
private void treeViewSamples_AfterSelect(object sender, TreeViewEventArgs e)
|
||||
{
|
||||
if (e.Node.Tag != null && !String.IsNullOrEmpty(((ExampleInfo)e.Node.Tag).Attribute.Documentation))
|
||||
{
|
||||
richTextBoxDescription.Rtf = (string)Resources.ResourceManager.GetObject(((ExampleInfo)e.Node.Tag).Attribute.Documentation + "Doc");
|
||||
richTextBoxSource.Text = (string)Resources.ResourceManager.GetObject(((ExampleInfo)e.Node.Tag).Attribute.Documentation);
|
||||
}
|
||||
else
|
||||
{
|
||||
richTextBoxDescription.Rtf = String.Empty;
|
||||
richTextBoxSource.Rtf = String.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
private void treeViewSamples_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
|
||||
{
|
||||
if (e.Node.Tag != null)
|
||||
{
|
||||
ActivateNode(e.Node);
|
||||
}
|
||||
}
|
||||
|
||||
private void treeViewSamples_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
// The enter key activates a node (either expands/collapses or executes its sample).
|
||||
switch (e.KeyCode)
|
||||
{
|
||||
case Keys.Enter:
|
||||
ActivateNode(treeViewSamples.SelectedNode);
|
||||
e.Handled = true;
|
||||
e.SuppressKeyPress = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void treeViewSamples_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
// Make sure that right-clicking a new node will select that node before displaying
|
||||
// the context menu. Without this, right-clicking a node does not select it, which
|
||||
// is completely disorienting.
|
||||
// As a bonus, make any mouse button select the underlying node,
|
||||
TreeNode node = treeViewSamples.HitTest(e.Location).Node;
|
||||
if (node != null)
|
||||
treeViewSamples.SelectedNode = node;
|
||||
|
||||
// Middle click selects and activates a node (either expands/collapses or executes its sample).
|
||||
// Right button displays the context menu.
|
||||
// All other mouse buttons simply select the underlying node.
|
||||
switch (e.Button)
|
||||
{
|
||||
case MouseButtons.Middle:
|
||||
ActivateNode(node);
|
||||
break;
|
||||
|
||||
case MouseButtons.Right:
|
||||
treeViewSamples.ContextMenuStrip.Show(sender as Control, e.Location);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void treeViewSamples_AfterExpand(object sender, TreeViewEventArgs e)
|
||||
{
|
||||
foreach (TreeNode child in e.Node.Nodes)
|
||||
child.EnsureVisible();
|
||||
}
|
||||
|
||||
private void contextMenuStripSamples_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
|
||||
{
|
||||
switch (e.ClickedItem.Text)
|
||||
{
|
||||
case "&Run Sample": RunSample(this, (ExampleInfo)treeViewSamples.SelectedNode.Tag); break;
|
||||
case "View Description": tabControlSample.SelectedTab = tabDescription; break;
|
||||
case "View Source Code": tabControlSample.SelectedTab = tabSource; break;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Description
|
||||
|
||||
private void richTextBoxDescription_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == MouseButtons.Right)
|
||||
{
|
||||
richTextBoxDescription.ContextMenuStrip.Show(sender as Control, e.X, e.Y);
|
||||
}
|
||||
}
|
||||
|
||||
private void contextMenuStripDescription_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
|
||||
{
|
||||
if (e.ClickedItem.Text == "&Copy")
|
||||
{
|
||||
Clipboard.SetText(richTextBoxDescription.SelectedRtf, TextDataFormat.Rtf);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Source Code
|
||||
|
||||
private void richTextBoxSource_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == MouseButtons.Right)
|
||||
{
|
||||
richTextBoxSource.ContextMenuStrip.Show(sender as Control, e.X, e.Y);
|
||||
}
|
||||
}
|
||||
|
||||
private void contextMenuStripSource_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
|
||||
{
|
||||
if (e.ClickedItem.Text == "&Copy")
|
||||
{
|
||||
Clipboard.SetText(richTextBoxSource.SelectedText, TextDataFormat.Text);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#region Actions
|
||||
|
||||
void LoadSamplesFromAssembly(Assembly assembly)
|
||||
{
|
||||
if (assembly == null)
|
||||
throw new ArgumentNullException("assembly");
|
||||
|
||||
Type[] types = assembly.GetTypes();
|
||||
foreach (Type type in types)
|
||||
{
|
||||
object[] attributes = type.GetCustomAttributes(false);
|
||||
ExampleAttribute example = null;
|
||||
foreach (object attr in attributes)
|
||||
{
|
||||
if (attr is ExampleAttribute)
|
||||
{
|
||||
example = (ExampleAttribute)attr;
|
||||
|
||||
if (example.Visible)
|
||||
{
|
||||
// Add this example to the sample TreeView.
|
||||
// First check whether the ExampleCategory exists in the tree (and add it if it doesn't).
|
||||
// Then add the example as a child node on this category.
|
||||
|
||||
if (!treeViewSamples.Nodes.ContainsKey(example.Category.ToString()))
|
||||
{
|
||||
int category_index = GetImageIndexForSample(imageListSampleCategories, example.Category.ToString(), String.Empty);
|
||||
treeViewSamples.Nodes.Add(example.Category.ToString(), String.Format("{0} samples", example.Category),
|
||||
category_index, category_index);
|
||||
}
|
||||
|
||||
int image_index = GetImageIndexForSample(imageListSampleCategories, example.Category.ToString(), example.Subcategory);
|
||||
TreeNode node = new TreeNode(example.Title, image_index, image_index);
|
||||
node.Name = example.Title;
|
||||
node.Tag = new ExampleInfo(type, example);
|
||||
treeViewSamples.Nodes[example.Category.ToString()].Nodes.Add(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
treeViewSamples.Sort();
|
||||
}
|
||||
|
||||
void ActivateNode(TreeNode node)
|
||||
{
|
||||
if (node == null)
|
||||
return;
|
||||
|
||||
if (node.Tag == null)
|
||||
{
|
||||
if (node.IsExpanded)
|
||||
node.Collapse();
|
||||
else
|
||||
node.Expand();
|
||||
}
|
||||
else
|
||||
{
|
||||
tabControlSample.SelectedTab = tabPageOutput;
|
||||
textBoxOutput.Clear();
|
||||
RunSample(node.TreeView.TopLevelControl, (ExampleInfo)node.Tag);
|
||||
}
|
||||
}
|
||||
|
||||
static int GetImageIndexForSample(ImageList list, string category, string subcategory)
|
||||
{
|
||||
if (list == null)
|
||||
throw new ArgumentNullException("list");
|
||||
|
||||
if (list.Images.ContainsKey(subcategory.ToString() + ".jpg"))
|
||||
return list.Images.IndexOfKey(subcategory.ToString() + ".jpg");
|
||||
if (list.Images.ContainsKey(category.ToString() + ".jpg"))
|
||||
return list.Images.IndexOfKey(category.ToString() + ".jpg");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void RunSample(Control parent, ExampleInfo e)
|
||||
{
|
||||
if (e == null)
|
||||
return;
|
||||
|
||||
MethodInfo main =
|
||||
e.Example.GetMethod("Main", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) ??
|
||||
e.Example.GetMethod("Main", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(object), typeof(object) }, null);
|
||||
if (main != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (parent != null)
|
||||
{
|
||||
parent.Visible = false;
|
||||
Application.DoEvents();
|
||||
}
|
||||
Trace.WriteLine(String.Format("Launching sample: \"{0}\"", e.Attribute.Title));
|
||||
Trace.WriteLine(String.Empty);
|
||||
main.Invoke(null, null);
|
||||
}
|
||||
catch (TargetInvocationException expt)
|
||||
{
|
||||
string ex_info;
|
||||
if (expt.InnerException != null)
|
||||
ex_info = expt.InnerException.ToString();
|
||||
else
|
||||
ex_info = expt.ToString();
|
||||
MessageBox.Show(ex_info, "An OpenTK example encountered an error.", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
|
||||
Debug.Print(expt.ToString());
|
||||
}
|
||||
catch (NullReferenceException expt)
|
||||
{
|
||||
MessageBox.Show(expt.ToString(), "The Example launcher failed to load the example.", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (parent != null)
|
||||
{
|
||||
parent.Visible = true;
|
||||
Application.DoEvents();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("The selected example does not define a Main method", "Entry point not found", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
5404
Source/Examples/ExampleBrowser.resx
Normal file
5404
Source/Examples/ExampleBrowser.resx
Normal file
File diff suppressed because it is too large
Load diff
26
Source/Examples/ExampleInfo.cs
Normal file
26
Source/Examples/ExampleInfo.cs
Normal file
|
@ -0,0 +1,26 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Examples
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains the information necessary to display and launch an example thorugh the ExampleLauncer.
|
||||
/// </summary>
|
||||
class ExampleInfo
|
||||
{
|
||||
public readonly Type Example;
|
||||
public readonly ExampleAttribute Attribute;
|
||||
|
||||
public ExampleInfo(Type example, ExampleAttribute attr)
|
||||
{
|
||||
Example = example;
|
||||
Attribute = attr;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Attribute.ToString();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -29,35 +29,12 @@ using OpenTK;
|
|||
|
||||
namespace Examples
|
||||
{
|
||||
[Obsolete]
|
||||
public partial class ExampleLauncher : Form
|
||||
{
|
||||
bool show_hidden;
|
||||
List<ExampleInfo> hidden_items = new List<ExampleInfo>();
|
||||
|
||||
#region class ExampleInfo
|
||||
|
||||
/// <summary>
|
||||
/// Contains the information necessary to display and launch an example thorugh the ExampleLauncer.
|
||||
/// </summary>
|
||||
class ExampleInfo
|
||||
{
|
||||
public Type Example;
|
||||
public ExampleAttribute Attributes;
|
||||
|
||||
public ExampleInfo(Type example, ExampleAttribute attr)
|
||||
{
|
||||
Example = example;
|
||||
Attributes = attr;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Attributes.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region --- Constructor ---
|
||||
|
||||
public ExampleLauncher()
|
||||
|
@ -72,21 +49,6 @@ namespace Examples
|
|||
|
||||
public void ExampleLauncher_Load(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (File.Exists("debug.log"))
|
||||
File.Delete("debug.log");
|
||||
}
|
||||
catch (Exception expt)
|
||||
{
|
||||
MessageBox.Show("Could not access debug.log", expt.ToString());
|
||||
}
|
||||
|
||||
Debug.Listeners.Clear();
|
||||
Debug.Listeners.Add(new TextWriterTraceListener("debug.log"));
|
||||
Debug.Listeners.Add(new ConsoleTraceListener());
|
||||
Debug.AutoFlush = true;
|
||||
|
||||
// Get all examples
|
||||
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
@ -110,7 +72,9 @@ namespace Examples
|
|||
//sb.Append(example.Title);
|
||||
|
||||
if (example.Visible)
|
||||
{
|
||||
listBox1.Items.Add(new ExampleInfo(type, example));
|
||||
}
|
||||
else
|
||||
{
|
||||
#if DEBUG
|
||||
|
@ -235,32 +199,5 @@ namespace Examples
|
|||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
try
|
||||
{
|
||||
//FileIOPermission fileIO = new FileIOPermission(FileIOPermissionAccess.AllAccess, ".");
|
||||
//fileIO.Demand();
|
||||
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
using (Form exampleLauncher = new ExampleLauncher())
|
||||
{
|
||||
Application.Run(exampleLauncher);
|
||||
}
|
||||
|
||||
}
|
||||
catch (System.Security.SecurityException e)
|
||||
{
|
||||
MessageBox.Show("The Example Launcher failed to start, due to insufficient permissions. This may happen if you execute the application from a network share.", "OpenTK Example Launcher failed to start.",
|
||||
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
Trace.WriteLine(e.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
54
Source/Examples/Main.cs
Normal file
54
Source/Examples/Main.cs
Normal file
|
@ -0,0 +1,54 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
|
||||
namespace Examples
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
[STAThread]
|
||||
public static void Main()
|
||||
{
|
||||
try
|
||||
{
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
//using (Form browser = new ExampleLauncher())
|
||||
using (Form browser = new ExampleBrowser())
|
||||
{
|
||||
try
|
||||
{
|
||||
if (File.Exists("debug.log"))
|
||||
File.Delete("debug.log");
|
||||
if (File.Exists("trace.log"))
|
||||
File.Delete("trace.log");
|
||||
}
|
||||
catch (Exception expt)
|
||||
{
|
||||
MessageBox.Show("Could not access debug.log", expt.ToString());
|
||||
}
|
||||
|
||||
Debug.Listeners.Clear();
|
||||
Debug.Listeners.Add(new TextWriterTraceListener("debug.log"));
|
||||
Debug.Listeners.Add(new ConsoleTraceListener());
|
||||
|
||||
Trace.Listeners.Clear();
|
||||
Trace.Listeners.Add(new TextWriterTraceListener("debug.log"));
|
||||
Trace.Listeners.Add(new ConsoleTraceListener());
|
||||
|
||||
Application.Run(browser);
|
||||
}
|
||||
}
|
||||
catch (System.Security.SecurityException e)
|
||||
{
|
||||
MessageBox.Show("The Example Launcher failed to start, due to insufficient permissions. This may happen if you execute the application from a network share.", "OpenTK Example Launcher failed to start.",
|
||||
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
Trace.WriteLine(e.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -32,7 +32,7 @@ using OpenTK.Audio;
|
|||
|
||||
namespace Examples
|
||||
{
|
||||
[Example("EFX: Reverb", ExampleCategory.OpenAL)]
|
||||
[Example("EFX: Reverb", ExampleCategory.OpenAL, "EFX")]
|
||||
public class ReverbExample
|
||||
{
|
||||
static readonly string filename = Path.Combine(Path.Combine("Data", "Audio"), "the_ring_that_fell.wav");
|
||||
|
|
|
@ -14,7 +14,7 @@ using OpenTK.Audio;
|
|||
|
||||
namespace Examples
|
||||
{
|
||||
[Example("Playback", ExampleCategory.OpenAL)]
|
||||
[Example("Playback", ExampleCategory.OpenAL, "1.1")]
|
||||
public class Playback
|
||||
{
|
||||
static readonly string filename = Path.Combine(Path.Combine("Data", "Audio"), "the_ring_that_fell.wav");
|
||||
|
|
|
@ -16,7 +16,7 @@ using System.Diagnostics;
|
|||
|
||||
namespace Examples
|
||||
{
|
||||
[Example("AudioContext Test", ExampleCategory.Test, 0, false)]
|
||||
[Example("AudioContext Test", ExampleCategory.OpenTK, "Test", 0, false)]
|
||||
class TestApp
|
||||
{
|
||||
public static void PrintOpenALErrors( IntPtr device )
|
||||
|
|
|
@ -18,7 +18,7 @@ using OpenTK.Graphics.OpenGL;
|
|||
|
||||
namespace Examples.Tutorial
|
||||
{
|
||||
[Example("Framebuffer Objects", ExampleCategory.OpenGL)]
|
||||
[Example("Framebuffer Objects", ExampleCategory.OpenGL, "FBO", Documentation = "FramebufferObject")]
|
||||
public class SimpleFBO : GameWindow
|
||||
{
|
||||
public SimpleFBO()
|
||||
|
|
BIN
Source/Examples/OpenGL/FramebufferObject.rtf
Normal file
BIN
Source/Examples/OpenGL/FramebufferObject.rtf
Normal file
Binary file not shown.
|
@ -16,7 +16,7 @@ using OpenTK.Input;
|
|||
|
||||
namespace Examples
|
||||
{
|
||||
[Example("GLU Tesselation Functions Test", ExampleCategory.OpenGL, Visible = false)]
|
||||
[Example("GLU Tesselation Functions Test", ExampleCategory.OpenGL, "GLU", Visible = false)]
|
||||
public class Test : GameWindow
|
||||
{
|
||||
int startList;
|
||||
|
|
|
@ -26,7 +26,7 @@ namespace Examples.Tutorial
|
|||
/// One more major optimization could be applied (exploit the symmetry of the image with RTT), but
|
||||
/// that would make the program alot more complicated to follow. You can do this as an exercise.
|
||||
/// </summary>
|
||||
[Example("GLSL Animated Julia Set", ExampleCategory.GLSL)]
|
||||
[Example("GLSL Animated Julia Set", ExampleCategory.OpenGL, "GLSL")]
|
||||
public class JuliaSetFractal : GameWindow
|
||||
{
|
||||
public JuliaSetFractal()
|
||||
|
|
|
@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
|
|||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
[assembly: AssemblyVersion("0.9.6.0")]
|
||||
[assembly: AssemblyFileVersion("0.9.6.0")]
|
||||
[assembly: AssemblyVersion("0.9.8.0")]
|
||||
[assembly: AssemblyFileVersion("0.9.8.0")]
|
||||
|
|
63
Source/Examples/Properties/Resources.Designer.cs
generated
Normal file
63
Source/Examples/Properties/Resources.Designer.cs
generated
Normal file
|
@ -0,0 +1,63 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:2.0.50727.3074
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Examples.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Examples.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
133
Source/Examples/Properties/Resources.resx
Normal file
133
Source/Examples/Properties/Resources.resx
Normal file
|
@ -0,0 +1,133 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="FontRendering" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\winforms\fontrendering.cs;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
<data name="FontRenderingDoc" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\winforms\fontrendering.rtf;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="FramebufferObject" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\OpenGL\FrameBufferObject.cs;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
<data name="FramebufferObjectDoc" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\OpenGL\FramebufferObject.rtf;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;windows-1253</value>
|
||||
</data>
|
||||
</root>
|
49
Source/Examples/SamplesTreeViewSorter.cs
Normal file
49
Source/Examples/SamplesTreeViewSorter.cs
Normal file
|
@ -0,0 +1,49 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.Collections;
|
||||
|
||||
namespace Examples
|
||||
{
|
||||
class SamplesTreeViewSorter : IComparer<TreeNode>, IComparer
|
||||
{
|
||||
#region IComparer<TreeNode> Members
|
||||
|
||||
public int Compare(TreeNode x, TreeNode y)
|
||||
{
|
||||
ExampleInfo x_info = x.Tag as ExampleInfo;
|
||||
ExampleInfo y_info = y.Tag as ExampleInfo;
|
||||
if (x_info == null || y_info == null)
|
||||
{
|
||||
return x.Text.CompareTo(y.Text);
|
||||
}
|
||||
else
|
||||
{
|
||||
int result = x_info.Attribute.Category.CompareTo(y_info.Attribute.Category);
|
||||
if (result == 0)
|
||||
result = x_info.Attribute.Subcategory.CompareTo(y_info.Attribute.Subcategory);
|
||||
if (result == 0)
|
||||
result = x_info.Attribute.Difficulty.CompareTo(y_info.Attribute.Difficulty);
|
||||
if (result == 0)
|
||||
result = x_info.Attribute.Title.CompareTo(y_info.Attribute.Title);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IComparer Members
|
||||
|
||||
public int Compare(object x, object y)
|
||||
{
|
||||
if (x is TreeNode && y is TreeNode)
|
||||
return Compare(x as TreeNode, y as TreeNode);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -32,7 +32,7 @@ using OpenTK.Graphics;
|
|||
|
||||
namespace Examples.Tests
|
||||
{
|
||||
[Example("Color4 Serialization", ExampleCategory.Test)]
|
||||
[Example("Color4 Serialization", ExampleCategory.OpenTK, "Test")]
|
||||
public class Color4Serialization
|
||||
{
|
||||
public static void Main()
|
||||
|
|
|
@ -22,7 +22,7 @@ using System.Text.RegularExpressions;
|
|||
|
||||
namespace Examples.WinForms
|
||||
{
|
||||
[Example("Extensions", ExampleCategory.Test)]
|
||||
[Example("OpenGL Extensions", ExampleCategory.OpenTK, "Test")]
|
||||
public partial class Extensions : Form
|
||||
{
|
||||
#region Fields
|
||||
|
|
|
@ -17,7 +17,7 @@ using OpenTK.Input;
|
|||
|
||||
namespace Examples.Tests
|
||||
{
|
||||
[Example("GameWindow states", ExampleCategory.Test)]
|
||||
[Example("GameWindow states", ExampleCategory.OpenTK, "Test")]
|
||||
public class GameWindowStates : GameWindow
|
||||
{
|
||||
Font font = new Font(FontFamily.GenericSansSerif, 16.0f);
|
||||
|
|
|
@ -23,7 +23,7 @@ using OpenTK.Graphics.OpenGL;
|
|||
|
||||
namespace Examples.Tests
|
||||
{
|
||||
[Example("Input Logger", ExampleCategory.Test)]
|
||||
[Example("Input Logger", ExampleCategory.OpenTK, "Test")]
|
||||
public partial class InputLogger : Form
|
||||
{
|
||||
#region Fields
|
||||
|
|
|
@ -12,7 +12,7 @@ using OpenTK.Math;
|
|||
|
||||
namespace Examples.Tests
|
||||
{
|
||||
[Example("Math speed test", ExampleCategory.Test, Visible = false)]
|
||||
[Example("Math speed test", ExampleCategory.OpenTK, "Test", Visible = false)]
|
||||
public class MathSpeed
|
||||
{
|
||||
public static void Main()
|
||||
|
|
|
@ -17,7 +17,7 @@ using System.Threading;
|
|||
|
||||
namespace Examples.Tests
|
||||
{
|
||||
[Example("Test Resolution Changes", ExampleCategory.Test)]
|
||||
[Example("Test Resolution Changes", ExampleCategory.OpenTK, "Test")]
|
||||
public class TestResolutionChanges
|
||||
{
|
||||
public static void Main()
|
||||
|
|
38
Source/Examples/TextBoxTraceListener.cs
Normal file
38
Source/Examples/TextBoxTraceListener.cs
Normal file
|
@ -0,0 +1,38 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Examples
|
||||
{
|
||||
public class TextBoxTraceListener : TraceListener
|
||||
{
|
||||
private TextBox _target;
|
||||
private StringSendDelegate _invokeWrite;
|
||||
|
||||
public TextBoxTraceListener(TextBox target)
|
||||
{
|
||||
_target = target;
|
||||
_invokeWrite = new StringSendDelegate(SendString);
|
||||
}
|
||||
|
||||
public override void Write(string message)
|
||||
{
|
||||
_target.Invoke(_invokeWrite, new object[] { message });
|
||||
}
|
||||
|
||||
public override void WriteLine(string message)
|
||||
{
|
||||
_target.Invoke(_invokeWrite, new object[] { message + Environment.NewLine });
|
||||
}
|
||||
|
||||
private delegate void StringSendDelegate(string message);
|
||||
private void SendString(string message)
|
||||
{
|
||||
// No need to lock text box as this function will only
|
||||
// ever be executed from the UI thread
|
||||
_target.Text += message;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -22,7 +22,7 @@ namespace Examples.Tutorial
|
|||
/// <summary>
|
||||
/// Tests Font loading and rendering.
|
||||
/// </summary>
|
||||
[Example("Fonts", ExampleCategory.Tutorial, 3)]
|
||||
[Example("Fonts", ExampleCategory.OpenTK, "Fonts", Visible = false)]
|
||||
class Fonts : GameWindow
|
||||
{
|
||||
public Fonts() : base(800, 600)
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace Examples.Tutorial
|
|||
/// <summary>
|
||||
/// Demonstrates the GameWindow class.
|
||||
/// </summary>
|
||||
[Example("Simple Window", ExampleCategory.Tutorial, 1)]
|
||||
[Example("Simple Window", ExampleCategory.OpenTK, "GameWindow")]
|
||||
public class T01_Simple_Window : GameWindow
|
||||
{
|
||||
public T01_Simple_Window() : base(800, 600)
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace Examples.Tutorial
|
|||
/// Demonstrates Vertex Arrays (in system memory). Example is incomplete (documentation).
|
||||
/// Broken since release 0.3.12.
|
||||
/// </summary>
|
||||
[Example("Vertex Arrays", ExampleCategory.OpenGL, 5, false)]
|
||||
[Example("Vertex Arrays", ExampleCategory.OpenGL, "1.1", 5, false)]
|
||||
class T02_Vertex_Arrays : GameWindow
|
||||
{
|
||||
float rotation_speed = 3.0f;
|
||||
|
|
|
@ -23,9 +23,9 @@ using OpenTK.Graphics.OpenGL;
|
|||
namespace Examples.Tutorial
|
||||
{
|
||||
/// <summary>
|
||||
/// Demonstrates immediate mode rendering. Example is incomplete, and will probably go away in the future.
|
||||
/// Demonstrates immediate mode rendering.
|
||||
/// </summary>
|
||||
[Example("Immediate mode", ExampleCategory.Tutorial, 2)]
|
||||
[Example("Immediate mode", ExampleCategory.OpenGL, "1.1")]
|
||||
public class T03_Immediate_Mode_Cube : GameWindow
|
||||
{
|
||||
#region --- Fields ---
|
||||
|
@ -69,11 +69,19 @@ namespace Examples.Tutorial
|
|||
|
||||
GL.Viewport(0, 0, Width, Height);
|
||||
|
||||
double ratio = e.Width / (double)e.Height;
|
||||
double aspect_ratio = e.Width / (double)e.Height;
|
||||
|
||||
GL.MatrixMode(MatrixMode.Projection);
|
||||
if (Keyboard[OpenTK.Input.Key.Space])
|
||||
{
|
||||
OpenTK.Math.Matrix4 perspective = OpenTK.Math.Matrix4.Perspective(45, (float)aspect_ratio, 1, 64);
|
||||
GL.LoadMatrix(ref perspective);
|
||||
}
|
||||
else
|
||||
{
|
||||
GL.LoadIdentity();
|
||||
Glu.Perspective(45.0, ratio, 1.0, 64.0);
|
||||
Glu.Perspective(45, (float)aspect_ratio, 1, 64);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
@ -19,7 +19,7 @@ namespace Examples.Tutorial
|
|||
/// <summary>
|
||||
/// Demonstrates fixed-function OpenGL lighting. Example is incomplete (documentation).
|
||||
/// </summary>
|
||||
[Example("Vertex Lighting", ExampleCategory.OpenGL)]
|
||||
[Example("Vertex Lighting", ExampleCategory.OpenGL, "1.1")]
|
||||
public class T04_Vertex_Lighting : GameWindow
|
||||
{
|
||||
float x_angle, zoom;
|
||||
|
|
|
@ -22,7 +22,7 @@ using OpenTK.Graphics;
|
|||
|
||||
namespace Examples.Tutorial
|
||||
{
|
||||
[Example("Display Lists", ExampleCategory.Tutorial, 3)]
|
||||
[Example("Display Lists", ExampleCategory.OpenGL, "1.1")]
|
||||
public class T07_Display_Lists_Flower : GameWindow
|
||||
{
|
||||
#region --- Fields ---
|
||||
|
|
|
@ -21,7 +21,7 @@ using OpenTK.Math;
|
|||
|
||||
namespace Examples.Tutorial
|
||||
{
|
||||
[Example("Vertex Buffer Objects", ExampleCategory.Tutorial, 8, false)]
|
||||
[Example("Vertex Buffer Objects", ExampleCategory.OpenGL, "1.5")]
|
||||
public class T08_VBO : GameWindow
|
||||
{
|
||||
#region --- Private Fields ---
|
||||
|
|
|
@ -29,7 +29,7 @@ namespace Examples.Tutorial
|
|||
/// <summary>
|
||||
/// Demonstrates how to load and use a simple OpenGL shader program. Example is incomplete (documentation).
|
||||
/// </summary>
|
||||
[Example("First shader", ExampleCategory.GLSL, 1)]
|
||||
[Example("First shader", ExampleCategory.OpenGL, "GLSL")]
|
||||
public class T10_GLSL_Cube : GameWindow
|
||||
{
|
||||
#region --- Fields ---
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace Examples.Tutorial
|
|||
/// <summary>
|
||||
/// Shows how to render and scroll large amounts of text.
|
||||
/// </summary>
|
||||
[Example("Text", ExampleCategory.Tutorial, 4)]
|
||||
[Example("Font rendering (advanced)", ExampleCategory.OpenTK, "Fonts", 2)]
|
||||
public class Text : GameWindow
|
||||
{
|
||||
Font serif = new Font(FontFamily.GenericSerif, 16.0f);
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace Examples.Tutorial
|
|||
/// <summary>
|
||||
/// Demonstrates simple OpenGL Texturing.
|
||||
/// </summary>
|
||||
[Example("Texture mapping", ExampleCategory.Tutorial, 5)]
|
||||
[Example("Texture mapping", ExampleCategory.OpenGL, "1.1")]
|
||||
public class Textures : GameWindow
|
||||
{
|
||||
Bitmap bitmap = new Bitmap("Data/logo.jpg");
|
||||
|
|
|
@ -9,12 +9,11 @@ using OpenTK.Graphics;
|
|||
|
||||
namespace Examples.WinForms
|
||||
{
|
||||
[Example("Font rendering sample", ExampleCategory.WinForms)]
|
||||
[Example("Font rendering (basic)", ExampleCategory.OpenTK, "Fonts", Difficulty = 1, Documentation = "FontRendering")]
|
||||
public partial class FontRendering : Form
|
||||
{
|
||||
#region Fields
|
||||
|
||||
//float[] sizes = new float[] { 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 28, 32, 36, 42, 48 };
|
||||
float[] sizes = new float[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 24 };
|
||||
List<Font> fonts = new List<Font>();
|
||||
|
||||
|
|
BIN
Source/Examples/WinForms/FontRendering.rtf
Normal file
BIN
Source/Examples/WinForms/FontRendering.rtf
Normal file
Binary file not shown.
|
@ -21,7 +21,7 @@ using OpenTK.Graphics;
|
|||
|
||||
namespace Examples.WinForms
|
||||
{
|
||||
[Example("Simple GLControl", ExampleCategory.WinForms, 1)]
|
||||
[Example("Simple GLControl", ExampleCategory.OpenTK, "GLControl", 1)]
|
||||
public partial class W01_First_Window : Form
|
||||
{
|
||||
public W01_First_Window()
|
||||
|
|
|
@ -23,7 +23,7 @@ using OpenTK.Platform;
|
|||
|
||||
namespace Examples.WinForms
|
||||
{
|
||||
[Example("GLControl game loop", ExampleCategory.WinForms, 2)]
|
||||
[Example("GLControl game loop", ExampleCategory.OpenTK, "GLControl")]
|
||||
public partial class W02_Immediate_Mode_Cube : Form
|
||||
{
|
||||
static float angle = 0.0f;
|
||||
|
|
|
@ -11,7 +11,7 @@ using OpenTK.Graphics.OpenGL;
|
|||
|
||||
namespace Examples.WinForms
|
||||
{
|
||||
[Example("Multiple GLControls test", ExampleCategory.WinForms, 4)]
|
||||
[Example("Multiple GLControls test", ExampleCategory.OpenTK, "GLControl", 4)]
|
||||
public partial class W04_Multiple_GLControls : Form
|
||||
{
|
||||
public W04_Multiple_GLControls()
|
||||
|
|
Loading…
Reference in a new issue