MathgeomGLS
373 строки · 7.7 Кб
1unit fGigaCube;
2
3interface
4
5uses
6System.SysUtils,
7System.Variants,
8System.Classes,
9Vcl.Controls,
10Vcl.Forms,
11Vcl.StdCtrls,
12Vcl.ExtCtrls,
13Vcl.Graphics,
14
15GLS.VectorLists,
16GLS.SceneViewer,
17
18GLS.BaseClasses,
19GLS.Scene,
20GLS.Objects,
21GLS.Material,
22GLS.Texture,
23GLS.HUDObjects,
24GLS.Coordinates,
25GLS.Mesh,
26GLS.VectorFileObjects,
27GLS.Cadencer,
28GLS.RenderContextInfo,
29GLS.AsyncTimer,
30GLS.VectorTypes,
31GLS.VectorGeometry,
32GLS.Context,
33
34uSimpleVBO;
35
36type
37TForm1 = class(TForm)
38GLScene: TGLScene;
39Camera: TGLCamera;
40DummyCube: TGLDummyCube;
41Bevel1: TBevel;
42dogl: TGLDirectOpenGL;
43GLFreeForm: TGLFreeForm;
44GLMesh: TGLMesh;
45GLCube: TGLCube;
46GLCadencer: TGLCadencer;
47Light: TGLLightSource;
48GLAsyncTimer: TGLAsyncTimer;
49GLMatlib: TGLMaterialLibrary;
50back: TGLHUDSprite;
51Panel1: TPanel;
52Image1: TImage;
53Label2: TLabel;
54Label3: TLabel;
55Label4: TLabel;
56Label5: TLabel;
57cnt_1: TLabel;
58cnt_2: TLabel;
59cnt_3: TLabel;
60Image2: TImage;
61pb_1: TImage;
62pb_2: TImage;
63Image5: TImage;
64pb_3: TImage;
65Image7: TImage;
66cnt_4: TLabel;
67pb_4: TImage;
68Image9: TImage;
69vp: TGLSceneViewer;
70procedure doglRender(Sender: TObject; var rci: TGLRenderContextInfo);
71procedure GLCadencerProgress(Sender: TObject; const deltaTime, newTime: Double);
72procedure GLAsyncTimerTimer(Sender: TObject);
73procedure FormCreate(Sender: TObject);
74procedure FormShow(Sender: TObject);
75public
76vbo: TGLSimpleVBO;
77cap: string;
78frames: integer;
79test_num: integer;
80test_dt: integer;
81test_res: array [0 .. 3] of integer;
82test_pb: array [0 .. 3] of TImage;
83test_cap: array [0 .. 3] of TLabel;
84procedure CreateGeometry;
85procedure fill_GLMesh;
86procedure fill_GLFreeForm;
87procedure fill_VBO;
88end;
89
90const
91q0 = 10;
92q1 = q0 * 2 + 1;
93qcnt = q1 * q1 * q1 * 6 * 4;
94
95var
96Form1: TForm1;
97Quads: array [0 .. qcnt - 1] of TGLVertexData;
98
99//----------------------------------------------------------------------
100implementation
101//----------------------------------------------------------------------
102
103{$R *.dfm}
104
105// �������� �����
106//
107procedure TForm1.FormCreate(Sender: TObject);
108
109procedure att(i: integer; p: TImage; c: TLabel);
110begin
111test_res[i] := 0;
112test_pb[i] := p;
113test_cap[i] := c;
114end;
115
116begin
117vp.Buffer.RenderingContext.Activate;
118
119clientWidth := 1024;
120clientHeight := 512 + 48;
121cap := '������� / ����: ' + IntToStr(qcnt div 24) + ', ������������: ' +
122IntToStr(qcnt div 2);
123
124frames := 0;
125test_num := 0;
126test_dt := 21;
127
128att(0, pb_1, cnt_1);
129att(1, pb_2, cnt_2);
130att(2, pb_3, cnt_3);
131att(3, pb_4, cnt_4);
132
133Panel1.DoubleBuffered := true;
134
135CreateGeometry;
136fill_GLMesh;
137fill_GLFreeForm;
138fill_VBO;
139end;
140
141//
142// �������� ���������
143//
144procedure TForm1.GLCadencerProgress;
145begin
146inc(frames);
147dogl.TurnAngle := sin(newTime * 2) * 4 - 14;
148end;
149
150//
151// ������ � ������ ������
152//
153procedure TForm1.doglRender(Sender: TObject; var rci: TGLRenderContextInfo);
154var
155i, j, k: integer;
156
157begin
158case test_num of
1590:
160for i := -q0 to q0 do
161for j := -q0 to q0 do
162for k := -q0 to q0 do
163with GLCube do
164begin
165position.SetPoint(i, j, k);
166Render(rci);
167end;
1681:
169GLMesh.Render(rci);
1702:
171GLFreeForm.Render(rci);
1723:
173vbo.Render(rci);
174end;
175end;
176
177// atTimer
178//
179procedure TForm1.GLAsyncTimerTimer;
180begin
181caption := cap + ' / fps: ' + format('%.2f', [vp.FramesPerSecond]);
182vp.ResetPerformanceMonitor;
183
184dec(test_dt);
185
186inc(test_res[test_num], frames);
187test_pb[test_num].Width := 8 * (21 - test_dt);
188test_cap[test_num].caption := IntToStr(test_res[test_num]);
189frames := 0;
190
191if test_dt = 0 then
192begin
193inc(test_num);
194test_dt := 21;
195end;
196
197if ((test_num = 3) and (vbo = nil)) or (test_num = 4) then
198begin
199caption := cap + ' / �����������';
200GLAsyncTimer.Enabled := false;
201GLCadencer.Enabled := false;
202end;
203
204end;
205
206//
207// �������� ��������� ��������
208//
209procedure TForm1.CreateGeometry;
210const
211d = 0.25;
212var
213i, j, k, q: integer;
214
215procedure _addVertices;
216var
217vc: array [0 .. 7] of TVector3f;
218begin
219SetVector(vc[0], i - d, j - d, k - d);
220SetVector(vc[1], i - d, j - d, k + d);
221SetVector(vc[2], i - d, j + d, k - d);
222SetVector(vc[3], i - d, j + d, k + d);
223SetVector(vc[4], i + d, j - d, k - d);
224SetVector(vc[5], i + d, j - d, k + d);
225SetVector(vc[6], i + d, j + d, k - d);
226SetVector(vc[7], i + d, j + d, k + d);
227Quads[q + 00].coord := vc[0];
228Quads[q + 01].coord := vc[2];
229Quads[q + 02].coord := vc[6];
230Quads[q + 03].coord := vc[4];
231Quads[q + 04].coord := vc[0];
232Quads[q + 05].coord := vc[1];
233Quads[q + 06].coord := vc[3];
234Quads[q + 07].coord := vc[2];
235Quads[q + 08].coord := vc[1];
236Quads[q + 09].coord := vc[5];
237Quads[q + 10].coord := vc[7];
238Quads[q + 11].coord := vc[3];
239Quads[q + 12].coord := vc[4];
240Quads[q + 13].coord := vc[6];
241Quads[q + 14].coord := vc[7];
242Quads[q + 15].coord := vc[5];
243Quads[q + 16].coord := vc[2];
244Quads[q + 17].coord := vc[3];
245Quads[q + 18].coord := vc[7];
246Quads[q + 19].coord := vc[6];
247Quads[q + 20].coord := vc[1];
248Quads[q + 21].coord := vc[4];
249Quads[q + 22].coord := vc[5];
250Quads[q + 23].coord := vc[1];
251end;
252
253procedure _addNormals;
254var
255i: integer;
256begin
257for i := 0 to 3 do
258begin
259Quads[q + i + 00].normal := MinusZVector;
260Quads[q + i + 04].normal := MinusXVector;
261Quads[q + i + 08].normal := ZVector;
262Quads[q + i + 12].normal := XVector;
263Quads[q + i + 16].normal := YVector;
264Quads[q + i + 20].normal := MinusYVector;
265end;
266end;
267
268procedure _addTexCoords;
269var
270i: integer;
271begin
272for i := 0 to 5 do
273begin
274Quads[q + i * 4 + 0].textCoord := NullTexPoint;
275Quads[q + i * 4 + 1].textCoord := YTexPoint;
276Quads[q + i * 4 + 2].textCoord := XYTexPoint;
277Quads[q + i * 4 + 3].textCoord := XTexPoint;
278end;
279end;
280
281begin
282for i := -q0 to q0 do
283for j := -q0 to q0 do
284for k := -q0 to q0 do
285begin
286q := (q1 * ((i + q0) * q1 + (j + q0)) + k + q0) * 24;
287_addVertices;
288_addNormals;
289_addTexCoords;
290end;
291end;
292
293
294{
295procedure TForm1.CreateGeometry;
296end;
297{}
298
299
300// ���������� GLMesh
301//
302procedure TForm1.fill_GLMesh;
303var
304i: integer;
305
306begin
307
308with GLMesh.Vertices do
309begin
310Clear;
311Capacity := length(Quads);
312for i := 0 to high(Quads) do
313AddVertex(Quads[i]);
314end;
315
316end;
317
318// ���������� GLFreeForm
319//
320procedure TForm1.fill_GLFreeForm;
321var
322i: integer;
323MObj: TGLMeshObject;
324FG: TFGVertexIndexList;
325
326begin
327
328MObj := TGLMeshObject.CreateOwned(GLFreeForm.MeshObjects);
329MObj.Mode := momFaceGroups;
330FG := TFGVertexIndexList.CreateOwned(MObj.FaceGroups);
331FG.Mode := fgmmQuads;
332MObj.Vertices.Capacity := length(Quads);
333MObj.Normals.Capacity := length(Quads);
334MObj.TexCoords.Capacity := length(Quads);
335
336for i := 0 to high(Quads) do
337begin
338MObj.Vertices.Add(Quads[i].coord);
339MObj.Normals.Add(Quads[i].normal);
340MObj.TexCoords.Add(Quads[i].textCoord);
341FG.Add(i);
342end;
343
344end;
345
346// with GLFreeForm do ObjectStyle := ObjectStyle + [osDirectDraw];
347
348// ���������� VBO
349//
350procedure TForm1.fill_VBO;
351begin
352if gl.ARB_vertex_buffer_object then
353begin
354vbo := TGLSimpleVBO.CreateAsChild(dogl, @Quads, qcnt);
355with vbo.Material do
356begin
357FrontProperties.Diffuse.SetColor(1, 1, 1, 1);
358MaterialLibrary := GLMatlib;
359LibMaterialName := 'logo';
360end;
361vbo.Visible := false;
362end
363else
364cnt_4.caption := ' ---';
365end;
366
367procedure TForm1.FormShow(Sender: TObject);
368begin
369GLCadencer.Enabled := True;
370GLAsyncTimer.Enabled := true;
371end;
372
373end.
374