MathgeomGLS

Форк
0
/
fGigaCube.pas 
373 строки · 7.7 Кб
1
unit fGigaCube;
2

3
interface
4

5
uses
6
  System.SysUtils,
7
  System.Variants,
8
  System.Classes,
9
  Vcl.Controls,
10
  Vcl.Forms,
11
  Vcl.StdCtrls,
12
  Vcl.ExtCtrls,
13
  Vcl.Graphics,
14

15
  GLS.VectorLists,
16
  GLS.SceneViewer,
17

18
  GLS.BaseClasses,
19
  GLS.Scene,
20
  GLS.Objects,
21
  GLS.Material,
22
  GLS.Texture,
23
  GLS.HUDObjects,
24
  GLS.Coordinates,
25
  GLS.Mesh,
26
  GLS.VectorFileObjects,
27
  GLS.Cadencer,
28
  GLS.RenderContextInfo,
29
  GLS.AsyncTimer,
30
  GLS.VectorTypes,
31
  GLS.VectorGeometry,
32
  GLS.Context,
33

34
  uSimpleVBO;
35

36
type
37
  TForm1 = class(TForm)
38
    GLScene: TGLScene;
39
    Camera: TGLCamera;
40
    DummyCube: TGLDummyCube;
41
    Bevel1: TBevel;
42
    dogl: TGLDirectOpenGL;
43
    GLFreeForm: TGLFreeForm;
44
    GLMesh: TGLMesh;
45
    GLCube: TGLCube;
46
    GLCadencer: TGLCadencer;
47
    Light: TGLLightSource;
48
    GLAsyncTimer: TGLAsyncTimer;
49
    GLMatlib: TGLMaterialLibrary;
50
    back: TGLHUDSprite;
51
    Panel1: TPanel;
52
    Image1: TImage;
53
    Label2: TLabel;
54
    Label3: TLabel;
55
    Label4: TLabel;
56
    Label5: TLabel;
57
    cnt_1: TLabel;
58
    cnt_2: TLabel;
59
    cnt_3: TLabel;
60
    Image2: TImage;
61
    pb_1: TImage;
62
    pb_2: TImage;
63
    Image5: TImage;
64
    pb_3: TImage;
65
    Image7: TImage;
66
    cnt_4: TLabel;
67
    pb_4: TImage;
68
    Image9: TImage;
69
    vp: TGLSceneViewer;
70
    procedure doglRender(Sender: TObject; var rci: TGLRenderContextInfo);
71
    procedure GLCadencerProgress(Sender: TObject; const deltaTime, newTime: Double);
72
    procedure GLAsyncTimerTimer(Sender: TObject);
73
    procedure FormCreate(Sender: TObject);
74
    procedure FormShow(Sender: TObject);
75
  public
76
    vbo: TGLSimpleVBO;
77
    cap: string;
78
    frames: integer;
79
    test_num: integer;
80
    test_dt: integer;
81
    test_res: array [0 .. 3] of integer;
82
    test_pb: array [0 .. 3] of TImage;
83
    test_cap: array [0 .. 3] of TLabel;
84
    procedure CreateGeometry;
85
    procedure fill_GLMesh;
86
    procedure fill_GLFreeForm;
87
    procedure fill_VBO;
88
  end;
89

90
const
91
  q0 = 10;
92
  q1 = q0 * 2 + 1;
93
  qcnt = q1 * q1 * q1 * 6 * 4;
94

95
var
96
  Form1: TForm1;
97
  Quads: array [0 .. qcnt - 1] of TGLVertexData;
98

99
//----------------------------------------------------------------------
100
implementation
101
//----------------------------------------------------------------------
102

103
{$R *.dfm}
104

105
// �������� �����
106
//
107
procedure TForm1.FormCreate(Sender: TObject);
108

109
  procedure att(i: integer; p: TImage; c: TLabel);
110
  begin
111
    test_res[i] := 0;
112
    test_pb[i] := p;
113
    test_cap[i] := c;
114
  end;
115

116
begin
117
  vp.Buffer.RenderingContext.Activate;
118

119
  clientWidth := 1024;
120
  clientHeight := 512 + 48;
121
  cap := '������� / ����: ' + IntToStr(qcnt div 24) + ', ������������: ' +
