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