2
// This unit is part of the GLScene Engine https://github.com/glscene
5
Allows choosing a material in a material library
8
unit FLibMaterialPicker;
37
{ TLibMaterialPicker }
39
TLibMaterialPicker = class(TForm)
40
LBMaterials: TListBox;
46
SceneViewer: TGLSceneViewer;
51
LightSource: TGLLightSource;
52
CBBackground: TComboBox;
53
BackGroundSprite: TGLHUDSprite;
58
FireSphere: TGLSphere;
59
GLMaterialLibrary: TGLMaterialLibrary;
60
procedure LBMaterialsClick(Sender: TObject);
61
procedure LBMaterialsKeyPress(Sender: TObject; var Key: char);
62
procedure LBMaterialsDblClick(Sender: TObject);
63
procedure CBObjectChange(Sender: TObject);
64
procedure CBBackgroundChange(Sender: TObject);
65
procedure SceneViewerMouseMove(Sender: TObject; Shift: TShiftState;
67
procedure SceneViewerMouseDown(Sender: TObject; Button: TMouseButton;
68
Shift: TShiftState; X, Y: integer);
69
procedure SceneViewerMouseWheel(Sender: TObject; Shift: TShiftState;
70
WheelDelta: integer; MousePos: TPoint; var Handled: boolean);
72
function GetMaterial: TGLMaterial;
73
procedure SetMaterial(const Value: TGLMaterial);
74
property Material: TGLMaterial read GetMaterial write SetMaterial;
78
constructor Create(AOwner: TComponent); override;
79
function Execute(var materialName: TGLLibMaterialName;
80
materialLibrary: TGLAbstractMaterialLibrary): boolean;
84
function LibMaterialPicker: TLibMaterialPicker;
85
procedure ReleaseLibMaterialPicker;
87
//====================================================
89
//====================================================
93
vLibMaterialPicker: TLibMaterialPicker;
95
function LibMaterialPicker: TLibMaterialPicker;
97
if not Assigned(vLibMaterialPicker) then
98
vLibMaterialPicker := TLibMaterialPicker.Create(nil);
99
Result := vLibMaterialPicker;
102
procedure ReleaseLibMaterialPicker;
104
if Assigned(vLibMaterialPicker) then
106
vLibMaterialPicker.Free;
107
vLibMaterialPicker := nil;
113
function TLibMaterialPicker.Execute(var materialName: TGLLibMaterialName;
114
materialLibrary: TGLAbstractMaterialLibrary)
119
materialLibrary.SetNamesToTStrings(LBMaterials.Items);
120
ItemIndex := Items.IndexOf(materialName);
121
if (ItemIndex < 0) and (Items.Count > 0) then
123
BBOk.Enabled := (Items.Count > 0);
125
LBMaterialsClick(Self);
126
Result := (ShowModal = mrOk);
130
if ItemIndex >= 0 then
131
materialName := Items[ItemIndex]
140
constructor TLibMaterialPicker.Create(AOwner: TComponent);
144
SceneViewer.Height := 160;
145
SceneViewer.Top := 64;
147
BackGroundSprite.Position.X := SceneViewer.Width div 2;
148
BackGroundSprite.Position.Y := SceneViewer.Height div 2;
149
BackGroundSprite.Width := SceneViewer.Width;
150
BackGroundSprite.Height := SceneViewer.Height;
152
CBObject.ItemIndex := 0;
153
CBObjectChange(Self);
154
CBBackground.ItemIndex := 0;
155
CBBackgroundChange(Self);
158
procedure TLibMaterialPicker.LBMaterialsClick(Sender: TObject);
161
if ItemIndex >= 0 then
162
Material := TGLLibMaterial(Items.Objects[ItemIndex]).Material;
165
procedure TLibMaterialPicker.LBMaterialsKeyPress(Sender: TObject; var Key: char);
167
LBMaterialsClick(Sender);
170
procedure TLibMaterialPicker.LBMaterialsDblClick(Sender: TObject);
175
procedure TLibMaterialPicker.CBObjectChange(Sender: TObject);
179
i := CBObject.ItemIndex;
180
Cube.Visible := I = 0;
181
Sphere.Visible := I = 1;
182
Cone.Visible := I = 2;
183
Teapot.Visible := I = 3;
186
procedure TLibMaterialPicker.CBBackgroundChange(Sender: TObject);
190
case CBBackground.ItemIndex of
191
1: bgColor := clWhite;
192
2: bgColor := clBlack;
193
3: bgColor := clBlue;
195
5: bgColor := clGreen;
199
with BackGroundSprite.Material do
201
Texture.Disabled := (bgColor <> clNone);
202
FrontProperties.Diffuse.Color := ConvertWinColor(bgColor);
206
procedure TLibMaterialPicker.SceneViewerMouseMove(Sender: TObject;
207
Shift: TShiftState; X, Y: integer);
209
if (ssRight in Shift) and (ssLeft in Shift) then
210
Camera.AdjustDistanceToTarget(1 - 0.01 * (MY - Y))
212
if (ssRight in Shift) or (ssLeft in Shift) then
213
Camera.MoveAroundTarget(Y - MY, X - MX);
219
procedure TLibMaterialPicker.SceneViewerMouseDown(Sender: TObject;
220
Button: TMouseButton; Shift: TShiftState; X, Y: integer);
226
procedure TLibMaterialPicker.SceneViewerMouseWheel(Sender: TObject;
227
Shift: TShiftState; WheelDelta: integer; MousePos: TPoint; var Handled: boolean);
229
Camera.AdjustDistanceToTarget(1 - 0.1 * (Abs(WheelDelta) / WheelDelta));
232
function TLibMaterialPicker.GetMaterial: TGLMaterial;
234
Result := GLMaterialLibrary.Materials[0].Material;
237
procedure TLibMaterialPicker.SetMaterial(const Value: TGLMaterial);
239
GLMaterialLibrary.Materials[0].Material.Assign(Value);
244
{$I FLibMaterialPicker.lrs}
247
ReleaseLibMaterialPicker;