fMandelbrotD.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. unit fMandelbrotD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.Messages,
  6. Winapi.OpenGL,
  7. Winapi.OpenGLext,
  8. System.SysUtils,
  9. System.Variants,
  10. System.Classes,
  11. Vcl.Graphics,
  12. Vcl.Controls,
  13. Vcl.Forms,
  14. Vcl.Dialogs,
  15. Vcl.ExtCtrls,
  16. Vcl.StdCtrls,
  17. Vcl.Imaging.Jpeg,
  18. GLS.SceneViewer,
  19. GLS.Texture,
  20. GLS.Cadencer,
  21. GLS.Scene,
  22. GLS.Context,
  23. GLS.Keyboard,
  24. GLScene.Utils,
  25. GLS.FileTGA,
  26. GLS.HUDObjects,
  27. GLS.BitmapFont,
  28. GLS.WindowsFont,
  29. GLS.Material,
  30. GLS.Coordinates,
  31. GLS.RenderContextInfo,
  32. GLS.BaseClasses,
  33. GLSL.CustomShader,
  34. GLSL.Shader;
  35. type
  36. TForm1 = class(TForm)
  37. Scene: TGLScene;
  38. Timer1: TTimer;
  39. Viewer: TGLSceneViewer;
  40. GLCadencer: TGLCadencer;
  41. Mandelbrot: TGLDirectOpenGL;
  42. GLMatLib: TGLMaterialLibrary;
  43. GLCamera: TGLCamera;
  44. OpenDialog1: TOpenDialog;
  45. GLHUDText: TGLHUDText;
  46. GLWindowsBitmapFont: TGLWindowsBitmapFont;
  47. procedure FormCreate(Sender: TObject);
  48. procedure Timer1Timer(Sender: TObject);
  49. procedure GLCadencerProgress(Sender: TObject;
  50. const deltaTime, newTime: Double);
  51. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  52. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  53. procedure MandelbrotRender(Sender: TObject; var rci: TGLRenderContextInfo);
  54. public
  55. PathToAsset: TFileName;
  56. MandelbrotProgram: TGLProgramHandle;
  57. end;
  58. const
  59. HELP_TEXT = '+: Zoom in'#13#10 + '-: Zoom out'#13#10 +
  60. 'Arrow keys: Move around'#13#10 + 'F3: Load colormap';
  61. var
  62. Form1: TForm1;
  63. PositionX, PositionY, Scale: Single;
  64. implementation
  65. {$R *.dfm}
  66. procedure TForm1.FormCreate(Sender: TObject);
  67. begin
  68. // SetCurrentDir(ExtractFilePath(ParamStr(0)));
  69. PathToAsset := GetCurrentAssetPath();
  70. SetCurrentDir(PathToAsset + '\texture');
  71. GLMatLib.TexturePaths := PathToAsset;
  72. GLMatLib.Materials[0].Material.Texture.Image.LoadFromFile('hot_metal.bmp');
  73. PositionX := -0.5;
  74. PositionY := 0.0;
  75. Scale := 1.0;
  76. GLHUDText.Text := HELP_TEXT;
  77. end;
  78. procedure TForm1.Timer1Timer(Sender: TObject);
  79. begin
  80. Caption := Format('Mandelbrot %.1f FPS', [Viewer.FramesPerSecond]);
  81. Viewer.ResetPerformanceMonitor;
  82. end;
  83. procedure TForm1.GLCadencerProgress(Sender: TObject;
  84. const deltaTime, newTime: Double);
  85. var
  86. deltax, deltay: Single;
  87. pt: TPoint;
  88. begin
  89. if IsKeyDown(VK_F3) then
  90. if OpenDialog1.Execute then
  91. GLMatLib.Materials[0].Material.Texture.Image.LoadFromFile
  92. (OpenDialog1.FileName);
  93. if IsKeyDown('+') or IsKeyDown(VK_ADD) then
  94. Scale := Scale * 1.0 / (1.0 + deltaTime * 0.5);
  95. if IsKeyDown('-') or IsKeyDown(VK_SUBTRACT) then
  96. Scale := Scale * (1.0 + deltaTime * 0.5);
  97. if IsKeyDown(VK_DOWN) or IsKeyDown(VK_NUMPAD8) then
  98. PositionY := PositionY + deltaTime * Scale * 0.5;
  99. if IsKeyDown(VK_UP) or IsKeyDown(VK_NUMPAD2) then
  100. PositionY := PositionY - deltaTime * Scale * 0.5;
  101. if IsKeyDown(VK_LEFT) or IsKeyDown(VK_NUMPAD6) then
  102. PositionX := PositionX + deltaTime * Scale * 0.5;
  103. if IsKeyDown(VK_RIGHT) or IsKeyDown(VK_NUMPAD4) then
  104. PositionX := PositionX - deltaTime * Scale * 0.5;
  105. Viewer.Invalidate;
  106. end;
  107. procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  108. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  109. var
  110. DistDelta: Single;
  111. begin
  112. end;
  113. procedure TForm1.MandelbrotRender(Sender: TObject;
  114. var rci: TGLRenderContextInfo);
  115. begin
  116. // shader init
  117. if not Assigned(MandelbrotProgram) then
  118. begin
  119. SetCurrentDir(PathToAsset + '\shader');
  120. MandelbrotProgram := TGLProgramHandle.CreateAndAllocate;
  121. MandelbrotProgram.AddShader(TGLFragmentShaderHandle,
  122. String(LoadAnsiStringFromFile('Mandelbrot.frag')), True);
  123. MandelbrotProgram.AddShader(TGLVertexShaderHandle,
  124. String(LoadAnsiStringFromFile('Mandelbrot.vert')), True);
  125. if not MandelbrotProgram.LinkProgram then
  126. raise Exception.Create(MandelbrotProgram.InfoLog);
  127. if not MandelbrotProgram.ValidateProgram then
  128. raise Exception.Create(MandelbrotProgram.InfoLog);
  129. end;
  130. glPushAttrib(GL_ALL_ATTRIB_BITS);
  131. glMatrixMode(GL_MODELVIEW);
  132. glPushMatrix;
  133. glLoadIdentity;
  134. glMatrixMode(GL_PROJECTION);
  135. glPushMatrix;
  136. glLoadIdentity;
  137. MandelbrotProgram.UseProgramObject;
  138. MandelbrotProgram.Uniform1f['positionX'] := PositionX;
  139. MandelbrotProgram.Uniform1f['positionY'] := PositionY;
  140. MandelbrotProgram.Uniform1f['scale'] := Scale;
  141. glEnable(GL_TEXTURE_2D);
  142. glBindTexture(GL_TEXTURE_2D, GLMatLib.Materials[0].Material.Texture.Handle);
  143. MandelbrotProgram.Uniform1i['colorMap'] := 0;
  144. // drawing rectangle over screen
  145. glDisable(GL_DEPTH_TEST);
  146. glDisable(GL_LIGHTING);
  147. glBegin(GL_QUADS);
  148. glTexCoord2f(0.0, 0.0);
  149. glVertex2f(-1.0, -1.0);
  150. glTexCoord2f(1.0, 0.0);
  151. glVertex2f(1.0, -1.0);
  152. glTexCoord2f(1.0, 1.0);
  153. glVertex2f(1.0, 1.0);
  154. glTexCoord2f(0.0, 1.0);
  155. glVertex2f(-1.0, 1.0);
  156. glEnd;
  157. MandelbrotProgram.EndUseProgramObject;
  158. glPopMatrix;
  159. glMatrixMode(GL_MODELVIEW);
  160. glPopMatrix;
  161. glPopAttrib;
  162. /// -CheckOpenGLError;
  163. end;
  164. end.