X-Git-Url: https://git.delphigl.com/?p=LazOpenGLCore.git;a=blobdiff_plain;f=examples%2Fsimple%2FuMainForm.pas;fp=examples%2Fsimple%2FuMainForm.pas;h=1179a6785b632e080434a733bdc0ba23636e4538;hp=0000000000000000000000000000000000000000;hb=f6ca47eeb2c217505d9c1babe79d46b6668d3881;hpb=dfa7064d827360dd9a3ce0467fadb3f1c32a36c1 diff --git a/examples/simple/uMainForm.pas b/examples/simple/uMainForm.pas new file mode 100644 index 0000000..1179a67 --- /dev/null +++ b/examples/simple/uMainForm.pas @@ -0,0 +1,122 @@ +unit uMainForm; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, + uglcContext, uglcShader, uglcArrayBuffer, uglcTypes; + +type + TMainForm = class(TForm) + ApplicationProperties: TApplicationProperties; + LogLB: TListBox; + RenderPanel: TPanel; + procedure ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure RenderPanelResize(Sender: TObject); + private + fContext: TglcContext; + fShader: TglcShaderProgram; + fVBO: TglcArrayBuffer; + procedure Log(aSender: TObject; const aMsg: String); + procedure Render; + public + { public declarations } + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.lfm} + +uses + dglOpenGL, ugluVector; + +const + SHADER_FILE = 'shader.glsl'; + + LAYOUT_LOCATION_POS = 0; + +procedure TMainForm.FormCreate(Sender: TObject); +type + TVertex = packed record + pos: TgluVector3f; + end; + PVertex = ^TVertex; +var + pf: TglcContextPixelFormatSettings; + p: PVertex; +begin + pf := TglcContext.MakePF(); + fContext := TglcContext.GetPlatformClass.Create(RenderPanel, pf); + fContext.BuildContext; + + fShader := TglcShaderProgram.Create(@Log); + fShader.LoadFromFile(ExtractFilePath(Application.ExeName) + SHADER_FILE); + fShader.Compile; + + fVBO := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer); + fVBO.BufferData(4, sizeof(TVertex), TglcBufferUsage.buStaticDraw, nil); + p := fVBO.MapBuffer(TglcBufferAccess.baWriteOnly); + try + p^.pos := gluVector3f(-0.5, -0.5, 0); inc(p); + p^.pos := gluVector3f( 0.5, -0.5, 0); inc(p); + p^.pos := gluVector3f( 0.5, 0.5, 0); inc(p); + p^.pos := gluVector3f(-0.5, 0.5, 0); inc(p); + finally + fVBO.UnmapBuffer; + end; +end; + +procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); +begin + Render; + Done := false; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + FreeAndNil(fVBO); + FreeAndNil(fShader); + FreeAndNil(fContext); +end; + +procedure TMainForm.RenderPanelResize(Sender: TObject); +begin + if Assigned(fContext) then begin + glViewport(0, 0, RenderPanel.ClientWidth, RenderPanel.ClientHeight); + end; +end; + +procedure TMainForm.Log(aSender: TObject; const aMsg: String); +begin + LogLB.Items.Add(aMsg); +end; + +procedure TMainForm.Render; +begin + glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); + + fVBO.Bind; + fShader.Enable; + + glEnableVertexAttribArray(LAYOUT_LOCATION_POS); + glVertexAttribPointer(LAYOUT_LOCATION_POS, 3, GL_FLOAT, False, 0, nil); + + glDrawArrays(GL_QUADS, 0, fVBO.DataCount); + + glDisableVertexAttribArray(LAYOUT_LOCATION_POS); + + fShader.Disable; + fVBO.Unbind; + + fContext.SwapBuffers; +end; + +end. +