| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- unit fTreeD;
- interface
- uses
- Winapi.OpenGL,
- Winapi.Windows,
- System.SysUtils,
- System.Classes,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.Menus,
- Vcl.ExtDlgs,
- Vcl.ExtCtrls,
- Vcl.ComCtrls,
- Vcl.StdCtrls,
- GLS.Scene,
- GLS.Objects,
- GLS.SceneViewer,
- GLS.Tree,
- GLS.Texture,
- GLS.VectorFileObjects,
- GLS.AsyncTimer,
- GLS.Cadencer,
- GLS.Material,
- GLS.Coordinates,
- GLS.BaseClasses,
- GLScene.Utils,
- GLS.FileTGA;
- type
- TFormTree = class(TForm)
- GLScene1: TGLScene;
- GLSceneViewer1: TGLSceneViewer;
- GLCamera1: TGLCamera;
- GLDummyCube1: TGLDummyCube;
- GLLightSource1: TGLLightSource;
- GLMaterialLibrary1: TGLMaterialLibrary;
- Panel1: TPanel;
- Label1: TLabel;
- Label2: TLabel;
- TrackBar1: TTrackBar;
- TrackBar2: TTrackBar;
- Label3: TLabel;
- TrackBar3: TTrackBar;
- Label4: TLabel;
- TrackBar4: TTrackBar;
- Label5: TLabel;
- TrackBar5: TTrackBar;
- Label6: TLabel;
- TrackBar6: TTrackBar;
- Label7: TLabel;
- TrackBar7: TTrackBar;
- Label8: TLabel;
- TrackBar8: TTrackBar;
- Label9: TLabel;
- TrackBar9: TTrackBar;
- TrackBar10: TTrackBar;
- Label10: TLabel;
- GLFreeForm1: TGLFreeForm;
- MainMenu1: TMainMenu;
- File1: TMenuItem;
- LoadTree1: TMenuItem;
- SaveTree1: TMenuItem;
- N1: TMenuItem;
- Exit1: TMenuItem;
- NewTree1: TMenuItem;
- Material1: TMenuItem;
- LeafFrontTexture1: TMenuItem;
- LeafBackTexture1: TMenuItem;
- BranchTexture1: TMenuItem;
- N2: TMenuItem;
- ExportMesh1: TMenuItem;
- Label11: TLabel;
- OpenDialog1: TOpenDialog;
- SaveDialog1: TSaveDialog;
- GLPlane1: TGLPlane;
- Label12: TLabel;
- Edit1: TEdit;
- Button1: TButton;
- CheckBox1: TCheckBox;
- TrackBar11: TTrackBar;
- SaveDialog2: TSaveDialog;
- SaveDialog3: TSaveDialog;
- ExportMaterialLibrary1: TMenuItem;
- OpenPictureDialog1: TOpenPictureDialog;
- Label13: TLabel;
- TrackBar12: TTrackBar;
- AsyncTimer1: TGLAsyncTimer;
- GLCadencer1: TGLCadencer;
- miFPS: TMenuItem;
- procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
- X, Y: Integer);
- procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- procedure TrackBar1Change(Sender: TObject);
- procedure TrackBar2Change(Sender: TObject);
- procedure TrackBar3Change(Sender: TObject);
- procedure TrackBar4Change(Sender: TObject);
- procedure TrackBar5Change(Sender: TObject);
- procedure TrackBar6Change(Sender: TObject);
- procedure TrackBar7Change(Sender: TObject);
- procedure TrackBar8Change(Sender: TObject);
- procedure TrackBar9Change(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure TrackBar10Change(Sender: TObject);
- procedure NewTree1Click(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- procedure LoadTree1Click(Sender: TObject);
- procedure SaveTree1Click(Sender: TObject);
- procedure ExportMesh1Click(Sender: TObject);
- procedure Exit1Click(Sender: TObject);
- procedure LeafFrontTexture1Click(Sender: TObject);
- procedure LeafBackTexture1Click(Sender: TObject);
- procedure BranchTexture1Click(Sender: TObject);
- procedure CheckBox1Click(Sender: TObject);
- procedure TrackBar11Change(Sender: TObject);
- procedure ExportMaterialLibrary1Click(Sender: TObject);
- procedure TrackBar12Change(Sender: TObject);
- procedure AsyncTimer1Timer(Sender: TObject);
- procedure GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
- public
- mx, my: Integer;
- GLTree1: TGLTree;
- procedure AlignControlsToTree;
- procedure NewTree;
- end;
- var
- FormTree: TFormTree;
- implementation
- {$R *.dfm}
- procedure TFormTree.AlignControlsToTree;
- begin
- TrackBar1.Position := GLTree1.Depth;
- TrackBar2.Position := Round(GLTree1.BranchTwist);
- TrackBar3.Position := Round(GLTree1.BranchAngle * 100);
- TrackBar4.Position := Round(GLTree1.BranchAngleBias * 100);
- TrackBar5.Position := Round(GLTree1.BranchSize * 10);
- TrackBar6.Position := Round(GLTree1.BranchRadius * 25);
- TrackBar7.Position := Round(GLTree1.BranchNoise * 100);
- TrackBar8.Position := Round(GLTree1.LeafSize * 100);
- TrackBar9.Position := Round(GLTree1.LeafThreshold * 100);
- TrackBar10.Position := GLTree1.BranchFacets;
- Edit1.Text := IntToStr(GLTree1.Seed);
- CheckBox1.Checked := GLTree1.CentralLeader;
- TrackBar11.Position := Round(GLTree1.CentralLeaderBias * 100);
- GLTree1.AutoRebuild := True;
- GLTree1.RebuildTree;
- end;
- procedure TFormTree.NewTree;
- begin
- GLTree1.Free;
- GLTree1 := TGLTree(GLScene1.Objects.AddNewChild(TGLTree));
- GLTree1.AutoRebuild := False;
- with GLTree1 do
- begin
- MaterialLibrary := GLMaterialLibrary1;
- LeafMaterialName := 'LeafFront';
- LeafBackMaterialName := 'LeafBack';
- BranchMaterialName := 'Branch';
- Depth := 6;
- LeafSize := 0.2;
- BranchRadius := 0.08;
- BranchNoise := 0.5;
- Randomize;
- Seed := Round((2 * Random - 1) * (MaxInt - 1));
- end;
- AlignControlsToTree;
- end;
- // Start up
- procedure TFormTree.FormCreate(Sender: TObject);
- begin
- var Path: TFileName := GetCurrentAssetPath();
- SetCurrentDir(Path + '\texture');
- // Set up default textures
- with GLMaterialLibrary1.AddTextureMaterial('LeafFront', 'maple_multi.tga') do
- begin
- Material.BlendingMode := bmAlphaTest50;
- Material.Texture.TextureMode := tmModulate;
- Material.Texture.TextureFormat := tfRGBA;
- end;
- with GLMaterialLibrary1.AddTextureMaterial('LeafBack', 'maple_multi.tga') do
- begin
- Material.BlendingMode := bmAlphaTest50;
- Material.Texture.TextureMode := tmModulate;
- Material.Texture.TextureFormat := tfRGBA;
- end;
- with GLMaterialLibrary1.AddTextureMaterial('Branch', 'zbark_016.jpg') do
- Material.Texture.TextureMode := tmModulate;
- // Set a up a tree
- NewTree;
- end;
- // Camera controls
- procedure TFormTree.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- mx := X;
- my := Y;
- end;
- procedure TFormTree.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- begin
- if ssLeft in Shift then
- GLCamera1.MoveAroundTarget(my - Y, mx - X)
- else if ssRight in Shift then
- GLCamera1.AdjustDistanceToTarget(1 + (my - Y) * 0.01);
- mx := X;
- my := Y;
- end;
- // Tree controls
- procedure TFormTree.TrackBar1Change(Sender: TObject);
- begin
- GLTree1.Depth := Integer(TrackBar1.Position);
- end;
- procedure TFormTree.TrackBar2Change(Sender: TObject);
- begin
- GLTree1.BranchTwist := Integer(TrackBar2.Position);
- end;
- procedure TFormTree.TrackBar3Change(Sender: TObject);
- begin
- GLTree1.BranchAngle := TrackBar3.Position / 100;
- end;
- procedure TFormTree.TrackBar4Change(Sender: TObject);
- begin
- GLTree1.BranchAngleBias := TrackBar4.Position / 100;
- end;
- procedure TFormTree.TrackBar5Change(Sender: TObject);
- begin
- GLTree1.BranchSize := TrackBar5.Position / 10;
- end;
- procedure TFormTree.TrackBar6Change(Sender: TObject);
- begin
- GLTree1.BranchRadius := TrackBar6.Position / 25;
- end;
- procedure TFormTree.TrackBar7Change(Sender: TObject);
- begin
- GLTree1.BranchNoise := TrackBar7.Position / 100;
- end;
- procedure TFormTree.TrackBar8Change(Sender: TObject);
- begin
- GLTree1.LeafSize := TrackBar8.Position / 100;
- end;
- procedure TFormTree.TrackBar9Change(Sender: TObject);
- begin
- GLTree1.LeafThreshold := TrackBar9.Position / 100;
- end;
- procedure TFormTree.TrackBar10Change(Sender: TObject);
- begin
- GLTree1.BranchFacets := Integer(TrackBar10.Position);
- end;
- procedure TFormTree.TrackBar11Change(Sender: TObject);
- begin
- GLTree1.CentralLeaderBias := TrackBar11.Position / 100;
- end;
- procedure TFormTree.TrackBar12Change(Sender: TObject);
- begin
- GLTree1.CenterBranchConstant := TrackBar12.Position / 100;
- end;
- procedure TFormTree.Button1Click(Sender: TObject);
- begin
- try
- GLTree1.Seed := StrToInt(Edit1.Text);
- except
- on E: Exception do
- begin
- Application.MessageBox('Invalid seed value. Resetting.', 'Error', MB_OK);
- Edit1.Text := IntToStr(GLTree1.Seed);
- end;
- end;
- end;
- procedure TFormTree.CheckBox1Click(Sender: TObject);
- begin
- GLTree1.CentralLeader := CheckBox1.Checked;
- end;
- // Menu options
- procedure TFormTree.NewTree1Click(Sender: TObject);
- begin
- NewTree;
- end;
- procedure TFormTree.LoadTree1Click(Sender: TObject);
- begin
- if not OpenDialog1.Execute then
- exit;
- GLTree1.LoadFromFile(OpenDialog1.FileName);
- AlignControlsToTree;
- end;
- procedure TFormTree.SaveTree1Click(Sender: TObject);
- begin
- if not SaveDialog1.Execute then
- exit;
- GLTree1.SaveToFile(SaveDialog1.FileName);
- end;
- procedure TFormTree.ExportMesh1Click(Sender: TObject);
- begin
- if not SaveDialog2.Execute then
- exit;
- GLTree1.BuildMesh(GLFreeForm1);
- GLFreeForm1.SaveToFile(SaveDialog2.FileName);
- end;
- procedure TFormTree.ExportMaterialLibrary1Click(Sender: TObject);
- begin
- if not SaveDialog3.Execute then
- exit;
- GLMaterialLibrary1.SaveToFile(SaveDialog3.FileName);
- end;
- procedure TFormTree.Exit1Click(Sender: TObject);
- begin
- FormTree.Close;
- end;
- procedure TFormTree.LeafFrontTexture1Click(Sender: TObject);
- begin
- if not OpenPictureDialog1.Execute then
- exit;
- with GLMaterialLibrary1.Materials.GetLibMaterialByName('LeafFront') do
- Material.Texture.Image.LoadFromFile(OpenPictureDialog1.FileName);
- GLTree1.StructureChanged;
- end;
- procedure TFormTree.LeafBackTexture1Click(Sender: TObject);
- begin
- if not OpenPictureDialog1.Execute then
- exit;
- with GLMaterialLibrary1.Materials.GetLibMaterialByName('LeafBack') do
- Material.Texture.Image.LoadFromFile(OpenPictureDialog1.FileName);
- GLTree1.StructureChanged;
- end;
- procedure TFormTree.BranchTexture1Click(Sender: TObject);
- begin
- if not OpenPictureDialog1.Execute then
- exit;
- with GLMaterialLibrary1.Materials.GetLibMaterialByName('Branch') do
- Material.Texture.Image.LoadFromFile(OpenPictureDialog1.FileName);
- GLTree1.StructureChanged;
- end;
- procedure TFormTree.AsyncTimer1Timer(Sender: TObject);
- begin
- miFPS.Caption := 'Tree Editor - ' + GLSceneViewer1.FramesPerSecondText;
- end;
- procedure TFormTree.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
- begin
- GLSceneViewer1.Invalidate;
- end;
- end.
|