fTreeD.pas 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. unit fTreeD;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. Winapi.Windows,
  6. System.SysUtils,
  7. System.Classes,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.Dialogs,
  12. Vcl.Menus,
  13. Vcl.ExtDlgs,
  14. Vcl.ExtCtrls,
  15. Vcl.ComCtrls,
  16. Vcl.StdCtrls,
  17. GLS.Scene,
  18. GLS.Objects,
  19. GLS.SceneViewer,
  20. GLS.Tree,
  21. GLS.Texture,
  22. GLS.VectorFileObjects,
  23. GLS.AsyncTimer,
  24. GLS.Cadencer,
  25. GLS.Material,
  26. GLS.Coordinates,
  27. GLS.BaseClasses,
  28. Stage.Utils,
  29. GLS.FileTGA;
  30. type
  31. TFormTree = class(TForm)
  32. GLScene1: TGLScene;
  33. GLSceneViewer1: TGLSceneViewer;
  34. GLCamera1: TGLCamera;
  35. GLDummyCube1: TGLDummyCube;
  36. GLLightSource1: TGLLightSource;
  37. GLMaterialLibrary1: TGLMaterialLibrary;
  38. Panel1: TPanel;
  39. Label1: TLabel;
  40. Label2: TLabel;
  41. TrackBar1: TTrackBar;
  42. TrackBar2: TTrackBar;
  43. Label3: TLabel;
  44. TrackBar3: TTrackBar;
  45. Label4: TLabel;
  46. TrackBar4: TTrackBar;
  47. Label5: TLabel;
  48. TrackBar5: TTrackBar;
  49. Label6: TLabel;
  50. TrackBar6: TTrackBar;
  51. Label7: TLabel;
  52. TrackBar7: TTrackBar;
  53. Label8: TLabel;
  54. TrackBar8: TTrackBar;
  55. Label9: TLabel;
  56. TrackBar9: TTrackBar;
  57. TrackBar10: TTrackBar;
  58. Label10: TLabel;
  59. GLFreeForm1: TGLFreeForm;
  60. MainMenu1: TMainMenu;
  61. File1: TMenuItem;
  62. LoadTree1: TMenuItem;
  63. SaveTree1: TMenuItem;
  64. N1: TMenuItem;
  65. Exit1: TMenuItem;
  66. NewTree1: TMenuItem;
  67. Material1: TMenuItem;
  68. LeafFrontTexture1: TMenuItem;
  69. LeafBackTexture1: TMenuItem;
  70. BranchTexture1: TMenuItem;
  71. N2: TMenuItem;
  72. ExportMesh1: TMenuItem;
  73. Label11: TLabel;
  74. OpenDialog1: TOpenDialog;
  75. SaveDialog1: TSaveDialog;
  76. GLPlane1: TGLPlane;
  77. Label12: TLabel;
  78. Edit1: TEdit;
  79. Button1: TButton;
  80. CheckBox1: TCheckBox;
  81. TrackBar11: TTrackBar;
  82. SaveDialog2: TSaveDialog;
  83. SaveDialog3: TSaveDialog;
  84. ExportMaterialLibrary1: TMenuItem;
  85. OpenPictureDialog1: TOpenPictureDialog;
  86. Label13: TLabel;
  87. TrackBar12: TTrackBar;
  88. AsyncTimer1: TGLAsyncTimer;
  89. GLCadencer1: TGLCadencer;
  90. miFPS: TMenuItem;
  91. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
  92. X, Y: Integer);
  93. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  94. procedure TrackBar1Change(Sender: TObject);
  95. procedure TrackBar2Change(Sender: TObject);
  96. procedure TrackBar3Change(Sender: TObject);
  97. procedure TrackBar4Change(Sender: TObject);
  98. procedure TrackBar5Change(Sender: TObject);
  99. procedure TrackBar6Change(Sender: TObject);
  100. procedure TrackBar7Change(Sender: TObject);
  101. procedure TrackBar8Change(Sender: TObject);
  102. procedure TrackBar9Change(Sender: TObject);
  103. procedure FormCreate(Sender: TObject);
  104. procedure TrackBar10Change(Sender: TObject);
  105. procedure NewTree1Click(Sender: TObject);
  106. procedure Button1Click(Sender: TObject);
  107. procedure LoadTree1Click(Sender: TObject);
  108. procedure SaveTree1Click(Sender: TObject);
  109. procedure ExportMesh1Click(Sender: TObject);
  110. procedure Exit1Click(Sender: TObject);
  111. procedure LeafFrontTexture1Click(Sender: TObject);
  112. procedure LeafBackTexture1Click(Sender: TObject);
  113. procedure BranchTexture1Click(Sender: TObject);
  114. procedure CheckBox1Click(Sender: TObject);
  115. procedure TrackBar11Change(Sender: TObject);
  116. procedure ExportMaterialLibrary1Click(Sender: TObject);
  117. procedure TrackBar12Change(Sender: TObject);
  118. procedure AsyncTimer1Timer(Sender: TObject);
  119. procedure GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
  120. public
  121. mx, my: Integer;
  122. GLTree1: TGLTree;
  123. procedure AlignControlsToTree;
  124. procedure NewTree;
  125. end;
  126. var
  127. FormTree: TFormTree;
  128. implementation
  129. {$R *.dfm}
  130. procedure TFormTree.AlignControlsToTree;
  131. begin
  132. TrackBar1.Position := GLTree1.Depth;
  133. TrackBar2.Position := Round(GLTree1.BranchTwist);
  134. TrackBar3.Position := Round(GLTree1.BranchAngle * 100);
  135. TrackBar4.Position := Round(GLTree1.BranchAngleBias * 100);
  136. TrackBar5.Position := Round(GLTree1.BranchSize * 10);
  137. TrackBar6.Position := Round(GLTree1.BranchRadius * 25);
  138. TrackBar7.Position := Round(GLTree1.BranchNoise * 100);
  139. TrackBar8.Position := Round(GLTree1.LeafSize * 100);
  140. TrackBar9.Position := Round(GLTree1.LeafThreshold * 100);
  141. TrackBar10.Position := GLTree1.BranchFacets;
  142. Edit1.Text := IntToStr(GLTree1.Seed);
  143. CheckBox1.Checked := GLTree1.CentralLeader;
  144. TrackBar11.Position := Round(GLTree1.CentralLeaderBias * 100);
  145. GLTree1.AutoRebuild := True;
  146. GLTree1.RebuildTree;
  147. end;
  148. procedure TFormTree.NewTree;
  149. begin
  150. GLTree1.Free;
  151. GLTree1 := TGLTree(GLScene1.Objects.AddNewChild(TGLTree));
  152. GLTree1.AutoRebuild := False;
  153. with GLTree1 do
  154. begin
  155. MaterialLibrary := GLMaterialLibrary1;
  156. LeafMaterialName := 'LeafFront';
  157. LeafBackMaterialName := 'LeafBack';
  158. BranchMaterialName := 'Branch';
  159. Depth := 6;
  160. LeafSize := 0.2;
  161. BranchRadius := 0.08;
  162. BranchNoise := 0.5;
  163. Randomize;
  164. Seed := Round((2 * Random - 1) * (MaxInt - 1));
  165. end;
  166. AlignControlsToTree;
  167. end;
  168. // Start up
  169. procedure TFormTree.FormCreate(Sender: TObject);
  170. begin
  171. var Path: TFileName := GetCurrentAssetPath();
  172. SetCurrentDir(Path + '\texture');
  173. // Set up default textures
  174. with GLMaterialLibrary1.AddTextureMaterial('LeafFront', 'maple_multi.tga') do
  175. begin
  176. Material.BlendingMode := bmAlphaTest50;
  177. Material.Texture.TextureMode := tmModulate;
  178. Material.Texture.TextureFormat := tfRGBA;
  179. end;
  180. with GLMaterialLibrary1.AddTextureMaterial('LeafBack', 'maple_multi.tga') do
  181. begin
  182. Material.BlendingMode := bmAlphaTest50;
  183. Material.Texture.TextureMode := tmModulate;
  184. Material.Texture.TextureFormat := tfRGBA;
  185. end;
  186. with GLMaterialLibrary1.AddTextureMaterial('Branch', 'zbark_016.jpg') do
  187. Material.Texture.TextureMode := tmModulate;
  188. // Set a up a tree
  189. NewTree;
  190. end;
  191. // Camera controls
  192. procedure TFormTree.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  193. Shift: TShiftState; X, Y: Integer);
  194. begin
  195. mx := X;
  196. my := Y;
  197. end;
  198. procedure TFormTree.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  199. begin
  200. if ssLeft in Shift then
  201. GLCamera1.MoveAroundTarget(my - Y, mx - X)
  202. else if ssRight in Shift then
  203. GLCamera1.AdjustDistanceToTarget(1 + (my - Y) * 0.01);
  204. mx := X;
  205. my := Y;
  206. end;
  207. // Tree controls
  208. procedure TFormTree.TrackBar1Change(Sender: TObject);
  209. begin
  210. GLTree1.Depth := Integer(TrackBar1.Position);
  211. end;
  212. procedure TFormTree.TrackBar2Change(Sender: TObject);
  213. begin
  214. GLTree1.BranchTwist := Integer(TrackBar2.Position);
  215. end;
  216. procedure TFormTree.TrackBar3Change(Sender: TObject);
  217. begin
  218. GLTree1.BranchAngle := TrackBar3.Position / 100;
  219. end;
  220. procedure TFormTree.TrackBar4Change(Sender: TObject);
  221. begin
  222. GLTree1.BranchAngleBias := TrackBar4.Position / 100;
  223. end;
  224. procedure TFormTree.TrackBar5Change(Sender: TObject);
  225. begin
  226. GLTree1.BranchSize := TrackBar5.Position / 10;
  227. end;
  228. procedure TFormTree.TrackBar6Change(Sender: TObject);
  229. begin
  230. GLTree1.BranchRadius := TrackBar6.Position / 25;
  231. end;
  232. procedure TFormTree.TrackBar7Change(Sender: TObject);
  233. begin
  234. GLTree1.BranchNoise := TrackBar7.Position / 100;
  235. end;
  236. procedure TFormTree.TrackBar8Change(Sender: TObject);
  237. begin
  238. GLTree1.LeafSize := TrackBar8.Position / 100;
  239. end;
  240. procedure TFormTree.TrackBar9Change(Sender: TObject);
  241. begin
  242. GLTree1.LeafThreshold := TrackBar9.Position / 100;
  243. end;
  244. procedure TFormTree.TrackBar10Change(Sender: TObject);
  245. begin
  246. GLTree1.BranchFacets := Integer(TrackBar10.Position);
  247. end;
  248. procedure TFormTree.TrackBar11Change(Sender: TObject);
  249. begin
  250. GLTree1.CentralLeaderBias := TrackBar11.Position / 100;
  251. end;
  252. procedure TFormTree.TrackBar12Change(Sender: TObject);
  253. begin
  254. GLTree1.CenterBranchConstant := TrackBar12.Position / 100;
  255. end;
  256. procedure TFormTree.Button1Click(Sender: TObject);
  257. begin
  258. try
  259. GLTree1.Seed := StrToInt(Edit1.Text);
  260. except
  261. on E: Exception do
  262. begin
  263. Application.MessageBox('Invalid seed value. Resetting.', 'Error', MB_OK);
  264. Edit1.Text := IntToStr(GLTree1.Seed);
  265. end;
  266. end;
  267. end;
  268. procedure TFormTree.CheckBox1Click(Sender: TObject);
  269. begin
  270. GLTree1.CentralLeader := CheckBox1.Checked;
  271. end;
  272. // Menu options
  273. procedure TFormTree.NewTree1Click(Sender: TObject);
  274. begin
  275. NewTree;
  276. end;
  277. procedure TFormTree.LoadTree1Click(Sender: TObject);
  278. begin
  279. if not OpenDialog1.Execute then
  280. exit;
  281. GLTree1.LoadFromFile(OpenDialog1.FileName);
  282. AlignControlsToTree;
  283. end;
  284. procedure TFormTree.SaveTree1Click(Sender: TObject);
  285. begin
  286. if not SaveDialog1.Execute then
  287. exit;
  288. GLTree1.SaveToFile(SaveDialog1.FileName);
  289. end;
  290. procedure TFormTree.ExportMesh1Click(Sender: TObject);
  291. begin
  292. if not SaveDialog2.Execute then
  293. exit;
  294. GLTree1.BuildMesh(GLFreeForm1);
  295. GLFreeForm1.SaveToFile(SaveDialog2.FileName);
  296. end;
  297. procedure TFormTree.ExportMaterialLibrary1Click(Sender: TObject);
  298. begin
  299. if not SaveDialog3.Execute then
  300. exit;
  301. GLMaterialLibrary1.SaveToFile(SaveDialog3.FileName);
  302. end;
  303. procedure TFormTree.Exit1Click(Sender: TObject);
  304. begin
  305. FormTree.Close;
  306. end;
  307. procedure TFormTree.LeafFrontTexture1Click(Sender: TObject);
  308. begin
  309. if not OpenPictureDialog1.Execute then
  310. exit;
  311. with GLMaterialLibrary1.Materials.GetLibMaterialByName('LeafFront') do
  312. Material.Texture.Image.LoadFromFile(OpenPictureDialog1.FileName);
  313. GLTree1.StructureChanged;
  314. end;
  315. procedure TFormTree.LeafBackTexture1Click(Sender: TObject);
  316. begin
  317. if not OpenPictureDialog1.Execute then
  318. exit;
  319. with GLMaterialLibrary1.Materials.GetLibMaterialByName('LeafBack') do
  320. Material.Texture.Image.LoadFromFile(OpenPictureDialog1.FileName);
  321. GLTree1.StructureChanged;
  322. end;
  323. procedure TFormTree.BranchTexture1Click(Sender: TObject);
  324. begin
  325. if not OpenPictureDialog1.Execute then
  326. exit;
  327. with GLMaterialLibrary1.Materials.GetLibMaterialByName('Branch') do
  328. Material.Texture.Image.LoadFromFile(OpenPictureDialog1.FileName);
  329. GLTree1.StructureChanged;
  330. end;
  331. procedure TFormTree.AsyncTimer1Timer(Sender: TObject);
  332. begin
  333. miFPS.Caption := 'Tree Editor - ' + GLSceneViewer1.FramesPerSecondText;
  334. end;
  335. procedure TFormTree.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
  336. begin
  337. GLSceneViewer1.Invalidate;
  338. end;
  339. end.