You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
2.7 KiB

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