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.

106 lines
3.8 KiB

  1. unit uglcArrayBuffer;
  2. { Package: OpenGLCore
  3. Prefix: glc - OpenGL Core
  4. Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Array Buffer }
  5. {$mode objfpc}{$H+}
  6. interface
  7. uses
  8. dglOpenGL, sysutils, uglcTypes;
  9. type
  10. EglcArrayBuffer = class(Exception);
  11. TglcArrayBuffer = class(TObject)
  12. private
  13. fID: GLuint;
  14. fTarget: TglcBufferTarget;
  15. fUsage: TglcBufferUsage;
  16. protected
  17. fDataCount: Integer;
  18. fDataSize: Integer;
  19. public
  20. property ID: gluInt read fID;
  21. property Target: TglcBufferTarget read fTarget;
  22. property Usage: TglcBufferUsage read fUsage;
  23. property DataCount: Integer read fDataCount;
  24. property DataSize: Integer read fDataSize;
  25. procedure BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
  26. function MapBuffer(const aAccess: TglcBufferAccess): Pointer;
  27. procedure UnmapBuffer;
  28. procedure Bind;
  29. procedure Unbind;
  30. constructor Create(const aTarget: TglcBufferTarget);
  31. destructor Destroy; override;
  32. end;
  33. implementation
  34. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. //TglcArrayBuffer///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  37. procedure TglcArrayBuffer.BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
  38. begin
  39. glGetError(); //clear Errors
  40. Bind;
  41. fDataCount := aDataCount;
  42. fDataSize := aDataSize;
  43. fUsage := aUsage;
  44. glBufferData(GLenum(fTarget), fDataCount * fDataSize, aData, GLenum(fUsage));
  45. glcCheckAndRaiseError;
  46. end;
  47. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  48. function TglcArrayBuffer.MapBuffer(const aAccess: TglcBufferAccess): Pointer;
  49. begin
  50. glGetError();
  51. result := nil;
  52. if (fDataCount * fDataSize) <= 0 then
  53. exit;
  54. result := glMapBuffer(GLenum(fTarget), GLenum(aAccess));
  55. glcCheckAndRaiseError;
  56. end;
  57. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  58. procedure TglcArrayBuffer.UnmapBuffer;
  59. begin
  60. glUnmapBuffer(GLenum(fTarget));
  61. end;
  62. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  63. procedure TglcArrayBuffer.Bind;
  64. begin
  65. glBindBuffer(GLenum(fTarget), fID);
  66. end;
  67. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  68. procedure TglcArrayBuffer.Unbind;
  69. begin
  70. glBindBuffer(GLenum(fTarget), 0);
  71. end;
  72. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  73. constructor TglcArrayBuffer.Create(const aTarget: TglcBufferTarget);
  74. begin
  75. if not GL_ARB_Vertex_Buffer_Object then
  76. raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
  77. inherited Create;
  78. glGenBuffers(1, @fID);
  79. fDataCount := 0;
  80. fDataSize := 0;
  81. fTarget := aTarget;
  82. end;
  83. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  84. destructor TglcArrayBuffer.Destroy;
  85. begin
  86. glDeleteBuffers(1, @fID);
  87. inherited Destroy;
  88. end;
  89. end.