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.