ArenaZ

Форк
0
142 строки · 4.8 Кб
1
unit Unit1;
2

3
{$MODE Delphi}
4

5
interface
6

7
uses
8
  LCLType, SysUtils, Classes, Math,
9
  Graphics, Controls, Forms, Dialogs,
10
  GLCadencer, GLScene, GLObjects, GLAsyncTimer,
11
  GLGeomObjects, GLTexture, GLHUDObjects,
12
  GLSpaceText, GLVectorGeometry,
13
  GLParticleFX, GLPerlinPFX, GLKeyboard, GLBitmapFont, GLWindowsFont,
14
  GLCoordinates, GLCrossPlatform, GLLCLViewer;
15

16
type
17
  TForm1 = class(TForm)
18
    GLScene1: TGLScene;
19
    vp: TGLSceneViewer;
20
    GLCadencer1: TGLCadencer;
21
    GLCamera1: TGLCamera;
22
    GLParticleFXRenderer1: TGLParticleFXRenderer;
23
    AsyncTimer1: TGLAsyncTimer;
24
    GLDummyCube1: TGLDummyCube;
25
    GLLightSource1: TGLLightSource;
26
    txt_gl: TGLSpaceText;
27
    txt_scene: TGLSpaceText;
28
    GLPointLightPFXManager1: TGLPointLightPFXManager;
29
    GLPointLightPFXManager2: TGLPointLightPFXManager;
30
    DC_emitter: TGLDummyCube;
31
    GLPerlinPFXManager1: TGLPerlinPFXManager;
32
    GLHUDText1: TGLHUDText;
33
    GLWindowsBitmapFont1: TGLWindowsBitmapFont;
34
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: integer; MousePos: TPoint; var Handled: boolean);
35
    procedure GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: double);
36
    procedure AsyncTimer1Timer(Sender: TObject);
37
    procedure vpMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
38
    procedure vpMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
39
    procedure FormCreate(Sender: TObject);
40
  private
41
  public
42
    procedure CharType(ntype: integer);
43
  end;
44

45
var
46
  Form1: TForm1;
47
  _type: integer = 0;      // effect type - rain/snow/fog
48
  _shift: boolean = False; // indicator of any mouse button pressing
49
  _mx: integer;          // prev mouse button
50
  _zoom: single = 0;
51

52
implementation
53

54
{$R *.lfm}
55

56
procedure TForm1.FormCreate(Sender: TObject);
57
begin
58
  glHUDtext1.Text := '1 rain'#13 + '2 snow'#13 + '3 fog';
59
  CharType(0);
60
end;
61

62
procedure TForm1.CharType(ntype: integer);
63
var
64
  a: integer;
65
begin
66
  _type := ntype; // remember selected effect
67
  for a := 0 to 2 do
68
    // switch off unnecessary effects and switch on selected one
69
    with TGLSourcePFXEffect(GLDummyCube1.Effects[a]) do
70
      if _type = a then
71
        Enabled := True
72
      else
73
        Enabled := False;
74
end;
75

76
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: integer; MousePos: TPoint; var Handled: boolean);
77
begin
78
  _zoom := WheelDelta / 120; // remember position of mouse wheel
79
end;
80

81
procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: double);
82
begin
83
  if _shift then
84
    GLDummyCube1.Turn(_mx - mouse.CursorPos.x) // rotating camera by mouse
85
  else
86
    GLDummyCube1.Turn(deltatime * 10);       // othrwise auto rotation
87

88
  _mx := Mouse.CursorPos.x; // çàïîìèíàåì êîîðäèíàòó
89

90
  GLCamera1.AdjustDistanceToTarget(Power(1.1, _zoom)); // ïðèáëèæàåìñÿ-óäàëÿåìñÿ
91
  _zoom := 0;
92

93
  if IsKeyDown('1') then
94
    CharType(0); // rain
95
  if IsKeyDown('2') then
96
    CharType(1); // snow
97
  if IsKeyDown('3') then
98
    CharType(2); // fog
99
  if IsKeyDown(VK_ESCAPE) then
100
    Close;
101

102
  case _type of
103
    // ïîäñòðîéêè "äîæäèêà" ê âðàùåíèþ êàìåðû
104
    0: with TGLSourcePFXEffect(GLDummyCube1.Effects[0]) do
105
      begin
106
        // êîîðäèíàòû ýìèòòåðà
107
        InitialPosition.AsVector := dc_emitter.AbsolutePosition;
108
        // íàïðàâëåíèå ê öåíòðó
109
        InitialVelocity.AsVector :=
110
          VectorScale(VectorNormalize(VectorNegate(dc_emitter.AbsolutePosition)), 10);
111
        // ïîâîðà÷èâàåì ÷àñòèöû ê öåíòðó
112
        GLPointLightPFXManager1.Rotation := -arctan(InitialVelocity.X / InitialVelocity.Y);
113
      end;
114
    // ïîäñòðîéêè "ñíåæêà" îòíîñèòåëüíî âðàùåíèÿ êàìåðû
115
    1: with TGLSourcePFXEffect(GLDummyCube1.Effects[1]) do
116
      begin
117
        // êîîðäèíàòû ýìèòòåðà
118
        InitialPosition.AsVector := dc_emitter.AbsolutePosition;
119
        // íàïðàâëÿåì ê öåíòðó
120
        InitialVelocity.AsVector :=
121
          VectorScale(VectorNormalize(VectorNegate(dc_emitter.AbsolutePosition)), 4);
122
      end;
123
  end;
124
end;
125

126
procedure TForm1.AsyncTimer1Timer(Sender: TObject);
127
begin
128
  Form1.Caption := vp.FramesPerSecondText(2); // âûâîäèì êîëè÷åñòâî êàäðîâ â ñåêóíäó
129
  vp.ResetPerformanceMonitor;         // è îáíóëÿåì ñ÷¸ò÷èê
130
end;
131

132
procedure TForm1.vpMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
133
begin
134
  _shift := True; // pressed button
135
end;
136

137
procedure TForm1.vpMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
138
begin
139
  _shift := False; // êíîïêà îòæàòà
140
end;
141

142
end.
143

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

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

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

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