|
- unit uglcArrayBuffer;
-
- { Package: OpenGLCore
- Prefix: glc - OpenGL Core
- Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Array Buffer }
-
- {$mode objfpc}{$H+}
-
- interface
-
- uses
- dglOpenGL, sysutils, uglcTypes;
-
- type
- EglcArrayBuffer = class(Exception);
- TglcArrayBuffer = class(TObject)
- private
- fID: GLuint;
- fTarget: TglcBufferTarget;
- fUsage: TglcBufferUsage;
- protected
- fDataCount: Integer;
- fDataSize: Integer;
- public
- property ID: gluInt read fID;
- property Target: TglcBufferTarget read fTarget;
- property Usage: TglcBufferUsage read fUsage;
- property DataCount: Integer read fDataCount;
- property DataSize: Integer read fDataSize;
-
- procedure BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
- function MapBuffer(const aAccess: TglcBufferAccess): Pointer;
- procedure UnmapBuffer;
- procedure Bind;
- procedure Unbind;
- constructor Create(const aTarget: TglcBufferTarget);
- destructor Destroy; override;
- end;
-
- implementation
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TglcArrayBuffer///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
- procedure TglcArrayBuffer.BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
- begin
- glGetError(); //clear Errors
- Bind;
- fDataCount := aDataCount;
- fDataSize := aDataSize;
- fUsage := aUsage;
- glBufferData(GLenum(fTarget), fDataCount * fDataSize, aData, GLenum(fUsage));
- glcCheckAndRaiseError;
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
- function TglcArrayBuffer.MapBuffer(const aAccess: TglcBufferAccess): Pointer;
- begin
- glGetError();
- result := nil;
- if (fDataCount * fDataSize) <= 0 then
- exit;
- result := glMapBuffer(GLenum(fTarget), GLenum(aAccess));
- glcCheckAndRaiseError;
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
- procedure TglcArrayBuffer.UnmapBuffer;
- begin
- glUnmapBuffer(GLenum(fTarget));
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
- procedure TglcArrayBuffer.Bind;
- begin
- glBindBuffer(GLenum(fTarget), fID);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
- procedure TglcArrayBuffer.Unbind;
- begin
- glBindBuffer(GLenum(fTarget), 0);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
- constructor TglcArrayBuffer.Create(const aTarget: TglcBufferTarget);
- begin
- if not GL_ARB_Vertex_Buffer_Object then
- raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
- inherited Create;
- glGenBuffers(1, @fID);
- fDataCount := 0;
- fDataSize := 0;
- fTarget := aTarget;
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
- destructor TglcArrayBuffer.Destroy;
- begin
- glDeleteBuffers(1, @fID);
- inherited Destroy;
- end;
-
- end.
|