| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- unit fShadertoyD;
- interface
- uses
- Winapi.Windows,
- Winapi.ShellAPI,
- System.SysUtils,
- System.Classes,
- Vcl.Controls,
- Vcl.Dialogs,
- Vcl.Forms,
- GLS.Scene,
- GLScene.VectorTypes,
- GLS.BaseClasses,
- GLS.Objects,
- GLS.Cadencer,
- GLS.SceneViewer,
- GLS.Keyboard,
- GLS.RenderContextInfo,
- GLS.OpenGLAdapter,
- GLS.TextureFormat
- GLScene.VectorGeometry,
- GLS.AsyncTimer,
- GLS.Context,
- GLS.Coordinates,
- GLS.HUDObjects,
- GLScene.Utils;
- type
- TFormEiffie = class(TForm)
- GLScene: TGLScene;
- SceneViewer: TGLSceneViewer;
- GLCadencer: TGLCadencer;
- Cam: TGLCamera;
- dcCamera: TGLDummyCube;
- Hud: TGLHUDSprite;
- GLAsyncTimer: TGLAsyncTimer;
- DoGL: TGLDirectOpenGL;
- procedure FormCreate(Sender: TObject);
- procedure doglRender(Sender: TObject; var rci: TGLRenderContextInfo);
- procedure FormResize(Sender: TObject);
- procedure GLAsyncTimerTimer(Sender: TObject);
- procedure GLCadencerProgress(Sender: TObject; const deltaTime, newTime: Double);
- procedure SceneViewerClick(Sender: TObject);
- private
- PathToAsset: TFileName;
- end;
- var
- FormEiffie: TFormEiffie;
- PrHnd: TGLProgramHandle;
- initDGL: boolean;
- implementation
- {$R *.dfm}
- //
- // FormCreate
- //
- procedure TFormEiffie.FormCreate;
- begin
- PathToAsset := GetCurrentAssetPath();
- SetCurrentDir(PathToAsset + '\shader');
- SceneViewer.Buffer.RenderingContext.Activate;
- end;
- //
- // CadencerProgress
- //
- procedure TFormEiffie.GLCadencerProgress;
- begin
- SceneViewer.Invalidate;
- end;
- //
- // DirectOpenGLRender
- //
- procedure TFormEiffie.doglRender;
- begin
- if not initDGL then
- begin
- (*
- if not(GL.ARB_shader_objects and GL.ARB_fragment_shader) then
- begin
- ShowMessage('Your videocard don''t support necessary shaders');
- Halt;
- end;
- *)
- PrHnd := TGLProgramHandle.CreateAndAllocate;
- PrHnd.AddShader(TGLFragmentShaderHandle,
- LoadAnsiStringFromFile('eiffie_too-early.fp'));
- if not PrHnd.LinkProgram then
- raise Exception.Create(PrHnd.InfoLog);
- if not PrHnd.ValidateProgram then
- raise Exception.Create(PrHnd.InfoLog);
- initDGL := True;
- end;
- if initDGL then
- begin
- PrHnd.UseProgramObject;
- PrHnd.Uniform3f['iResolution'] := AffineVectorMake(SceneViewer.Width, SceneViewer.Height, 0);
- PrHnd.Uniform1f['iGlobalTime'] := GLCadencer.CurrentTime;
- Hud.Render(rci);
- PrHnd.EndUseProgramObject;
- end;
- end;
- //
- // FormResize
- //
- procedure TFormEiffie.FormResize;
- begin
- Hud.Width := SceneViewer.Width;
- Hud.Height := SceneViewer.Height;
- Hud.Position.SetPoint(SceneViewer.Width div 2, SceneViewer.Height div 2, 0);
- end;
- //
- // AtTimer
- //
- procedure TFormEiffie.GLAsyncTimerTimer;
- begin
- FormEiffie.Caption :=
- Format('Eiffie from shadertoy.com / FPS: %.3f time: %.3f',
- [SceneViewer.FramesPerSecond, GLCadencer.CurrentTime]);
- SceneViewer.ResetPerformanceMonitor;
- end;
- //
- // Open URL
- //
- procedure TFormEiffie.SceneViewerClick;
- begin
- ShellExecute(Handle, 'open', 'https://www.shadertoy.com', nil,
- nil, SW_Normal);
- close;
- end;
- end.
|