jueves, diciembre 01, 2005
El código...
Tened en cuenta que todavía no está terminado... Pero aún así posteo el código... :)
Rule.cs:
TreeParams.cs:
LSystem.cs:
Renderer.cs:
CommandParser.cs:
frmTreeParams.cs:
frmRender.cs: (contiene el método Main)
Y ya está... De momento eso es todo... ;)
Cuando tenga listo el pintado del árbol, postearé el código completo (si puedo, en un zip, en vez de poner el código...)
Rule.cs:
using System;
namespace TreeSharp
{
/// <summary>
/// Summary description for Rule.
/// </summary>
public class Rule
{
char cLeftSide;
string sRightSide;
float fProbability;
public Rule()
{
cLeftSide = '\0';
sRightSide = "";
fProbability = 0.0f;
}
public Rule(char cLeftSide, string sRightSide, float fProbability)
{
this.cLeftSide = cLeftSide;
this.sRightSide = sRightSide;
this.fProbability = fProbability;
}
public char LeftSide
{
get
{
return this.cLeftSide;
}
set
{
this.cLeftSide = value;
}
}
public string RightSide
{
get
{
return this.sRightSide;
}
set
{
this.sRightSide = value;
}
}
public float Probability
{
get
{
return this.fProbability;
}
set
{
this.fProbability = value;
}
}
}
}
TreeParams.cs:
using System;
using System.ComponentModel;
namespace TreeSharp
{
/// <summary>
/// Summary description for RenderParameters.
/// </summary>
public class TreeParams
{
private float fXDegrees;
private float fYDegrees;
private float fZDegrees;
private float fSegmentLength;
private float fSegmentInitialWidth;
private float fWidthDecrement;
private float fRotationNoise;
private float fLengthNoise;
public TreeParams()
{
// 30º = PI / 6
fXDegrees = fYDegrees = fZDegrees = (float)(Math.PI / 6);
fSegmentLength = 10.0f;
fSegmentInitialWidth = 5.0f;
fWidthDecrement = 0.01f;
fRotationNoise = 0.0f;
fLengthNoise = 0.0f;
}
/// <summary>
/// Degrees to be applied on rotations (X-Axis).
/// </summary>
[ Description("Degrees to be applied on rotations (X-Axis)."),
DefaultValue(Math.PI/6) ]
public float XDegrees
{
get
{
return fXDegrees;
}
set
{
fXDegrees = value;
}
}
/// <summary>
/// Degrees to be applied on rotations (Y-Axis).
/// </summary>
[ Description("Degrees to be applied on rotations (Y-Axis)."),
DefaultValue(Math.PI/6) ]
public float YDegrees
{
get
{
return fYDegrees;
}
set
{
fYDegrees = value;
}
}
/// <summary>
/// Degrees to be applied on rotations (Z-Axis).
/// </summary>
[ Description("Degrees to be applied on rotations (Z-Axis)."),
DefaultValue(Math.PI/6) ]
public float ZDegrees
{
get
{
return fZDegrees;
}
set
{
fZDegrees = value;
}
}
/// <summary>
/// Segment Length.
/// </summary>
[ Description("Segment Length."),
DefaultValue(10.0f) ]
public float SegmentLength
{
get
{
return fSegmentLength;
}
set
{
fSegmentLength = value;
}
}
/// <summary>
/// Segment width at the tree base.
/// </summary>
[ Description("Segment width at the tree base."),
DefaultValue(5.0f) ]
public float SegmentInitialWidth
{
get
{
return fSegmentInitialWidth;
}
set
{
fSegmentInitialWidth = value;
}
}
/// <summary>
/// Width decrement per step.
/// </summary>
[ Description("Width decrement per step."),
DefaultValue(0.01f) ]
public float WidthDecrement
{
get
{
return fWidthDecrement;
}
set
{
fWidthDecrement = value;
}
}
/// <summary>
/// Noise factor to be applied to rotations. Zero equals no noise.
/// Valid values are 0 through 1.
/// </summary>
[ Description("Noise factor to be applied to rotations. Zero equals no noise.\nValid values are 0 through 1."),
DefaultValue(0.0f) ]
public float RotationNoise
{
get
{
return fRotationNoise;
}
set
{
fRotationNoise = value;
}
}
/// <summary>
/// Noise factor to be applied to length calculations. Zero equals no noise.
/// Valid values are 0 through 1.
/// </summary>
[ Description("Noise factor to be applied to length calculations. Zero equals no noise.\nValid values are 0 through 1."),
DefaultValue(0.0f) ]
public float LengthNoise
{
get
{
return fLengthNoise;
}
set
{
fLengthNoise = value;
}
}
}
}
LSystem.cs:
using System;
using System.Collections;
using TreeSharp;
namespace TreeSharp
{
/// <summary>
/// Summary description for LSystem.
/// </summary>
public class LSystem
{
private Hashtable _htRules;
private Random _rnd;
public LSystem()
{
_htRules = new Hashtable();
_rnd = new Random();
}
public void AddRule(Rule newRule)
{
Rule[] rules;
Rule[] oldRules;
if (_htRules.ContainsKey(newRule.LeftSide))
{
oldRules = (Rule[])_htRules[newRule.LeftSide];
rules = new Rule[oldRules.Length + 1];
Array.Copy(oldRules,0,rules,0,oldRules.Length);
rules[rules.Length-1] = newRule;
_htRules[newRule.LeftSide] = rules;
}
else
{
rules = new Rule[1];
rules[0] = newRule;
_htRules.Add(newRule.LeftSide, rules);
}
}
public void ClearRules()
{
_htRules.Clear();
}
private string sRightSide(char cLeftSide)
{
string sResult=cLeftSide.ToString();
Rule[] rules;
if (_htRules.ContainsKey(cLeftSide))
{
rules = (Rule[])_htRules[cLeftSide];
float fChance;
float fMin = 0.0f;
float fMax;
fChance = (float) _rnd.NextDouble();
for (int i = 0; i < rules.Length; i++)
{
fMax = fMin + rules[i].Probability;
if ((fChance >= fMin) && (fChance < fMax))
{
sResult = rules[i].RightSide;
break;
}
fMin = fMax;
}
}
return sResult;
}
public string PerformIterations(string sStartString, int iIterations)
{
System.Text.StringBuilder sbCurrent = new System.Text.StringBuilder();
string sCurrentString = sStartString;
for(int i = 0; i < iIterations; i++)
{
int iStrLen = sCurrentString.Length;
for(int iChar = 0; iChar < iStrLen; iChar++)
{
sbCurrent.Append(sRightSide(sCurrentString[iChar]));
}
sCurrentString = sbCurrent.ToString();
sbCurrent.Length = 0;
}
return sCurrentString;
}
}
}
Renderer.cs:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using TreeSharp;
namespace TreeSharp
{
/// <summary>
/// Summary description for Renderer.
/// </summary>
public class Renderer
{
/// <summary>
/// The rendering device
/// </summary>
private Device _device = null;
private Microsoft.DirectX.Direct3D.Font _font = null;
private Sprite _sprite = null;
private Control _control = null;
private System.Drawing.Font _winFont;
private int _vertexCount;
public Renderer(Control control, System.Drawing.Font font)
{
_control = control;
_winFont = font;
_vertexCount = -1;
}
public Device Device
{
get
{
return _device;
}
}
public VertexBuffer Buffer
{
set
{
_vertexCount = value.SizeInBytes / (CustomVertex.PositionColored.StrideSize);
_device.SetStreamSource(0, value, 0);
_device.VertexFormat = CustomVertex.PositionColored.Format;
}
}
public bool InitializeGraphics()
{
try
{
// Now let's setup the Direct3D stuff
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true;
presentParams.SwapEffect = SwapEffect.Discard;
// Create the device
_device = new Device(0, DeviceType.Hardware, _control, CreateFlags.SoftwareVertexProcessing, presentParams);
// Setup the event handlers for the device
_device.DeviceLost += new EventHandler(this.InvalidateDeviceObjects);
_device.DeviceReset += new EventHandler(this.RestoreDeviceObjects);
_device.Disposing += new EventHandler(this.DeleteDeviceObjects);
_device.DeviceResizing += new CancelEventHandler(this.EnvironmentResizing);
_font = new Microsoft.DirectX.Direct3D.Font(_device, _winFont);
_sprite = new Sprite(_device);
return true;
}
catch (DirectXException)
{
return false;
}
}
/// <summary>
/// This method moves the scene
/// </summary>
public virtual void FrameMove()
{
// TODO : Frame movement
}
/// <summary>
/// This method renders the scene
/// </summary>
public virtual void Render()
{
if (_device != null)
{
_device.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);
_device.BeginScene();
// TODO : Scene rendering
_sprite.Begin(SpriteFlags.AlphaBlend);
_font.DrawText(_sprite, "Tree renderer", 0, 0, Color.White.ToArgb());
_sprite.End();
if (_vertexCount > 0)
{
_device.DrawPrimitives(PrimitiveType.PointList, 0, 1); //_vertexCount);
}
_device.EndScene();
_device.Present();
}
}
protected virtual void InvalidateDeviceObjects(object sender, EventArgs e)
{
}
protected virtual void RestoreDeviceObjects(object sender, EventArgs e)
{
}
protected virtual void DeleteDeviceObjects(object sender, EventArgs e)
{
}
protected virtual void EnvironmentResizing(object sender, CancelEventArgs e)
{
}
}
}
CommandParser.cs:
using System;
using System.Drawing;
using System.Text.RegularExpressions;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace TreeSharp
{
/// <summary>
/// Translates the commands into vertex data. Also applies texturing
/// information.
/// </summary>
public class CommandParser
{
private TreeParams _treeParams = null;
private Device _device;
public CommandParser(Device device)
{
_device = device;
}
public TreeParams TreeParameters
{
get
{
return _treeParams;
}
set
{
_treeParams = value;
}
}
public VertexBuffer Parse(string sCommand)
{
Regex fCount, lCount;
int length = sCommand.Length;
fCount = new Regex("F");
lCount = new Regex("L");
int vertexCount;
vertexCount = (fCount.Matches(sCommand).Count * 16) + (lCount.Matches(sCommand).Count * 3);
VertexBuffer vb = new VertexBuffer(typeof(CustomVertex.PositionColored), vertexCount, _device, Usage.WriteOnly, CustomVertex.PositionColored.Format , Pool.Default);
GraphicsStream vbData = vb.Lock(0, 0, 0);
for(int i = 0; i < length; i++)
{
CustomVertex.PositionColored vert = new CustomVertex.PositionColored();
switch(sCommand[i])
{
case 'F':
vert.Color = Color.White.ToArgb();
vert.X = 1.0f;
vert.Y = 1.0f;
vert.Z = 1.0f;
vbData.Write(vert);
break;
}
}
vb.Unlock();
return vb;
}
}
}
frmTreeParams.cs:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace TreeSharp
{
/// <summary>
/// Summary description for frmTreeParams.
/// </summary>
public class frmTreeParams : System.Windows.Forms.Form
{
private System.Windows.Forms.PropertyGrid pGridParams;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
private TreeParams _treeParams;
public frmTreeParams()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
}
public TreeParams TreeParameters
{
get
{
return _treeParams;
}
set
{
_treeParams = value;
pGridParams.SelectedObject = _treeParams;
}
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(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.pGridParams = new System.Windows.Forms.PropertyGrid();
this.SuspendLayout();
//
// pGridParams
//
this.pGridParams.CommandsVisibleIfAvailable = true;
this.pGridParams.Dock = System.Windows.Forms.DockStyle.Fill;
this.pGridParams.LargeButtons = false;
this.pGridParams.LineColor = System.Drawing.SystemColors.ScrollBar;
this.pGridParams.Location = new System.Drawing.Point(0, 0);
this.pGridParams.Name = "pGridParams";
this.pGridParams.PropertySort = System.Windows.Forms.PropertySort.Alphabetical;
this.pGridParams.Size = new System.Drawing.Size(292, 273);
this.pGridParams.TabIndex = 0;
this.pGridParams.Text = "PropertyGrid";
this.pGridParams.ViewBackColor = System.Drawing.SystemColors.Window;
this.pGridParams.ViewForeColor = System.Drawing.SystemColors.WindowText;
//
// frmTreeParams
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.ControlBox = false;
this.Controls.Add(this.pGridParams);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
this.Name = "frmTreeParams";
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "Tree Parameters";
this.TopMost = true;
this.ResumeLayout(false);
}
#endregion
}
}
frmRender.cs: (contiene el método Main)
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using TreeSharp;
namespace TreeSharp
{
/// <summary>
/// This is the main class of my Direct3D application
/// </summary>
public class frmRender : Form
{
#region Control Initialization
private System.Windows.Forms.ListView lvwRules;
private System.Windows.Forms.Button cmdAddRule;
private System.Windows.Forms.NumericUpDown numProbability;
private System.Windows.Forms.TextBox txtRightSide;
private System.Windows.Forms.Splitter spltter;
private System.Windows.Forms.Panel pnlRender;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.ColumnHeader hdrLeftSide;
private System.Windows.Forms.ColumnHeader hdrRightSide;
private System.Windows.Forms.ColumnHeader hdrProbability;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.TextBox txtStartString;
private System.Windows.Forms.Button cmdGenerate;
private System.Windows.Forms.Button cmdPreview;
private System.Windows.Forms.ColumnHeader hdrCommand;
private System.Windows.Forms.ColumnHeader hdrDescription;
private System.Windows.Forms.Panel pnlHelp;
private System.Windows.Forms.Splitter splHelp;
private System.Windows.Forms.GroupBox gBoxHelp;
private System.Windows.Forms.Panel pnlLeft;
private System.Windows.Forms.Panel pnlRules;
private System.Windows.Forms.ListView lvwHelp;
private System.Windows.Forms.Button cmdModify;
private System.Windows.Forms.Button cmdDelete;
private System.Windows.Forms.NumericUpDown numIterations;
private System.Windows.Forms.GroupBox gBoxRules;
private System.Windows.Forms.TextBox txtLeftSide;
private void InitializeComponent()
{
this.lvwRules = new System.Windows.Forms.ListView();
this.hdrLeftSide = new System.Windows.Forms.ColumnHeader();
this.hdrRightSide = new System.Windows.Forms.ColumnHeader();
this.hdrProbability = new System.Windows.Forms.ColumnHeader();
this.cmdAddRule = new System.Windows.Forms.Button();
this.numProbability = new System.Windows.Forms.NumericUpDown();
this.txtRightSide = new System.Windows.Forms.TextBox();
this.pnlLeft = new System.Windows.Forms.Panel();
this.pnlRules = new System.Windows.Forms.Panel();
this.gBoxRules = new System.Windows.Forms.GroupBox();
this.txtLeftSide = new System.Windows.Forms.TextBox();
this.cmdModify = new System.Windows.Forms.Button();
this.cmdDelete = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.numIterations = new System.Windows.Forms.NumericUpDown();
this.label5 = new System.Windows.Forms.Label();
this.txtStartString = new System.Windows.Forms.TextBox();
this.cmdGenerate = new System.Windows.Forms.Button();
this.cmdPreview = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.splHelp = new System.Windows.Forms.Splitter();
this.pnlHelp = new System.Windows.Forms.Panel();
this.gBoxHelp = new System.Windows.Forms.GroupBox();
this.lvwHelp = new System.Windows.Forms.ListView();
this.hdrCommand = new System.Windows.Forms.ColumnHeader();
this.hdrDescription = new System.Windows.Forms.ColumnHeader();
this.spltter = new System.Windows.Forms.Splitter();
this.pnlRender = new System.Windows.Forms.Panel();
((System.ComponentModel.ISupportInitialize)(this.numProbability)).BeginInit();
this.pnlLeft.SuspendLayout();
this.pnlRules.SuspendLayout();
this.gBoxRules.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numIterations)).BeginInit();
this.pnlHelp.SuspendLayout();
this.gBoxHelp.SuspendLayout();
this.SuspendLayout();
//
// lvwRules
//
this.lvwRules.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lvwRules.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.hdrLeftSide,
this.hdrRightSide,
this.hdrProbability});
this.lvwRules.Font = new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.lvwRules.FullRowSelect = true;
this.lvwRules.GridLines = true;
this.lvwRules.HideSelection = false;
this.lvwRules.Location = new System.Drawing.Point(8, 96);
this.lvwRules.MultiSelect = false;
this.lvwRules.Name = "lvwRules";
this.lvwRules.Size = new System.Drawing.Size(256, 82);
this.lvwRules.TabIndex = 9;
this.lvwRules.View = System.Windows.Forms.View.Details;
this.lvwRules.SelectedIndexChanged += new System.EventHandler(this.lvwRules_SelectedIndexChanged);
//
// hdrLeftSide
//
this.hdrLeftSide.Text = "Left";
this.hdrLeftSide.Width = 69;
//
// hdrRightSide
//
this.hdrRightSide.Text = "Right";
this.hdrRightSide.Width = 115;
//
// hdrProbability
//
this.hdrProbability.Text = "Prob";
this.hdrProbability.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
this.hdrProbability.Width = 52;
//
// cmdAddRule
//
this.cmdAddRule.Location = new System.Drawing.Point(8, 64);
this.cmdAddRule.Name = "cmdAddRule";
this.cmdAddRule.TabIndex = 6;
this.cmdAddRule.Text = "&Add";
this.cmdAddRule.Click += new System.EventHandler(this.cmdAddRule_Click);
//
// numProbability
//
this.numProbability.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.numProbability.DecimalPlaces = 2;
this.numProbability.Font = new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.numProbability.Increment = new System.Decimal(new int[] {
5,
0,
0,
131072});
this.numProbability.Location = new System.Drawing.Point(208, 32);
this.numProbability.Maximum = new System.Decimal(new int[] {
1,
0,
0,
0});
this.numProbability.Name = "numProbability";
this.numProbability.Size = new System.Drawing.Size(56, 22);
this.numProbability.TabIndex = 5;
this.numProbability.Value = new System.Decimal(new int[] {
10,
0,
0,
65536});
this.numProbability.Leave += new System.EventHandler(this.RuleControls_Leave);
//
// txtRightSide
//
this.txtRightSide.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtRightSide.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
this.txtRightSide.Font = new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.txtRightSide.Location = new System.Drawing.Point(64, 32);
this.txtRightSide.Name = "txtRightSide";
this.txtRightSide.Size = new System.Drawing.Size(136, 22);
this.txtRightSide.TabIndex = 3;
this.txtRightSide.Text = "";
this.txtRightSide.TextChanged += new System.EventHandler(this.RuleControls_Leave);
this.txtRightSide.Leave += new System.EventHandler(this.RuleControls_Leave);
//
// pnlLeft
//
this.pnlLeft.Controls.Add(this.pnlRules);
this.pnlLeft.Controls.Add(this.splHelp);
this.pnlLeft.Controls.Add(this.pnlHelp);
this.pnlLeft.Dock = System.Windows.Forms.DockStyle.Left;
this.pnlLeft.Location = new System.Drawing.Point(0, 0);
this.pnlLeft.Name = "pnlLeft";
this.pnlLeft.Size = new System.Drawing.Size(272, 480);
this.pnlLeft.TabIndex = 10;
//
// pnlRules
//
this.pnlRules.Controls.Add(this.gBoxRules);
this.pnlRules.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlRules.Location = new System.Drawing.Point(0, 0);
this.pnlRules.Name = "pnlRules";
this.pnlRules.Size = new System.Drawing.Size(272, 300);
this.pnlRules.TabIndex = 23;
//
// gBoxRules
//
this.gBoxRules.Controls.Add(this.txtLeftSide);
this.gBoxRules.Controls.Add(this.cmdAddRule);
this.gBoxRules.Controls.Add(this.cmdModify);
this.gBoxRules.Controls.Add(this.cmdDelete);
this.gBoxRules.Controls.Add(this.numProbability);
this.gBoxRules.Controls.Add(this.txtRightSide);
this.gBoxRules.Controls.Add(this.label2);
this.gBoxRules.Controls.Add(this.label3);
this.gBoxRules.Controls.Add(this.label4);
this.gBoxRules.Controls.Add(this.numIterations);
this.gBoxRules.Controls.Add(this.label5);
this.gBoxRules.Controls.Add(this.txtStartString);
this.gBoxRules.Controls.Add(this.lvwRules);
this.gBoxRules.Controls.Add(this.cmdGenerate);
this.gBoxRules.Controls.Add(this.cmdPreview);
this.gBoxRules.Controls.Add(this.label1);
this.gBoxRules.Dock = System.Windows.Forms.DockStyle.Fill;
this.gBoxRules.Location = new System.Drawing.Point(0, 0);
this.gBoxRules.Name = "gBoxRules";
this.gBoxRules.Size = new System.Drawing.Size(272, 300);
this.gBoxRules.TabIndex = 0;
this.gBoxRules.TabStop = false;
this.gBoxRules.Text = "Rule Editor";
//
// txtLeftSide
//
this.txtLeftSide.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
this.txtLeftSide.Font = new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.txtLeftSide.Location = new System.Drawing.Point(8, 32);
this.txtLeftSide.MaxLength = 1;
this.txtLeftSide.Name = "txtLeftSide";
this.txtLeftSide.Size = new System.Drawing.Size(48, 22);
this.txtLeftSide.TabIndex = 1;
this.txtLeftSide.Text = "";
//
// cmdModify
//
this.cmdModify.Location = new System.Drawing.Point(88, 64);
this.cmdModify.Name = "cmdModify";
this.cmdModify.TabIndex = 7;
this.cmdModify.Text = "&Modify";
this.cmdModify.Click += new System.EventHandler(this.cmdModify_Click);
//
// cmdDelete
//
this.cmdDelete.Location = new System.Drawing.Point(168, 64);
this.cmdDelete.Name = "cmdDelete";
this.cmdDelete.TabIndex = 8;
this.cmdDelete.Text = "&Delete";
this.cmdDelete.Click += new System.EventHandler(this.cmdDelete_Click);
//
// label2
//
this.label2.Location = new System.Drawing.Point(64, 16);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(100, 16);
this.label2.TabIndex = 2;
this.label2.Text = "Right Side:";
//
// label3
//
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label3.Location = new System.Drawing.Point(208, 16);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(40, 16);
this.label3.TabIndex = 4;
this.label3.Text = "Prob.";
//
// label4
//
this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label4.Location = new System.Drawing.Point(8, 184);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(80, 16);
this.label4.TabIndex = 10;
this.label4.Text = "Iterations:";
//
// numIterations
//
this.numIterations.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.numIterations.Location = new System.Drawing.Point(8, 200);
this.numIterations.Name = "numIterations";
this.numIterations.Size = new System.Drawing.Size(80, 20);
this.numIterations.TabIndex = 11;
this.numIterations.Value = new System.Decimal(new int[] {
5,
0,
0,
0});
//
// label5
//
this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label5.Location = new System.Drawing.Point(8, 224);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(100, 16);
this.label5.TabIndex = 12;
this.label5.Text = "Start String:";
//
// txtStartString
//
this.txtStartString.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtStartString.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
this.txtStartString.Font = new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.txtStartString.Location = new System.Drawing.Point(8, 240);
this.txtStartString.Name = "txtStartString";
this.txtStartString.Size = new System.Drawing.Size(168, 22);
this.txtStartString.TabIndex = 13;
this.txtStartString.Text = "F";
//
// cmdGenerate
//
this.cmdGenerate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.cmdGenerate.Location = new System.Drawing.Point(8, 272);
this.cmdGenerate.Name = "cmdGenerate";
this.cmdGenerate.Size = new System.Drawing.Size(80, 23);
this.cmdGenerate.TabIndex = 15;
this.cmdGenerate.Text = "&Render Tree";
this.cmdGenerate.Click += new System.EventHandler(this.cmdGenerate_Click);
//
// cmdPreview
//
this.cmdPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.cmdPreview.Location = new System.Drawing.Point(184, 240);
this.cmdPreview.Name = "cmdPreview";
this.cmdPreview.Size = new System.Drawing.Size(80, 23);
this.cmdPreview.TabIndex = 14;
this.cmdPreview.Text = "Preview";
this.cmdPreview.Click += new System.EventHandler(this.cmdPreview_Click);
//
// label1
//
this.label1.BackColor = System.Drawing.Color.Transparent;
this.label1.Location = new System.Drawing.Point(8, 16);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(56, 16);
this.label1.TabIndex = 0;
this.label1.Text = "Left Side:";
//
// splHelp
//
this.splHelp.Dock = System.Windows.Forms.DockStyle.Bottom;
this.splHelp.Location = new System.Drawing.Point(0, 300);
this.splHelp.Name = "splHelp";
this.splHelp.Size = new System.Drawing.Size(272, 4);
this.splHelp.TabIndex = 22;
this.splHelp.TabStop = false;
//
// pnlHelp
//
this.pnlHelp.Controls.Add(this.gBoxHelp);
this.pnlHelp.Dock = System.Windows.Forms.DockStyle.Bottom;
this.pnlHelp.Location = new System.Drawing.Point(0, 304);
this.pnlHelp.Name = "pnlHelp";
this.pnlHelp.Size = new System.Drawing.Size(272, 176);
this.pnlHelp.TabIndex = 21;
//
// gBoxHelp
//
this.gBoxHelp.Controls.Add(this.lvwHelp);
this.gBoxHelp.Dock = System.Windows.Forms.DockStyle.Fill;
this.gBoxHelp.Location = new System.Drawing.Point(0, 0);
this.gBoxHelp.Name = "gBoxHelp";
this.gBoxHelp.Size = new System.Drawing.Size(272, 176);
this.gBoxHelp.TabIndex = 0;
this.gBoxHelp.TabStop = false;
this.gBoxHelp.Text = "Help";
//
// lvwHelp
//
this.lvwHelp.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.hdrCommand,
this.hdrDescription});
this.lvwHelp.Dock = System.Windows.Forms.DockStyle.Fill;
this.lvwHelp.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
this.lvwHelp.Location = new System.Drawing.Point(3, 16);
this.lvwHelp.MultiSelect = false;
this.lvwHelp.Name = "lvwHelp";
this.lvwHelp.Size = new System.Drawing.Size(266, 157);
this.lvwHelp.TabIndex = 0;
this.lvwHelp.View = System.Windows.Forms.View.Details;
//
// hdrCommand
//
this.hdrCommand.Text = "Command";
this.hdrCommand.Width = 40;
//
// hdrDescription
//
this.hdrDescription.Text = "Description";
this.hdrDescription.Width = 201;
//
// spltter
//
this.spltter.Location = new System.Drawing.Point(272, 0);
this.spltter.Name = "spltter";
this.spltter.Size = new System.Drawing.Size(4, 480);
this.spltter.TabIndex = 11;
this.spltter.TabStop = false;
//
// pnlRender
//
this.pnlRender.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlRender.Location = new System.Drawing.Point(276, 0);
this.pnlRender.Name = "pnlRender";
this.pnlRender.Size = new System.Drawing.Size(364, 480);
this.pnlRender.TabIndex = 0;
//
// frmRender
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(640, 480);
this.Controls.Add(this.pnlRender);
this.Controls.Add(this.spltter);
this.Controls.Add(this.pnlLeft);
this.MinimumSize = new System.Drawing.Size(648, 507);
this.Name = "frmRender";
this.Text = "L-System Generator";
this.Closing += new System.ComponentModel.CancelEventHandler(this.frmRender_Closing);
((System.ComponentModel.ISupportInitialize)(this.numProbability)).EndInit();
this.pnlLeft.ResumeLayout(false);
this.pnlRules.ResumeLayout(false);
this.gBoxRules.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.numIterations)).EndInit();
this.pnlHelp.ResumeLayout(false);
this.gBoxHelp.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private Renderer _renderer;
private LSystem _lSystem;
private TreeParams _treeParams;
private frmTreeParams _frmParams;
private CommandParser _parser;
private bool _rendererIsOK;
public frmRender()
{
this.InitializeComponent();
this.FillHelpListView();
_lSystem = new LSystem();
_treeParams = new TreeParams();
_renderer = new Renderer(this.pnlRender, new System.Drawing.Font(this.Font, FontStyle.Regular));
_rendererIsOK = _renderer.InitializeGraphics();
if(!_rendererIsOK)
{
MessageBox.Show("Couldn't initialize graphics.\nNo trees will be rendered.","Error",MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
_parser = new CommandParser(_renderer.Device);
_parser.TreeParameters = _treeParams;
}
this.InitParametersForm();
this.EnableControls();
this.Focus();
}
private void FillHelpListView()
{
lvwHelp.Items.Add(new ListViewItem(new string[] {"F","Moves Forward"}, -1));
lvwHelp.Items.Add(new ListViewItem(new string[] {"+","Rotates clockwise in X axis"}, -1));
lvwHelp.Items.Add(new ListViewItem(new string[] {"-","Rotates counter-clockwise in X axis"}, -1));
lvwHelp.Items.Add(new ListViewItem(new string[] {"*","Rotates clockwise in Y axis"}, -1));
lvwHelp.Items.Add(new ListViewItem(new string[] {"/","Rotates counter-clockwise in Y axis"}, -1));
lvwHelp.Items.Add(new ListViewItem(new string[] {"|","Rotates clockwise in Z axis"}, -1));
lvwHelp.Items.Add(new ListViewItem(new string[] {"#","Rotates counter-clockwise in Z axis"}, -1));
lvwHelp.Items.Add(new ListViewItem(new string[] {"L","Draws a leaf"}, -1));
lvwHelp.Items.Add(new ListViewItem(new string[] {"[","Creates a new branch"}, -1));
lvwHelp.Items.Add(new ListViewItem(new string[] {"]","Ends the current branch"}, -1));
}
private void InitParametersForm()
{
Point location;
_frmParams = new frmTreeParams();
location = this.Location;
location.X += this.Width;
if ((location.X + _frmParams.Width) > Screen.PrimaryScreen.Bounds.Width)
{
location.X = Screen.PrimaryScreen.Bounds.Width - _frmParams.Width;
}
if ((location.Y + _frmParams.Height) > Screen.PrimaryScreen.Bounds.Height)
{
location.X = Screen.PrimaryScreen.Bounds.Height - _frmParams.Height;
}
if (location.Y < this.PointToScreen(Point.Empty).Y)
{
location.Y = this.PointToScreen(Point.Empty).Y ;
}
_frmParams.Location = location;
_frmParams.TreeParameters = _treeParams;
_frmParams.Show();
}
/// <summary>
/// Our mainloop
/// </summary>
public void Run()
{
if(_rendererIsOK)
{
// While the form is still valid, render and process messages
while (Created)
{
_renderer.FrameMove();
_renderer.Render();
Application.DoEvents();
}
}
}
protected override void OnPaint(PaintEventArgs e)
{
if(_rendererIsOK)
{
_renderer.Render();
}
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
// Don't do anything to avoid the background being painted.
}
private void EnableControls()
{
cmdAddRule.Enabled = ((txtLeftSide.Text != "") && (txtRightSide.Text != ""));
cmdModify.Enabled = (lvwRules.SelectedItems.Count > 0);
cmdDelete.Enabled = (lvwRules.SelectedItems.Count > 0);
cmdPreview.Enabled = (txtStartString.Text != "");
cmdGenerate.Enabled = ((txtStartString.Text != "") && (lvwRules.Items.Count > 0));
}
private void cboLeftSide_SelectedIndexChanged(object sender, System.EventArgs e)
{
EnableControls();
}
private void buildRulesTable()
{
_lSystem.ClearRules();
foreach(ListViewItem lvi in lvwRules.Items)
{
char cLeftSide = lvi.SubItems[0].Text[0];
string sLeftSide = lvi.SubItems[1].Text;
float fProb = float.Parse(lvi.SubItems[2].Text);
Rule newRule = new Rule(cLeftSide,sLeftSide,fProb);
_lSystem.AddRule(newRule);
}
}
private void cmdAddRule_Click(object sender, System.EventArgs e)
{
lvwRules.Items.Add(new ListViewItem(new string[] {txtLeftSide.Text, txtRightSide.Text, numProbability.Value.ToString("0.00")}, -1));
buildRulesTable();
EnableControls();
txtLeftSide.Focus();
}
private void cmdModify_Click(object sender, System.EventArgs e)
{
ListViewItem lvwItem;
lvwItem = lvwRules.SelectedItems[0];
lvwItem.SubItems[0].Text = txtLeftSide.Text;
lvwItem.SubItems[1].Text = txtRightSide.Text;
lvwItem.SubItems[2].Text = numProbability.Value.ToString("0.00");
buildRulesTable();
EnableControls();
}
private void cmdDelete_Click(object sender, System.EventArgs e)
{
lvwRules.SelectedItems[0].Remove();
buildRulesTable();
EnableControls();
}
private void lvwRules_SelectedIndexChanged(object sender, System.EventArgs e)
{
if (lvwRules.SelectedItems.Count > 0)
{
ListViewItem lvwItem = lvwRules.SelectedItems[0];
txtLeftSide.Text = lvwItem.SubItems[0].Text;
txtRightSide.Text = lvwItem.SubItems[1].Text;
numProbability.Value = decimal.Parse(lvwItem.SubItems[2].Text);
}
EnableControls();
}
private void cmdPreview_Click(object sender, System.EventArgs e)
{
}
private void cmdGenerate_Click(object sender, System.EventArgs e)
{
string sCommand = _lSystem.PerformIterations(txtStartString.Text, (int)numIterations.Value);
Console.WriteLine("({0}) - {1}", sCommand.Length, sCommand);
VertexBuffer vb = _parser.Parse(sCommand);
_renderer.Buffer = vb;
}
private void RuleControls_Leave(object sender, System.EventArgs e)
{
EnableControls();
}
private void frmRender_Closing(object sender, CancelEventArgs e)
{
if ( ! ( null == _frmParams || _frmParams.IsDisposed ) )
{
_frmParams.Close();
}
}
#region Main
/// <summary>
/// The main entry point for the application
/// </summary>
static void Main()
{
using (frmRender frmRender = new frmRender())
{
frmRender.Show();
frmRender.Run();
}
}
#endregion
}
}
Y ya está... De momento eso es todo... ;)
Cuando tenga listo el pintado del árbol, postearé el código completo (si puedo, en un zip, en vez de poner el código...)