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