122
    IntToStr(qcnt div 2);
123

124
  frames := 0;
125
  test_num := 0;
126
  test_dt := 21;
127

128
  att(0, pb_1, cnt_1);
129
  att(1, pb_2, cnt_2);
130
  att(2, pb_3, cnt_3);
131
  att(3, pb_4, cnt_4);
132

133
  Panel1.DoubleBuffered := true;
134

135
  CreateGeometry;
136
  fill_GLMesh;
137
  fill_GLFreeForm;
138
  fill_VBO;
139
end;
140

141
//
142
// �������� ���������
143
//
144
procedure TForm1.GLCadencerProgress;
145
begin
146
  inc(frames);
147
  dogl.TurnAngle := sin(newTime * 2) * 4 - 14;
148
end;
149

150
//
151
// ������ � ������ ������
152
//
153
procedure TForm1.doglRender(Sender: TObject; var rci: TGLRenderContextInfo);
154
var
155
  i, j, k: integer;
156

157
begin
158
  case test_num of
159
    0:
160
      for i := -q0 to q0 do
161
        for j := -q0 to q0 do
162
          for k := -q0 to q0 do
163
            with GLCube do
164
            begin
165
              position.SetPoint(i, j, k);
166
              Render(rci);
167
            end;
168
    1:
169
      GLMesh.Render(rci);
170
    2:
171
      GLFreeForm.Render(rci);
172
    3:
173
      vbo.Render(rci);
174
  end;
175
end;
176

177
// atTimer
178
//
179
procedure TForm1.GLAsyncTimerTimer;
180
begin
181
  caption := cap + ' / fps: ' + format('%.2f', [vp.FramesPerSecond]);
182
  vp.ResetPerformanceMonitor;
183

184
  dec(test_dt);
185

186
  inc(test_res[test_num], frames);
187
  test_pb[test_num].Width := 8 * (21 - test_dt);
188
  test_cap[test_num].caption := IntToStr(test_res[test_num]);
189
  frames := 0;
190

191
  if test_dt = 0 then
192
  begin
193
    inc(test_num);
194
    test_dt := 21;
195
  end;
196

197
  if ((test_num = 3) and (vbo = nil)) or (test_num = 4) then
198
  begin
199
    caption := cap + ' / �����������';
200
    GLAsyncTimer.Enabled := false;
201
    GLCadencer.Enabled := false;
202
  end;
203

204
end;
205

206
//
207
// �������� ��������� ��������
208
//
209
procedure TForm1.CreateGeometry;
210
const
211
  d = 0.25;
212
var
213
  i, j, k, q: integer;
214

215
  procedure _addVertices;
216
  var
217
    vc: array [0 .. 7] of TVector3f;
218
  begin
219
    SetVector(vc[0], i - d, j - d, k - d);
220
    SetVector(vc[1], i - d, j - d, k + d);
221
    SetVector(vc[2], i - d, j + d, k - d);
222
    SetVector(vc[3], i - d, j + d, k + d);
223
    SetVector(vc[4], i + d, j - d, k - d);
224
    SetVector(vc[5], i + d, j - d, k + d);
225
    SetVector(vc[6], i + d, j + d, k - d);
226
    SetVector(vc[7], i + d, j + d, k + d);
227
    Quads[q + 00].coord := vc[0];
228
    Quads[q + 01].coord := vc[2];
229
    Quads[q + 02].coord := vc[6];
230
    Quads[q + 03].coord := vc[4];
231
    Quads[q + 04].coord := vc[0];
232
    Quads[q + 05].coord := vc[1];
233
    Quads[q + 06].coord := vc[3];
234
    Quads[q + 07].coord := vc[2];
235
    Quads[q + 08].coord := vc[1];
236
    Quads[q + 09].coord := vc[5];
237
    Quads[q + 10].coord := vc[7];
238
    Quads[q + 11].coord := vc[3];
239
    Quads[q + 12].coord := vc[4];
240
    Quads[q + 13].coord := vc[6];
241
    Quads[q + 14].coord := vc[7];
242
    Quads[q + 15].coord := vc[5];
243
    Quads[q + 16].coord := vc[2];
244
    Quads[q + 17].coord := vc[3];
