Unit1.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <stdlib.h>
  4. #pragma hdrstop
  5. #include "Unit1.h"
  6. #include "tga.hpp"
  7. #include "jpeg.hpp"
  8. //---------------------------------------------------------------------------
  9. #pragma package(smart_init)
  10. #pragma link "GLMaterial"
  11. #pragma link "tga"
  12. #pragma resource "*.dfm"
  13. TForm1 *Form1;
  14. //---------------------------------------------------------------------------
  15. void TForm1::AlignControlsToTree()
  16. {
  17. TrackBar1->Position = GLTree1->Depth;
  18. TrackBar2->Position = Round(GLTree1->BranchTwist);
  19. TrackBar3->Position = Round(GLTree1->BranchAngle * 100);
  20. TrackBar4->Position = Round(GLTree1->BranchAngleBias * 100);
  21. TrackBar5->Position = Round(GLTree1->BranchSize * 10);
  22. TrackBar6->Position = Round(GLTree1->BranchRadius * 25);
  23. TrackBar7->Position = Round(GLTree1->BranchNoise * 100);
  24. TrackBar8->Position = Round(GLTree1->LeafSize * 100);
  25. TrackBar9->Position = Round(GLTree1->LeafThreshold * 100);
  26. TrackBar10->Position = GLTree1->BranchFacets;
  27. Edit1->Text = IntToStr(GLTree1->Seed);
  28. CheckBox1->Checked = GLTree1->CentralLeader;
  29. TrackBar11->Position = Round(GLTree1->CentralLeaderBias * 100);
  30. }
  31. void TForm1::NewTree()
  32. {
  33. delete GLTree1;
  34. GLTree1 = (TGLTree *) GLScene1->Objects->AddNewChild(__classid(TGLTree));
  35. GLTree1->MaterialLibrary = GLMaterialLibrary1;
  36. GLTree1->LeafMaterialName = "LeafFront";
  37. GLTree1->LeafBackMaterialName = "LeafBack";
  38. GLTree1->BranchMaterialName = "Branch";
  39. GLTree1->Depth = 8;
  40. GLTree1->LeafSize = 0.2;
  41. GLTree1->BranchRadius = 0.08;
  42. GLTree1->BranchNoise = 0.5;
  43. Randomize();
  44. GLTree1->Seed = Round((2 * Random() - 1) * (MaxInt - 1));
  45. AlignControlsToTree();
  46. }
  47. __fastcall TForm1::TForm1(TComponent * Owner):TForm(Owner)
  48. {
  49. SetGLSceneMediaDir();
  50. // Set up default textures
  51. TGLLibMaterial *lm =
  52. GLMaterialLibrary1->AddTextureMaterial("LeafFront", "maple_multi.tga", true);
  53. lm->Material->BlendingMode = bmAlphaTest50;
  54. lm->Material->Texture->TextureMode = tmModulate;
  55. lm->Material->Texture->TextureFormat = tfRGBA;
  56. lm = GLMaterialLibrary1->AddTextureMaterial("LeafBack", "maple_multi.tga", true);
  57. lm->Material->BlendingMode = bmAlphaTest50;
  58. lm->Material->Texture->TextureMode = tmModulate;
  59. lm->Material->Texture->TextureFormat = tfRGBA;
  60. lm = GLMaterialLibrary1->AddTextureMaterial("Branch", "zbark_016.jpg", true);
  61. lm->Material->Texture->TextureMode = tmModulate;
  62. // Set a up a tree
  63. NewTree();
  64. }
  65. //---------------------------------------------------------------------------
  66. void __fastcall TForm1::GLSceneViewer1MouseDown(TObject * Sender,
  67. TMouseButton Button,
  68. TShiftState Shift, int X, int Y)
  69. {
  70. mx = X;
  71. my = Y;
  72. }
  73. //---------------------------------------------------------------------------
  74. void __fastcall TForm1::GLSceneViewer1MouseMove(TObject * Sender,
  75. TShiftState Shift, int X, int Y)
  76. {
  77. if(Shift.Contains(ssLeft))
  78. GLCamera1->MoveAroundTarget(my - Y, mx - X);
  79. else if(Shift.Contains(ssRight))
  80. GLCamera1->AdjustDistanceToTarget(1 + (my - Y) * 0.01);
  81. mx = X;
  82. my = Y;
  83. }
  84. //---------------------------------------------------------------------------
  85. void __fastcall TForm1::TrackBar1Change(TObject * Sender)
  86. {
  87. GLTree1->Depth = (float) TrackBar1->Position;
  88. }
  89. //---------------------------------------------------------------------------
  90. void __fastcall TForm1::TrackBar2Change(TObject * Sender)
  91. {
  92. GLTree1->BranchTwist = (float)TrackBar2->Position;
  93. }
  94. //---------------------------------------------------------------------------
  95. void __fastcall TForm1::TrackBar3Change(TObject * Sender)
  96. {
  97. GLTree1->BranchAngle = (float)TrackBar3->Position / 100;
  98. }
  99. //---------------------------------------------------------------------------
  100. void __fastcall TForm1::TrackBar4Change(TObject * Sender)
  101. {
  102. GLTree1->BranchAngleBias = (float)TrackBar4->Position / 100;
  103. }
  104. //---------------------------------------------------------------------------
  105. void __fastcall TForm1::TrackBar5Change(TObject * Sender)
  106. {
  107. GLTree1->BranchSize = (float)TrackBar5->Position / 10;
  108. }
  109. //---------------------------------------------------------------------------
  110. void __fastcall TForm1::TrackBar6Change(TObject * Sender)
  111. {
  112. GLTree1->BranchRadius = (float)TrackBar6->Position / 25;
  113. }
  114. //---------------------------------------------------------------------------
  115. void __fastcall TForm1::TrackBar7Change(TObject * Sender)
  116. {
  117. GLTree1->BranchNoise = (float)TrackBar7->Position / 100;
  118. }
  119. //---------------------------------------------------------------------------
  120. void __fastcall TForm1::TrackBar8Change(TObject * Sender)
  121. {
  122. GLTree1->LeafSize = (float)TrackBar8->Position / 100;
  123. }
  124. //---------------------------------------------------------------------------
  125. void __fastcall TForm1::TrackBar9Change(TObject * Sender)
  126. {
  127. GLTree1->LeafThreshold = (float)TrackBar9->Position / 100;
  128. }
  129. //---------------------------------------------------------------------------
  130. void __fastcall TForm1::TrackBar10Change(TObject * Sender)
  131. {
  132. GLTree1->BranchFacets = (float)TrackBar10->Position;
  133. }
  134. //---------------------------------------------------------------------------
  135. void __fastcall TForm1::Button1Click(TObject * Sender)
  136. {
  137. try
  138. {
  139. GLTree1->Seed = StrToInt(Edit1->Text);
  140. }
  141. catch(Exception * E)
  142. {
  143. MessageDlg("Invalid input", mtWarning, TMsgDlgButtons() << mbOK, 0);
  144. Edit1->Text = IntToStr(GLTree1->Seed);
  145. }
  146. }
  147. //---------------------------------------------------------------------------
  148. void __fastcall TForm1::CheckBox1Click(TObject * Sender)
  149. {
  150. GLTree1->CentralLeader = CheckBox1->Checked;
  151. }
  152. //---------------------------------------------------------------------------
  153. void __fastcall TForm1::TrackBar11Change(TObject * Sender)
  154. {
  155. GLTree1->CentralLeaderBias = (float)TrackBar11->Position / 100;
  156. }
  157. //---------------------------------------------------------------------------
  158. void __fastcall TForm1::NewTree1Click(TObject * Sender)
  159. {
  160. NewTree();
  161. }
  162. //---------------------------------------------------------------------------
  163. void __fastcall TForm1::LoadTree1Click(TObject * Sender)
  164. {
  165. if(!OpenDialog1->Execute())
  166. return;
  167. GLTree1->LoadFromFile(OpenDialog1->FileName);
  168. AlignControlsToTree();
  169. }
  170. //---------------------------------------------------------------------------
  171. void __fastcall TForm1::SaveTree1Click(TObject * Sender)
  172. {
  173. if(!SaveDialog1->Execute())
  174. return;
  175. GLTree1->SaveToFile(SaveDialog1->FileName);
  176. }
  177. //---------------------------------------------------------------------------
  178. void __fastcall TForm1::ExportMesh1Click(TObject * Sender)
  179. {
  180. if(!SaveDialog2->Execute())
  181. return;
  182. GLTree1->BuildMesh(GLFreeForm1);
  183. GLFreeForm1->SaveToFile(SaveDialog2->FileName);
  184. }
  185. //---------------------------------------------------------------------------
  186. void __fastcall TForm1::ExportMaterialLibrary1Click(TObject * Sender)
  187. {
  188. if(!SaveDialog3->Execute())
  189. return;
  190. GLMaterialLibrary1->SaveToFile(SaveDialog3->FileName);
  191. }
  192. //---------------------------------------------------------------------------
  193. void __fastcall TForm1::Exit1Click(TObject * Sender)
  194. {
  195. Form1->Close();
  196. }
  197. //---------------------------------------------------------------------------
  198. void __fastcall TForm1::LeafFrontTexture1Click(TObject * Sender)
  199. {
  200. if(!OpenPictureDialog1->Execute())
  201. return;
  202. TGLLibMaterial *lm =
  203. GLMaterialLibrary1->Materials->GetLibMaterialByName("LeafFront");
  204. lm->Material->Texture->Image->LoadFromFile(OpenPictureDialog1->FileName);
  205. GLTree1->StructureChanged();
  206. }
  207. //---------------------------------------------------------------------------
  208. void __fastcall TForm1::LeafBackTexture1Click(TObject * Sender)
  209. {
  210. if(!OpenPictureDialog1->Execute())
  211. return;
  212. TGLLibMaterial *lm =
  213. GLMaterialLibrary1->Materials->GetLibMaterialByName("LeafBack");
  214. lm->Material->Texture->Image->LoadFromFile(OpenPictureDialog1->FileName);
  215. GLTree1->StructureChanged();
  216. }
  217. //---------------------------------------------------------------------------
  218. void __fastcall TForm1::BranchTexture1Click(TObject * Sender)
  219. {
  220. if(!OpenPictureDialog1->Execute())
  221. return;
  222. TGLLibMaterial *lm =
  223. GLMaterialLibrary1->Materials->GetLibMaterialByName("Branch");
  224. lm->Material->Texture->Image->LoadFromFile(OpenPictureDialog1->FileName);
  225. GLTree1->StructureChanged();
  226. }
  227. //---------------------------------------------------------------------------