Luxophia
226 строк · 6.8 Кб
1unit Main;
2
3interface //#################################################################### ■
4
5uses
6System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
7FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
8System.Math.Vectors,
9FMX.Types3D, FMX.ScrollBox, FMX.Memo, FMX.Controls.Presentation,
10FMX.StdCtrls, FMX.Controls3D, FMX.Objects3D, FMX.Viewport3D, FMX.TabControl,
11LUX, LUX.FMX, LUX.FMX.TTrueViewport3D,
12LIB.Material, FMX.Memo.Types;
13
14type
15TForm1 = class(TForm)
16TabControl1: TTabControl;
17TabItemV: TTabItem;
18Viewport3D1: TViewport3D;
19Light1: TLight;
20Dummy1: TDummy;
21Dummy2: TDummy;
22Camera1: TCamera;
23Dummy3: TDummy;
24Dummy4: TDummy;
25Camera2: TCamera;
26Grid3D1: TGrid3D;
27Plane1: TPlane;
28Grid3D2: TGrid3D;
29Plane2: TPlane;
30Sphere1: TSphere;
31TabItemS: TTabItem;
32TabControlS: TTabControl;
33TabItemSV: TTabItem;
34TabControlSV: TTabControl;
35TabItemSVC: TTabItem;
36MemoSVC: TMemo;
37TabItemSVE: TTabItem;
38MemoSVE: TMemo;
39TabItemSP: TTabItem;
40TabControlSP: TTabControl;
41TabItemSPC: TTabItem;
42MemoSPC: TMemo;
43TabItemSPE: TTabItem;
44MemoSPE: TMemo;
45Panel1: TPanel;
46Viewport3D2: TTrueViewport3DFrame;
47ScrollBar1: TScrollBar;
48procedure FormCreate(Sender: TObject);
49procedure Viewport3D1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
50procedure Viewport3D1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
51procedure Viewport3D1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
52procedure Viewport3D2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
53procedure Viewport3D2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
54procedure Viewport3D2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
55procedure ScrollBar1Change(Sender: TObject);
56private
57{ private 宣言 }
58_MouseS :TShiftState;
59_MouseP :TPointF;
60public
61{ public 宣言 }
62_Material :TMyMaterialSource;
63end;
64
65var
66Form1: TForm1;
67
68implementation //############################################################### ■
69
70uses System.Math;
71
72{$R *.fmx}
73
74//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
75
76//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
77
78//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
79
80procedure TForm1.FormCreate(Sender: TObject);
81var
82T :String;
83begin
84with Viewport3D2 do
85begin
86Camera := Camera2;
87Color := TAlphaColors.Dimgray;
88end;
89
90_MouseS := [];
91
92_Material := TMyMaterialSource.Create( Self );
93
94with _Material do
95begin
96with ShaderV do
97begin
98Source.Text := MemoSVC.Text;
99
100for T in Errors.Keys do
101begin
102with MemoSVE.Lines do
103begin
104Add( '▼ ' + T );
105Add( Errors[ T ] );
106end;
107end;
108end;
109
110with ShaderP do
111begin
112Source.Text := MemoSPC.Text;
113
114for T in Errors.Keys do
115begin
116with MemoSPE.Lines do
117begin
118Add( '▼ ' + T );
119Add( Errors[ T ] );
120end;
121end;
122end;
123
124EmisLight := TAlphaColorF.Create( 0, 0, 0 );
125AmbiLight := TAlphaColorF.Create( 0, 0, 0 );
126DiffRatio := TAlphaColorF.Create( 1, 1, 1 );
127SpecRatio := TAlphaColorF.Create( 1, 1, 1 );
128SpecShiny := 50;
129ProjImage . LoadFromFile( '..\..\_DATA\Lena_512.png' );
130ProjMatrix := Camera2.AbsoluteMatrix;
131ProjAngleW := DegToRad( ScrollBar1.Value );
132ProjAngleH := DegToRad( ScrollBar1.Value );
133end;
134
135Plane1 .MaterialSource := _Material;
136Plane2 .MaterialSource := _Material;
137Sphere1.MaterialSource := _Material;
138
139Viewport3D2.RebuildRenderingList; // Camera2 の所属する Viewport3D1 内のオブジェクト構造が変わる度に呼ぶ必要あり。
140end;
141
142//------------------------------------------------------------------------------
143
144procedure TForm1.Viewport3D1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
145begin
146_MouseS := Shift;
147_MouseP := TPointF.Create( X, Y );
148end;
149
150procedure TForm1.Viewport3D1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
151var
152P :TPointF;
153begin
154if ssLeft in _MouseS then
155begin
156P := TPointF.Create( X, Y );
157
158with Dummy1.RotationAngle do Y := Y + ( P.X - _MouseP.X ) / 2;
159with Dummy2.RotationAngle do X := X - ( P.Y - _MouseP.Y ) / 2;
160
161_MouseP := P;
162end;
163end;
164
165procedure TForm1.Viewport3D1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
166begin
167Viewport3D1MouseMove( Sender, Shift, X, Y );
168
169_MouseS := [];
170end;
171
172//------------------------------------------------------------------------------
173
174procedure TForm1.Viewport3D2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
175begin
176_MouseS := Shift;
177_MouseP := TPointF.Create( X, Y );
178end;
179
180procedure TForm1.Viewport3D2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
181var
182P :TPointF;
183begin
184if ssLeft in _MouseS then
185begin
186P := TPointF.Create( X, Y );
187
188with Dummy3.RotationAngle do Y := Y - ( P.X - _MouseP.X ) / 4;
189with Dummy4.RotationAngle do X := X + ( P.Y - _MouseP.Y ) / 4;
190
191_Material.ProjMatrix := Camera2.AbsoluteMatrix;
192
193Viewport3D2.Repaint;
194
195_MouseP := P;
196end;
197end;
198
199procedure TForm1.Viewport3D2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
200begin
201Viewport3D2MouseMove( Sender, Shift, X, Y );
202
203_MouseS := [];
204end;
205
206//------------------------------------------------------------------------------
207
208procedure TForm1.ScrollBar1Change(Sender: TObject);
209begin
210with _Material do
211begin
212ProjAngleW := DegToRad( ScrollBar1.Value );
213ProjAngleH := DegToRad( ScrollBar1.Value );
214end;
215
216Viewport3D1.Repaint;
217Viewport3D2.Repaint;
218end;
219
220//############################################################################## □
221
222initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
223
224//GlobalUseDX := False;
225
226end. //######################################################################### ■
227