fWhirlD.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. unit fWhirlD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.Messages,
  6. Winapi.OpenGL,
  7. System.SysUtils,
  8. System.Math,
  9. System.Variants,
  10. System.Classes,
  11. Vcl.Graphics,
  12. Vcl.Controls,
  13. Vcl.Forms,
  14. Vcl.Dialogs,
  15. Vcl.ExtCtrls,
  16. GLS.BaseClasses,
  17. GLS.Scene,
  18. GLS.PersistentClasses,
  19. Stage.VectorGeometry,
  20. GLS.SceneViewer,
  21. GLS.Particles,
  22. GLS.Cadencer,
  23. GLS.Objects,
  24. GLS.Coordinates,
  25. GLS.Behaviours;
  26. type
  27. TFormWhirl = class(TForm)
  28. GLSceneViewer1: TGLSceneViewer;
  29. Panel1: TPanel;
  30. Timer1: TTimer;
  31. GLCadencer1: TGLCadencer;
  32. GLScene1: TGLScene;
  33. GLParticles1: TGLParticles;
  34. DummyCube1: TGLDummyCube;
  35. Sprite1: TGLSprite;
  36. GLCamera1: TGLCamera;
  37. procedure Timer1Timer(Sender: TObject);
  38. procedure GLDummyCube1Progress(Sender: TObject;
  39. const deltaTime, newTime: Double);
  40. procedure GLParticles1ActivateParticle(Sender: TObject;
  41. Particle: TGLBaseSceneObject);
  42. procedure GLCadencer1Progress(Sender: TObject;
  43. const deltaTime, newTime: Double);
  44. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  45. X, Y: Integer);
  46. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  47. Shift: TShiftState; X, Y: Integer);
  48. private
  49. mx, my: Integer;
  50. public
  51. end;
  52. var
  53. FormWhirl: TFormWhirl;
  54. //----------------------------------------------------------------------
  55. implementation
  56. //----------------------------------------------------------------------
  57. {$R *.dfm}
  58. procedure TFormWhirl.GLParticles1ActivateParticle(Sender: TObject;
  59. Particle: TGLBaseSceneObject);
  60. var
  61. r, alpha, cr, sr: Single;
  62. begin
  63. alpha := Random * 2 * PI;
  64. r := 2 * Random;
  65. SinCosine(alpha, r * r, sr, cr);
  66. Particle.Children[0].Position.SetPoint(sr, 3 * r - 3, cr);
  67. GetOrCreateInertia(Particle).TurnSpeed := Random(30);
  68. TGLCustomSceneObject(Particle).TagFloat := GLCadencer1.CurrentTime;
  69. end;
  70. //----------------------------------------------------------------------
  71. procedure TFormWhirl.GLSceneViewer1MouseDown(Sender: TObject;
  72. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  73. begin
  74. mx := X;
  75. my := Y;
  76. end;
  77. //----------------------------------------------------------------------
  78. procedure TFormWhirl.GLSceneViewer1MouseMove(Sender: TObject;
  79. Shift: TShiftState; X, Y: Integer);
  80. begin
  81. if Shift <> [] then
  82. begin
  83. GLCamera1.MoveAroundTarget(my - Y, mx - X);
  84. mx := X;
  85. my := Y;
  86. end;
  87. end;
  88. //----------------------------------------------------------------------
  89. procedure TFormWhirl.GLDummyCube1Progress(Sender: TObject;
  90. const deltaTime, newTime: Double);
  91. begin
  92. with TGLCustomSceneObject(Sender) do
  93. begin
  94. if newTime - TagFloat > 3 then
  95. GLParticles1.KillParticle(TGLCustomSceneObject(Sender));
  96. end;
  97. end;
  98. //----------------------------------------------------------------------
  99. procedure TFormWhirl.Timer1Timer(Sender: TObject);
  100. begin
  101. Panel1.Caption := Format('%d particles, %.1f FPS',
  102. [GLParticles1.Count, GLSceneViewer1.FramesPerSecond]);
  103. GLSceneViewer1.ResetPerformanceMonitor;
  104. end;
  105. //----------------------------------------------------------------------
  106. procedure TFormWhirl.GLCadencer1Progress(Sender: TObject;
  107. const deltaTime, newTime: Double);
  108. begin
  109. GLParticles1.CreateParticle;
  110. end;
  111. end.