1179a6785b632e080434a733bdc0ba23636e4538
[LazOpenGLCore.git] / examples / simple / uMainForm.pas
1 unit uMainForm;
2
3 {$mode objfpc}{$H+}
4
5 interface
6
7 uses
8   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
9   uglcContext, uglcShader, uglcArrayBuffer, uglcTypes;
10
11 type
12   TMainForm = class(TForm)
13     ApplicationProperties: TApplicationProperties;
14     LogLB: TListBox;
15     RenderPanel: TPanel;
16     procedure ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean);
17     procedure FormCreate(Sender: TObject);
18     procedure FormDestroy(Sender: TObject);
19     procedure RenderPanelResize(Sender: TObject);
20   private
21     fContext: TglcContext;
22     fShader: TglcShaderProgram;
23     fVBO: TglcArrayBuffer;
24     procedure Log(aSender: TObject; const aMsg: String);
25     procedure Render;
26   public
27     { public declarations }
28   end;
29
30 var
31   MainForm: TMainForm;
32
33 implementation
34
35 {$R *.lfm}
36
37 uses
38   dglOpenGL, ugluVector;
39
40 const
41   SHADER_FILE  = 'shader.glsl';
42
43   LAYOUT_LOCATION_POS = 0;
44
45 procedure TMainForm.FormCreate(Sender: TObject);
46 type
47   TVertex = packed record
48     pos: TgluVector3f;
49   end;
50   PVertex = ^TVertex;
51 var
52   pf: TglcContextPixelFormatSettings;
53   p: PVertex;
54 begin
55   pf := TglcContext.MakePF();
56   fContext := TglcContext.GetPlatformClass.Create(RenderPanel, pf);
57   fContext.BuildContext;
58
59   fShader := TglcShaderProgram.Create(@Log);
60   fShader.LoadFromFile(ExtractFilePath(Application.ExeName) + SHADER_FILE);
61   fShader.Compile;
62
63   fVBO := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
64   fVBO.BufferData(4, sizeof(TVertex), TglcBufferUsage.buStaticDraw, nil);
65   p := fVBO.MapBuffer(TglcBufferAccess.baWriteOnly);
66   try
67     p^.pos := gluVector3f(-0.5, -0.5, 0); inc(p);
68     p^.pos := gluVector3f( 0.5, -0.5, 0); inc(p);
69     p^.pos := gluVector3f( 0.5,  0.5, 0); inc(p);
70     p^.pos := gluVector3f(-0.5,  0.5, 0); inc(p);
71   finally
72     fVBO.UnmapBuffer;
73   end;
74 end;
75
76 procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean);
77 begin
78   Render;
79   Done := false;
80 end;
81
82 procedure TMainForm.FormDestroy(Sender: TObject);
83 begin
84   FreeAndNil(fVBO);
85   FreeAndNil(fShader);
86   FreeAndNil(fContext);
87 end;
88
89 procedure TMainForm.RenderPanelResize(Sender: TObject);
90 begin
91   if Assigned(fContext) then begin
92     glViewport(0, 0, RenderPanel.ClientWidth, RenderPanel.ClientHeight);
93   end;
94 end;
95
96 procedure TMainForm.Log(aSender: TObject; const aMsg: String);
97 begin
98   LogLB.Items.Add(aMsg);
99 end;
100
101 procedure TMainForm.Render;
102 begin
103   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
104
105   fVBO.Bind;
106   fShader.Enable;
107
108   glEnableVertexAttribArray(LAYOUT_LOCATION_POS);
109   glVertexAttribPointer(LAYOUT_LOCATION_POS, 3, GL_FLOAT, False, 0, nil);
110
111   glDrawArrays(GL_QUADS, 0, fVBO.DataCount);
112
113   glDisableVertexAttribArray(LAYOUT_LOCATION_POS);
114
115   fShader.Disable;
116   fVBO.Unbind;
117
118   fContext.SwapBuffers;
119 end;
120
121 end.
122