MathgeomGLS
131 строка · 2.7 Кб
1unit uSimpleVBO;
2
3interface
4
5uses
6Winapi.OpenGL,
7Winapi.OpenGLext,
8GLS.Scene,
9GLS.Mesh,
10GLS.VectorTypes,
11GLS.VectorGeometry,
12GLS.RenderContextInfo,
13GLS.OpenGLTokens,
14GLS.Context,
15GLS.Material,
16GLS.Texture;
17
18
19type
20TGLSimpleVBO = class(TGLSceneObject)
21protected
22
23f_varr: array of TVector3f;
24f_narr: array of TVector3f;
25f_tarr: array of TTexPoint;
26f_bufs: array[0..2] of Cardinal;
27
28procedure _initBufs;
29
30public
31constructor CreateAsChild(a_Owner:TGLBaseSceneObject;
32a_Array:PGLVertexDataArray; a_VertexCount:integer);
33procedure DoRender(var a_Rci:TGLRenderContextInfo;
34a_RenderSelf,a_RenderChildren:Boolean); override;
35procedure loadData(a_Array:PGLVertexDataArray; a_VertexCount:integer);
36end;
37
38
39implementation
40
41
42//
43// _initBufs
44//
45procedure TGLSimpleVBO._initBufs;
46var
47c: integer;
48
49begin
50c := Length(f_varr);
51gl.GenBuffers(1, @f_bufs[0]);
52gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[0]);
53gl.BufferData(GL_ARRAY_BUFFER, 12 * c, @f_varr[0], GL_STATIC_DRAW);
54gl.BindBuffer(GL_ARRAY_BUFFER, 0);
55
56gl.GenBuffers(1, @f_bufs[1]);
57gl.BindBuffer(GL_ARRAY_BUFFER_ARB, f_bufs[1]);
58gl.BufferData(GL_ARRAY_BUFFER_ARB, 12 * c, @f_narr[0], GL_STATIC_DRAW);
59gl.BindBuffer(GL_ARRAY_BUFFER_ARB, 0);
60
61gl.GenBuffers(1, @f_bufs[2]);
62gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[2]);
63gl.BufferData(GL_ARRAY_BUFFER, 8 * c, @f_tarr[0], GL_STATIC_DRAW);
64gl.BindBuffer(GL_ARRAY_BUFFER, 0);
65
66end;
67
68
69//
70// constructor
71//
72constructor TGLSimpleVBO.CreateAsChild;
73begin
74inherited CreateAsChild(a_Owner);
75loadData(a_Array, a_VertexCount);
76end;
77
78
79//
80// loadData
81//
82procedure TGLSimpleVBO.loadData;
83var
84i: integer;
85begin
86if a_VertexCount < 3 then Exit;
87SetLength(f_varr, a_VertexCount);
88SetLength(f_narr, a_VertexCount);
89SetLength(f_tarr, a_VertexCount);
90
91for i := 0 to a_VertexCount - 1 do begin
92f_varr[i] := a_Array[i].coord;
93f_narr[i] := a_Array[i].normal;
94f_tarr[i] := a_Array[i].textCoord;
95end;
96_initBufs;
97end;
98
99
100//
101// DoRender
102//
103procedure TGLSimpleVBO.DoRender;
104begin
105if High(f_varr) < 2 then Exit;
106Material.Apply(a_Rci);
107
108gl.EnableClientState(GL_VERTEX_ARRAY);
109gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[0]);
110gl.VertexPointer(3, GL_FLOAT, 0, nil);
111
112gl.EnableClientState(GL_NORMAL_ARRAY);
113gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[1]);
114gl.NormalPointer(GL_FLOAT, 0, nil);
115
116gl.EnableClientState(GL_TEXTURE_COORD_ARRAY);
117gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[2]);
118gl.TexCoordPointer(2, GL_FLOAT, 0, nil);
119
120gl.DrawArrays(GL_QUADS, 0, high(f_varr) + 1);
121
122gl.DisableClientState(GL_VERTEX_ARRAY);
123gl.DisableClientState(GL_NORMAL_ARRAY);
124gl.DisableClientState(GL_TEXTURE_COORD_ARRAY);
125
126Material.UnApply(a_Rci);
127
128end;
129
130
131end.
132