ArenaZ
142 строки · 4.8 Кб
1unit Unit1;
2
3{$MODE Delphi}
4
5interface
6
7uses
8LCLType, SysUtils, Classes, Math,
9Graphics, Controls, Forms, Dialogs,
10GLCadencer, GLScene, GLObjects, GLAsyncTimer,
11GLGeomObjects, GLTexture, GLHUDObjects,
12GLSpaceText, GLVectorGeometry,
13GLParticleFX, GLPerlinPFX, GLKeyboard, GLBitmapFont, GLWindowsFont,
14GLCoordinates, GLCrossPlatform, GLLCLViewer;
15
16type
17TForm1 = class(TForm)
18GLScene1: TGLScene;
19vp: TGLSceneViewer;
20GLCadencer1: TGLCadencer;
21GLCamera1: TGLCamera;
22GLParticleFXRenderer1: TGLParticleFXRenderer;
23AsyncTimer1: TGLAsyncTimer;
24GLDummyCube1: TGLDummyCube;
25GLLightSource1: TGLLightSource;
26txt_gl: TGLSpaceText;
27txt_scene: TGLSpaceText;
28GLPointLightPFXManager1: TGLPointLightPFXManager;
29GLPointLightPFXManager2: TGLPointLightPFXManager;
30DC_emitter: TGLDummyCube;
31GLPerlinPFXManager1: TGLPerlinPFXManager;
32GLHUDText1: TGLHUDText;
33GLWindowsBitmapFont1: TGLWindowsBitmapFont;
34procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: integer; MousePos: TPoint; var Handled: boolean);
35procedure GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: double);
36procedure AsyncTimer1Timer(Sender: TObject);
37procedure vpMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
38procedure vpMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
39procedure FormCreate(Sender: TObject);
40private
41public
42procedure CharType(ntype: integer);
43end;
44
45var
46Form1: 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
52implementation
53
54{$R *.lfm}
55
56procedure TForm1.FormCreate(Sender: TObject);
57begin
58glHUDtext1.Text := '1 rain'#13 + '2 snow'#13 + '3 fog';
59CharType(0);
60end;
61
62procedure TForm1.CharType(ntype: integer);
63var
64a: integer;
65begin
66_type := ntype; // remember selected effect
67for a := 0 to 2 do
68// switch off unnecessary effects and switch on selected one
69with TGLSourcePFXEffect(GLDummyCube1.Effects[a]) do
70if _type = a then
71Enabled := True
72else
73Enabled := False;
74end;
75
76procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: integer; MousePos: TPoint; var Handled: boolean);
77begin
78_zoom := WheelDelta / 120; // remember position of mouse wheel
79end;
80
81procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: double);
82begin
83if _shift then
84GLDummyCube1.Turn(_mx - mouse.CursorPos.x) // rotating camera by mouse
85else
86GLDummyCube1.Turn(deltatime * 10); // othrwise auto rotation
87
88_mx := Mouse.CursorPos.x; // çàïîìèíàåì êîîðäèíàòó
89
90GLCamera1.AdjustDistanceToTarget(Power(1.1, _zoom)); // ïðèáëèæàåìñÿ-óäàëÿåìñÿ
91_zoom := 0;
92
93if IsKeyDown('1') then
94CharType(0); // rain
95if IsKeyDown('2') then
96CharType(1); // snow
97if IsKeyDown('3') then
98CharType(2); // fog
99if IsKeyDown(VK_ESCAPE) then
100Close;
101
102case _type of
103// ïîäñòðîéêè "äîæäèêà" ê âðàùåíèþ êàìåðû
1040: with TGLSourcePFXEffect(GLDummyCube1.Effects[0]) do
105begin
106// êîîðäèíàòû ýìèòòåðà
107InitialPosition.AsVector := dc_emitter.AbsolutePosition;
108// íàïðàâëåíèå ê öåíòðó
109InitialVelocity.AsVector :=
110VectorScale(VectorNormalize(VectorNegate(dc_emitter.AbsolutePosition)), 10);
111// ïîâîðà÷èâàåì ÷àñòèöû ê öåíòðó
112GLPointLightPFXManager1.Rotation := -arctan(InitialVelocity.X / InitialVelocity.Y);
113end;
114// ïîäñòðîéêè "ñíåæêà" îòíîñèòåëüíî âðàùåíèÿ êàìåðû
1151: with TGLSourcePFXEffect(GLDummyCube1.Effects[1]) do
116begin
117// êîîðäèíàòû ýìèòòåðà
118InitialPosition.AsVector := dc_emitter.AbsolutePosition;
119// íàïðàâëÿåì ê öåíòðó
120InitialVelocity.AsVector :=
121VectorScale(VectorNormalize(VectorNegate(dc_emitter.AbsolutePosition)), 4);
122end;
123end;
124end;
125
126procedure TForm1.AsyncTimer1Timer(Sender: TObject);
127begin
128Form1.Caption := vp.FramesPerSecondText(2); // âûâîäèì êîëè÷åñòâî êàäðîâ â ñåêóíäó
129vp.ResetPerformanceMonitor; // è îáíóëÿåì ñ÷¸ò÷èê
130end;
131
132procedure TForm1.vpMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
133begin
134_shift := True; // pressed button
135end;
136
137procedure TForm1.vpMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
138begin
139_shift := False; // êíîïêà îòæàòà
140end;
141
142end.
143