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.

85 lines
3.1 KiB

  1. unit uglcVertexArrayObject;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, contnrs, dglOpenGL, uglcArrayBuffer;
  6. type
  7. EglcVertexArrayObject = class(Exception);
  8. TglcVertexArrayObject = class(TObject)
  9. private
  10. fID: GLuint;
  11. fArrayBuffers: TObjectList;
  12. public
  13. property ID: GLuint read fID;
  14. procedure BindArrayBuffer(const aBuffer: TglcArrayBuffer; const aOwnsObject: Boolean);
  15. procedure VertexAttribPointer(const aIndex: GLuint; const aSize: GLint; const aType: GLenum;
  16. const aNormalized: GLboolean; const aStride: GLsizei; const aOffset: GLint);
  17. procedure Bind;
  18. procedure Unbind;
  19. constructor Create;
  20. destructor Destroy; override;
  21. end;
  22. implementation
  23. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  24. //TglcVertexArrayObject//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  25. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  26. procedure TglcVertexArrayObject.BindArrayBuffer(const aBuffer: TglcArrayBuffer; const aOwnsObject: Boolean);
  27. begin
  28. Bind;
  29. aBuffer.Bind;
  30. if aOwnsObject and (fArrayBuffers.IndexOf(aBuffer) < 0) then
  31. fArrayBuffers.Add(aBuffer);
  32. end;
  33. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. procedure TglcVertexArrayObject.VertexAttribPointer(const aIndex: GLuint; const aSize: GLint; const aType: GLenum;
  35. const aNormalized: GLboolean; const aStride: GLsizei; const aOffset: GLint);
  36. begin
  37. Bind;
  38. glEnableVertexAttribArray(aIndex);
  39. glVertexAttribPointer(aIndex, aSize, aType, aNormalized, aStride, Pointer(aOffset));
  40. end;
  41. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42. procedure TglcVertexArrayObject.Bind;
  43. begin
  44. glBindVertexArray(fID);
  45. end;
  46. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. procedure TglcVertexArrayObject.Unbind;
  48. begin
  49. glBindVertexArray(0);
  50. end;
  51. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  52. constructor TglcVertexArrayObject.Create;
  53. begin
  54. inherited Create;
  55. if not GL_VERSION_3_0 and
  56. not GL_ARB_vertex_array_object then
  57. raise EglcVertexArrayObject.Create('vertex array objects are not supported by video vard');
  58. glGenVertexArrays(1, @fID);
  59. fArrayBuffers := TObjectList.Create(true);
  60. end;
  61. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  62. destructor TglcVertexArrayObject.Destroy;
  63. begin
  64. glDeleteVertexArrays(1, @fID);
  65. FreeAndNil(fArrayBuffers);
  66. inherited Destroy;
  67. end;
  68. end.