fShadertoyD.pas 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. unit fShadertoyD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.ShellAPI,
  6. System.SysUtils,
  7. System.Classes,
  8. Vcl.Controls,
  9. Vcl.Dialogs,
  10. Vcl.Forms,
  11. GLS.Scene,
  12. GLScene.VectorTypes,
  13. GLS.BaseClasses,
  14. GLS.Objects,
  15. GLS.Cadencer,
  16. GLS.SceneViewer,
  17. GLS.Keyboard,
  18. GLS.RenderContextInfo,
  19. GLS.OpenGLAdapter,
  20. GLS.TextureFormat
  21. GLScene.VectorGeometry,
  22. GLS.AsyncTimer,
  23. GLS.Context,
  24. GLS.Coordinates,
  25. GLS.HUDObjects,
  26. GLScene.Utils;
  27. type
  28. TFormEiffie = class(TForm)
  29. GLScene: TGLScene;
  30. SceneViewer: TGLSceneViewer;
  31. GLCadencer: TGLCadencer;
  32. Cam: TGLCamera;
  33. dcCamera: TGLDummyCube;
  34. Hud: TGLHUDSprite;
  35. GLAsyncTimer: TGLAsyncTimer;
  36. DoGL: TGLDirectOpenGL;
  37. procedure FormCreate(Sender: TObject);
  38. procedure doglRender(Sender: TObject; var rci: TGLRenderContextInfo);
  39. procedure FormResize(Sender: TObject);
  40. procedure GLAsyncTimerTimer(Sender: TObject);
  41. procedure GLCadencerProgress(Sender: TObject; const deltaTime, newTime: Double);
  42. procedure SceneViewerClick(Sender: TObject);
  43. private
  44. PathToAsset: TFileName;
  45. end;
  46. var
  47. FormEiffie: TFormEiffie;
  48. PrHnd: TGLProgramHandle;
  49. initDGL: boolean;
  50. implementation
  51. {$R *.dfm}
  52. //
  53. // FormCreate
  54. //
  55. procedure TFormEiffie.FormCreate;
  56. begin
  57. PathToAsset := GetCurrentAssetPath();
  58. SetCurrentDir(PathToAsset + '\shader');
  59. SceneViewer.Buffer.RenderingContext.Activate;
  60. end;
  61. //
  62. // CadencerProgress
  63. //
  64. procedure TFormEiffie.GLCadencerProgress;
  65. begin
  66. SceneViewer.Invalidate;
  67. end;
  68. //
  69. // DirectOpenGLRender
  70. //
  71. procedure TFormEiffie.doglRender;
  72. begin
  73. if not initDGL then
  74. begin
  75. (*
  76. if not(GL.ARB_shader_objects and GL.ARB_fragment_shader) then
  77. begin
  78. ShowMessage('Your videocard don''t support necessary shaders');
  79. Halt;
  80. end;
  81. *)
  82. PrHnd := TGLProgramHandle.CreateAndAllocate;
  83. PrHnd.AddShader(TGLFragmentShaderHandle,
  84. LoadAnsiStringFromFile('eiffie_too-early.fp'));
  85. if not PrHnd.LinkProgram then
  86. raise Exception.Create(PrHnd.InfoLog);
  87. if not PrHnd.ValidateProgram then
  88. raise Exception.Create(PrHnd.InfoLog);
  89. initDGL := True;
  90. end;
  91. if initDGL then
  92. begin
  93. PrHnd.UseProgramObject;
  94. PrHnd.Uniform3f['iResolution'] := AffineVectorMake(SceneViewer.Width, SceneViewer.Height, 0);
  95. PrHnd.Uniform1f['iGlobalTime'] := GLCadencer.CurrentTime;
  96. Hud.Render(rci);
  97. PrHnd.EndUseProgramObject;
  98. end;
  99. end;
  100. //
  101. // FormResize
  102. //
  103. procedure TFormEiffie.FormResize;
  104. begin
  105. Hud.Width := SceneViewer.Width;
  106. Hud.Height := SceneViewer.Height;
  107. Hud.Position.SetPoint(SceneViewer.Width div 2, SceneViewer.Height div 2, 0);
  108. end;
  109. //
  110. // AtTimer
  111. //
  112. procedure TFormEiffie.GLAsyncTimerTimer;
  113. begin
  114. FormEiffie.Caption :=
  115. Format('Eiffie from shadertoy.com / FPS: %.3f time: %.3f',
  116. [SceneViewer.FramesPerSecond, GLCadencer.CurrentTime]);
  117. SceneViewer.ResetPerformanceMonitor;
  118. end;
  119. //
  120. // Open URL
  121. //
  122. procedure TFormEiffie.SceneViewerClick;
  123. begin
  124. ShellExecute(Handle, 'open', 'https://www.shadertoy.com', nil,
  125. nil, SW_Normal);
  126. close;
  127. end;
  128. end.