245
    Quads[q + 18].coord := vc[7];
246
    Quads[q + 19].coord := vc[6];
247
    Quads[q + 20].coord := vc[1];
248
    Quads[q + 21].coord := vc[4];
249
    Quads[q + 22].coord := vc[5];
250
    Quads[q + 23].coord := vc[1];
251
  end;
252

253
  procedure _addNormals;
254
  var
255
    i: integer;
256
  begin
257
    for i := 0 to 3 do
258
    begin
259
      Quads[q + i + 00].normal := MinusZVector;
260
      Quads[q + i + 04].normal := MinusXVector;
261
      Quads[q + i + 08].normal := ZVector;
262
      Quads[q + i + 12].normal := XVector;
263
      Quads[q + i + 16].normal := YVector;
264
      Quads[q + i + 20].normal := MinusYVector;
265
    end;
266
  end;
267

268
  procedure _addTexCoords;
269
  var
270
    i: integer;
271
  begin
272
    for i := 0 to 5 do
273
    begin
274
      Quads[q + i * 4 + 0].textCoord := NullTexPoint;
275
      Quads[q + i * 4 + 1].textCoord := YTexPoint;
276
      Quads[q + i * 4 + 2].textCoord := XYTexPoint;
277
      Quads[q + i * 4 + 3].textCoord := XTexPoint;
278
    end;
279
  end;
280

281
begin
282
  for i := -q0 to q0 do
283
    for j := -q0 to q0 do
284
      for k := -q0 to q0 do
285
      begin
286
        q := (q1 * ((i + q0) * q1 + (j + q0)) + k + q0) * 24;
287
        _addVertices;
288
        _addNormals;
289
        _addTexCoords;
290
      end;
291
end;
292

293

294
{
295
procedure TForm1.CreateGeometry;
296
end;
297
{}
298

299

300
// ���������� GLMesh
301
//
302
procedure TForm1.fill_GLMesh;
303
var
304
  i: integer;
305

306
begin
307

308
  with GLMesh.Vertices do
309
  begin
310
    Clear;
311
    Capacity := length(Quads);
312
    for i := 0 to high(Quads) do
313
      AddVertex(Quads[i]);
314
  end;
315

316
end;
317

318
// ���������� GLFreeForm
319
//
320
procedure TForm1.fill_GLFreeForm;
321
var
322
  i: integer;
323
  MObj: TGLMeshObject;
324
  FG: TFGVertexIndexList;
325

326
begin
327

328
  MObj := TGLMeshObject.CreateOwned(GLFreeForm.MeshObjects);
329
  MObj.Mode := momFaceGroups;
330
  FG := TFGVertexIndexList.CreateOwned(MObj.FaceGroups);
331
  FG.Mode := fgmmQuads;
332
  MObj.Vertices.Capacity := length(Quads);
333
  MObj.Normals.Capacity := length(Quads);
334
  MObj.TexCoords.Capacity := length(Quads);
335

336
  for i := 0 to high(Quads) do
337
  begin
338
    MObj.Vertices.Add(Quads[i].coord);
339
    MObj.Normals.Add(Quads[i].normal);
340
    MObj.TexCoords.Add(Quads[i].textCoord);
341
    FG.Add(i);
342
  end;
343

344
end;
345

346
// with GLFreeForm do ObjectStyle := ObjectStyle + [osDirectDraw];
347

348
// ���������� VBO
349
//
350
procedure TForm1.fill_VBO;
351
begin
352
  if gl.ARB_vertex_buffer_object then
353
  begin
354
    vbo := TGLSimpleVBO.CreateAsChild(dogl, @Quads, qcnt);
355
    with vbo.Material do
356
    begin
357
      FrontProperties.Diffuse.SetColor(1, 1, 1, 1);
358
      MaterialLibrary := GLMatlib;
359
      LibMaterialName := 'logo';
360
    end;
361
    vbo.Visible := false;
362
  end
363
  else
364
    cnt_4.caption := ' ---';
365
end;
366

367
procedure TForm1.FormShow(Sender: TObject);
368
begin
369
  GLCadencer.Enabled := True;
370
  GLAsyncTimer.Enabled := true;
371
end;
372

373
end.
374

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.