fFountainD.pas 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. unit fFountainD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.Messages,
  6. System.SysUtils,
  7. System.Variants,
  8. System.Classes,
  9. System.Math,
  10. Vcl.Graphics,
  11. Vcl.Controls,
  12. Vcl.Forms,
  13. Vcl.Dialogs,
  14. Vcl.StdCtrls,
  15. Vcl.Imaging.Jpeg,
  16. Vcl.ExtCtrls,
  17. Vcl.Menus,
  18. Vcl.ExtDlgs,
  19. Vcl.ComCtrls,
  20. Stage.VectorTypes,
  21. GLS.Texture,
  22. GLS.Cadencer,
  23. GLS.SceneViewer,
  24. GLS.Scene,
  25. GLS.Objects,
  26. Stage.VectorGeometry,
  27. GLS.GeomObjects,
  28. GLS.Coordinates,
  29. GLS.BaseClasses,
  30. uFountainD, GLS.Material;
  31. type
  32. TForm1 = class( TForm )
  33. GLScene1: TGLScene;
  34. GLSceneViewer1: TGLSceneViewer;
  35. GLCadencer1: TGLCadencer;
  36. Cam: TGLCamera;
  37. Scene: TGLDummyCube;
  38. Light: TGLLightSource;
  39. Timer1: TTimer;
  40. Panel1: TPanel;
  41. ColorDialog1: TColorDialog;
  42. Panel2: TPanel;
  43. Label1: TLabel;
  44. PStartColor: TPanel;
  45. Label2: TLabel;
  46. PEndColor: TPanel;
  47. PBackColor: TPanel;
  48. Label3: TLabel;
  49. MainMenu1: TMainMenu;
  50. File1: TMenuItem;
  51. PageControl1: TPageControl;
  52. TabSheet1: TTabSheet;
  53. EdPSizeMax: TEdit;
  54. Label14: TLabel;
  55. EdPSizeMin: TEdit;
  56. Label13: TLabel;
  57. EdTimesFact: TEdit;
  58. Label12: TLabel;
  59. EdLifeFact: TEdit;
  60. Label11: TLabel;
  61. EdAngleStart: TEdit;
  62. Label10: TLabel;
  63. EdVelMax: TEdit;
  64. Label9: TLabel;
  65. EdVelMin: TEdit;
  66. Label8: TLabel;
  67. EdMaxP: TEdit;
  68. Label7: TLabel;
  69. EdFloor: TEdit;
  70. Label6: TLabel;
  71. EdBound: TEdit;
  72. EdMass: TEdit;
  73. Label5: TLabel;
  74. Label4: TLabel;
  75. CheckActived: TCheckBox;
  76. CheckBound: TCheckBox;
  77. Close1: TMenuItem;
  78. TabSheet2: TTabSheet;
  79. Panel3: TPanel;
  80. RadioButton1: TRadioButton;
  81. RadioButton2: TRadioButton;
  82. RadioButton3: TRadioButton;
  83. GLPlane1: TGLPlane;
  84. GLTorus1: TGLTorus;
  85. TrackBar1: TTrackBar;
  86. Label15: TLabel;
  87. OpenPictureDialog1: TOpenPictureDialog;
  88. Texture1: TMenuItem;
  89. StatusBar1: TStatusBar;
  90. GLMatlibColors: TGLMaterialLibrary;
  91. procedure FormCreate( Sender: TObject );
  92. procedure GLCadencer1Progress( Sender: TObject; const deltaTime, newTime: Double );
  93. procedure GLSceneViewer1MouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
  94. procedure GLSceneViewer1MouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer );
  95. procedure Timer1Timer( Sender: TObject );
  96. procedure FormMouseWheel( Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean );
  97. procedure PStartColorClick(Sender: TObject);
  98. procedure PEndColorClick(Sender: TObject);
  99. procedure CheckActivedClick(Sender: TObject);
  100. procedure PBackColorClick(Sender: TObject);
  101. procedure CheckBoundClick(Sender: TObject);
  102. procedure EdMassChange(Sender: TObject);
  103. procedure EdBoundChange(Sender: TObject);
  104. procedure EdFloorChange(Sender: TObject);
  105. procedure EdMaxPChange(Sender: TObject);
  106. procedure EdVelMinChange(Sender: TObject);
  107. procedure EdVelMaxChange(Sender: TObject);
  108. procedure EdAngleStartChange(Sender: TObject);
  109. procedure EdLifeFactChange(Sender: TObject);
  110. procedure EdTimesFactChange(Sender: TObject);
  111. procedure EdPSizeMinChange(Sender: TObject);
  112. procedure EdPSizeMaxChange(Sender: TObject);
  113. procedure Close1Click(Sender: TObject);
  114. procedure RadioButtonClick(Sender: TObject);
  115. procedure TrackBar1Change(Sender: TObject);
  116. procedure Texture1Click(Sender: TObject);
  117. private
  118. my, mx : integer;
  119. path : string;
  120. public
  121. end;
  122. var
  123. GLFountainDummy : TGLFountainDummy;
  124. var
  125. Form1: TForm1;
  126. implementation
  127. {$R *.dfm}
  128. procedure TForm1.FormCreate( Sender: TObject );
  129. begin
  130. SetCurrentDir( ExtractFilePath( ParamStr(0) ) );
  131. path := ExtractFilePath( ParamStr(0) );
  132. OpenPictureDialog1.InitialDir := path + 'Textures\';
  133. // GLPlane1.Material.Texture.Disabled := False;
  134. GLFountainDummy := TGLFountainDummy(Scene.AddNewChild(TGLFountainDummy));
  135. with GLFountainDummy do
  136. begin
  137. Material.Texture.Image.LoadFromFile( path + 'Textures\Par1.bmp' );
  138. Scale.X := 0.15; Scale.Y := 0.15; Scale.Z := 0.15;
  139. Direction.X := 0; Direction.Y := 1; Direction.Z := 0;
  140. Up.X := 0; Up.Y := 0; Up.Z := 1;
  141. Position.Z := -3;
  142. Actived := True;
  143. Bounding := False;
  144. ParticleMass := 5.0;
  145. BoundingFactor := 100.0;
  146. Floor := 0.0;
  147. MaxParticles := 60;
  148. VelocityMin := 5;
  149. VelocityMax := 15;
  150. AngleInit := 360;
  151. LifeFactor := 0.025;
  152. TimesFactor := 0.00005;
  153. ParticlesSizeMin := 110;
  154. ParticlesSizeMax := 130;
  155. ColorStart := PStartColor.Color;
  156. ColorEnd := PEndColor.Color;
  157. end;
  158. TrackBar1.OnChange( self );
  159. PStartColor.Color := clRed;
  160. end;
  161. procedure TForm1.GLCadencer1Progress( Sender: TObject; const deltaTime, newTime: Double );
  162. begin
  163. GLSceneViewer1.Invalidate;
  164. end;
  165. procedure TForm1.GLSceneViewer1MouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
  166. begin
  167. my := y;
  168. mx := x;
  169. end;
  170. procedure TForm1.GLSceneViewer1MouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer );
  171. begin
  172. if ssright in shift then
  173. Cam.MoveAroundTarget( my-y, mx-x );
  174. my := y;
  175. mx := x;
  176. end;
  177. procedure TForm1.Timer1Timer( Sender: TObject );
  178. begin
  179. Caption:=Format('%.2f FPS Fountain Particles', [GLSceneViewer1.FramesPerSecond]);
  180. GLSceneViewer1.ResetPerformanceMonitor;
  181. end;
  182. procedure TForm1.FormMouseWheel( Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean );
  183. begin
  184. Cam.AdjustDistanceToTarget( Power( 1.1, WheelDelta / 120 ) );
  185. end;
  186. procedure TForm1.PStartColorClick(Sender: TObject);
  187. begin
  188. if ColorDialog1.Execute then
  189. begin
  190. GLFountainDummy.ColorStart := ColorDialog1.Color;
  191. PStartColor.Color := ColorDialog1.Color;
  192. end;
  193. end;
  194. procedure TForm1.PEndColorClick(Sender: TObject);
  195. begin
  196. if ColorDialog1.Execute then
  197. begin
  198. PEndColor.Color := ColorDialog1.Color;
  199. GLFountainDummy.ColorEnd := ColorDialog1.Color;
  200. end;
  201. end;
  202. procedure TForm1.PBackColorClick(Sender: TObject);
  203. begin
  204. if ColorDialog1.Execute then
  205. begin
  206. PBackColor.Color := ColorDialog1.Color;
  207. GLSceneViewer1.Buffer.BackgroundColor := ColorDialog1.Color;
  208. end;
  209. end;
  210. //------------------------------------------------
  211. // Activate
  212. //------------------------------------------------
  213. procedure TForm1.CheckActivedClick(Sender: TObject);
  214. begin
  215. if CheckActived.Checked then
  216. GLFountainDummy.Actived := True else
  217. GLFountainDummy.Actived := False;
  218. end;
  219. procedure TForm1.CheckBoundClick(Sender: TObject);
  220. begin
  221. if CheckBound.Checked then
  222. GLFountainDummy.Bounding := True else
  223. GLFountainDummy.Bounding := False;
  224. end;
  225. procedure TForm1.EdMassChange(Sender: TObject);
  226. begin
  227. GLFountainDummy.ParticleMass := StrToFloat( EdMass.Text );
  228. end;
  229. procedure TForm1.EdBoundChange(Sender: TObject);
  230. begin
  231. GLFountainDummy.BoundingFactor := StrToFloat( EdBound.Text );
  232. end;
  233. procedure TForm1.EdFloorChange(Sender: TObject);
  234. begin
  235. GLFountainDummy.Floor := StrToFloat( EdFloor.Text );
  236. end;
  237. procedure TForm1.EdMaxPChange(Sender: TObject);
  238. begin
  239. GLFountainDummy.MaxParticles := StrToInt( EdMaxP.Text );
  240. end;
  241. procedure TForm1.EdVelMinChange(Sender: TObject);
  242. begin
  243. GLFountainDummy.VelocityMin := StrToInt( EdVelMin.Text );
  244. end;
  245. procedure TForm1.EdVelMaxChange(Sender: TObject);
  246. begin
  247. GLFountainDummy.VelocityMax := StrToInt( EdVelMax.Text );
  248. end;
  249. procedure TForm1.EdAngleStartChange(Sender: TObject);
  250. begin
  251. GLFountainDummy.AngleInit := StrToInt( EdAngleStart.Text );
  252. end;
  253. procedure TForm1.EdLifeFactChange(Sender: TObject);
  254. begin
  255. GLFountainDummy.LifeFactor := StrToFloat( EdLifeFact.Text );
  256. end;
  257. procedure TForm1.EdTimesFactChange(Sender: TObject);
  258. begin
  259. GLFountainDummy.TimesFactor := StrToFloat( EdTimesFact.Text );
  260. end;
  261. procedure TForm1.EdPSizeMinChange(Sender: TObject);
  262. begin
  263. GLFountainDummy.ParticlesSizeMin := StrToInt( EdPSizeMin.Text );
  264. end;
  265. procedure TForm1.EdPSizeMaxChange(Sender: TObject);
  266. begin
  267. GLFountainDummy.ParticlesSizeMax := StrToInt( EdPSizeMax.Text );
  268. end;
  269. procedure TForm1.TrackBar1Change(Sender: TObject);
  270. begin
  271. with GLFountainDummy do
  272. begin
  273. Scale.X := TrackBar1.Position / 10;
  274. Scale.Y := TrackBar1.Position / 10;
  275. Scale.Z := TrackBar1.Position / 10;
  276. end;
  277. end;
  278. procedure TForm1.Texture1Click(Sender: TObject);
  279. begin
  280. if OpenPictureDialog1.Execute then
  281. begin
  282. if ( OpenPictureDialog1.FileName <> '' ) then
  283. begin
  284. GLFountainDummy.Material.Texture.Image.LoadFromFile( OpenPictureDialog1.FileName );
  285. end;
  286. end;
  287. SetCurrentDir( ExtractFilePath( ParamStr(0) ) );
  288. end;
  289. //---------------------------------------------------
  290. // Particle Styles
  291. //---------------------------------------------------
  292. procedure TForm1.RadioButtonClick(Sender: TObject);
  293. var
  294. val: integer;
  295. begin
  296. val := 0;
  297. if RadioButton1.Checked then
  298. val := 0 else
  299. if RadioButton2.Checked then
  300. val := 1 else
  301. if RadioButton3.Checked then
  302. val := 2;
  303. case val of
  304. 0: begin
  305. with GLFountainDummy do
  306. begin
  307. Material.Texture.Image.LoadFromFile( path + 'Textures\Par1.bmp' );
  308. Position.Z := -3;
  309. Actived := True;
  310. Bounding := False;
  311. ParticleMass := 5.0;
  312. BoundingFactor := 100.0;
  313. Floor := 0.0;
  314. MaxParticles := 60;
  315. VelocityMin := 5;
  316. VelocityMax := 15;
  317. AngleInit := 360;
  318. LifeFactor := 0.025;
  319. TimesFactor := 0.00005;
  320. ParticlesSizeMin := 110;
  321. ParticlesSizeMax := 130;
  322. PStartColor.Color := $0000FF;
  323. ColorStart := PStartColor.Color;
  324. PEndColor.Color := $00FFFF;
  325. ColorEnd := PEndColor.Color;
  326. end;
  327. end;
  328. 1: begin
  329. with GLFountainDummy do
  330. begin
  331. Material.Texture.Image.LoadFromFile( path + 'Textures\Par2.bmp' );
  332. Position.Z := -3;
  333. Actived := True;
  334. Bounding := False;
  335. ParticleMass := 1.0;
  336. BoundingFactor := 100.0;
  337. Floor := 0.0;
  338. MaxParticles := 500;
  339. VelocityMin := 20;
  340. VelocityMax := 20;
  341. AngleInit := 360;
  342. LifeFactor := 0.003;
  343. TimesFactor := 0.009;
  344. ParticlesSizeMin := 30;
  345. ParticlesSizeMax := 40;
  346. PStartColor.Color := $FFFFFF;
  347. ColorStart := PStartColor.Color;
  348. PEndColor.Color := clFuchsia;
  349. ColorEnd := PEndColor.Color;
  350. end;
  351. end;
  352. 2: begin
  353. with GLFountainDummy do
  354. begin
  355. Material.Texture.Image.LoadFromFile( path + 'Textures\Par3.bmp' );
  356. Position.Z := -3;
  357. Actived := True;
  358. Bounding := True;
  359. ParticleMass := 10.0;
  360. BoundingFactor := 75.0;
  361. Floor := 0.0;
  362. MaxParticles := 500;
  363. VelocityMin := 19;
  364. VelocityMax := 20;
  365. AngleInit := 360;
  366. LifeFactor := 0.005;
  367. TimesFactor := 0.005;
  368. ParticlesSizeMin := 10;
  369. ParticlesSizeMax := 20;
  370. PStartColor.Color := $00FF00;
  371. ColorStart := PStartColor.Color;
  372. PEndColor.Color := $00FF00;
  373. ColorEnd := PEndColor.Color;
  374. end;
  375. end;
  376. end;
  377. end;
  378. procedure TForm1.Close1Click(Sender: TObject);
  379. begin
  380. Close;
  381. end;
  382. end.