FmLibMaterialPicker.pas 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. //
  2. // The graphics engine GLScene
  3. //
  4. unit FmLibMaterialPicker;
  5. (* Allows choosing a material in a material library *)
  6. interface
  7. {$I Stage.Defines.inc}
  8. uses
  9. System.Classes,
  10. System.Types,
  11. Vcl.Forms,
  12. Vcl.StdCtrls,
  13. Vcl.Buttons,
  14. Vcl.Controls,
  15. Vcl.Graphics,
  16. GLS.Scene,
  17. GLS.Objects,
  18. GLS.SceneViewer,
  19. GLS.Material,
  20. GLS.Color,
  21. GLS.Coordinates,
  22. GLS.BaseClasses,
  23. GLS.HUDObjects,
  24. GLS.GeomObjects;
  25. type
  26. TGLLibMaterialPickerForm = class(TForm)
  27. ListBoxMaterials: TListBox;
  28. Label1: TLabel;
  29. Label2: TLabel;
  30. BitBtnOk: TBitBtn;
  31. BitBtnCancel: TBitBtn;
  32. GLScene1: TGLScene;
  33. GLSceneViewer1: TGLSceneViewer;
  34. LightSource1: TGLLightSource;
  35. dcLight1: TGLDummyCube;
  36. dcWorld1: TGLDummyCube;
  37. Camera1: TGLCamera;
  38. Cube1: TGLCube;
  39. Sphere1: TGLSphere;
  40. FireSphere1: TGLSphere;
  41. Teapot1: TGLTeapot;
  42. GLMaterialLibrary1: TGLMaterialLibrary;
  43. ComboBoxObject1: TComboBox;
  44. ComboBoxBackGround1: TComboBox;
  45. BackGroundSprite1: TGLHUDSprite;
  46. LightSource2: TGLLightSource;
  47. procedure ListBoxMaterialsClick(Sender: TObject);
  48. procedure ListBoxMaterialsKeyPress(Sender: TObject; var Key: Char);
  49. procedure ListBoxMaterialsDblClick(Sender: TObject);
  50. procedure ComboBoxObject1Change(Sender: TObject);
  51. procedure ComboBoxBackGround1Change(Sender: TObject);
  52. procedure FormCreate(Sender: TObject);
  53. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  54. procedure GLSceneViewer1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer;
  55. MousePos: TPoint; var Handled: Boolean);
  56. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,
  57. Y: Integer);
  58. private
  59. mx, my: Integer;
  60. FLibMaterial1: TGLAbstractLibMaterial;
  61. function GetMaterial1: TGLMaterial;
  62. procedure SetMaterial1(const Value: TGLMaterial);
  63. function GetLibMaterial1: TGLAbstractLibMaterial;
  64. procedure SetLibMaterial1(const Value: TGLAbstractLibMaterial);
  65. public
  66. function Execute(var MaterialName: TGLLibMaterialName;
  67. MaterialLibrary: TGLAbstractMaterialLibrary): Boolean;
  68. property Material1: TGLMaterial read GetMaterial1 write SetMaterial1;
  69. property LibMaterial1: TGLAbstractLibMaterial read GetLibMaterial1 write SetLibMaterial1;
  70. end;
  71. // For registration in GLScene
  72. function GLLibMaterialPickerForm: TGLLibMaterialPickerForm;
  73. procedure ReleaseLibMaterialPickerForm;
  74. //-------------------------------------------------
  75. implementation
  76. //-------------------------------------------------
  77. {$R *.dfm}
  78. var
  79. vGLLibMaterialPickerForm: TGLLibMaterialPickerForm;
  80. // ------------ GLLibMaterialPickerForm -----------------
  81. function GLLibMaterialPickerForm: TGLLibMaterialPickerForm;
  82. begin
  83. if not Assigned(vGLLibMaterialPickerForm) then
  84. vGLLibMaterialPickerForm := TGLLibMaterialPickerForm.Create(nil);
  85. Result := vGLLibMaterialPickerForm;
  86. end;
  87. // ----------- ReleaseLibMaterialPickerForm --------------
  88. procedure ReleaseLibMaterialPickerForm;
  89. begin
  90. if Assigned(vGLLibMaterialPickerForm) then
  91. begin
  92. vGLLibMaterialPickerForm.Free;
  93. vGLLibMaterialPickerForm := nil;
  94. end;
  95. end;
  96. //------------------- FormCreate --------------------------
  97. procedure TGLLibMaterialPickerForm.FormCreate(Sender: TObject);
  98. begin
  99. // BackGroundSprite positions and size
  100. BackGroundSprite1.Position.X := GLSceneViewer1.Width div 2;
  101. BackGroundSprite1.Position.Y := GLSceneViewer1.Height div 2;
  102. BackGroundSprite1.Width := GLSceneViewer1.Width;
  103. BackGroundSprite1.Height := GLSceneViewer1.Height;
  104. ComboBoxObject1.ItemIndex := 0;
  105. ComboBoxObject1Change(Self);
  106. ComboBoxBackground1.ItemIndex := 0;
  107. ComboBoxBackground1Change(Self);
  108. end;
  109. // ----------------------- MouseMove ----------------------
  110. procedure TGLLibMaterialPickerForm.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  111. Shift: TShiftState; X, Y: Integer);
  112. begin
  113. mx := X;
  114. my := Y;
  115. end;
  116. procedure TGLLibMaterialPickerForm.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
  117. Y: Integer);
  118. begin
  119. if (ssRight in Shift) and (ssLeft in Shift) then
  120. Camera1.AdjustDistanceToTarget(1 - 0.01 * (my - Y))
  121. else if (ssRight in Shift) or (ssLeft in Shift) then
  122. Camera1.MoveAroundTarget(Y - my, X - mx);
  123. mx := X;
  124. my := Y;
  125. end;
  126. // ----------------------- MouseWheel ----------------------
  127. procedure TGLLibMaterialPickerForm.GLSceneViewer1MouseWheel(Sender: TObject; Shift: TShiftState;
  128. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  129. begin
  130. Camera1.AdjustDistanceToTarget(1 - 0.1 * (Abs(WheelDelta) / WheelDelta));
  131. end;
  132. //------------------ Execute --------------------------
  133. function TGLLibMaterialPickerForm.Execute(var MaterialName: TGLLibMaterialName;
  134. MaterialLibrary: TGLAbstractMaterialLibrary): Boolean;
  135. begin
  136. MaterialLibrary.SetNamesToTStrings(ListBoxMaterials.Items);
  137. ListBoxMaterials.ItemIndex := ListBoxMaterials.Items.IndexOf(MaterialName);
  138. if ((ListBoxMaterials.ItemIndex < 0) and (ListBoxMaterials.Items.Count > 0)) then
  139. ListBoxMaterials.ItemIndex := 0;
  140. BitBtnOk.Enabled := (ListBoxMaterials.Items.Count > 0);
  141. ListBoxMaterialsClick(Self);
  142. Result := (ShowModal = mrOk);
  143. if Result then
  144. begin
  145. if ListBoxMaterials.ItemIndex >= 0 then
  146. MaterialName := ListBoxMaterials.Items[ListBoxMaterials.ItemIndex]
  147. else
  148. MaterialName := '';
  149. end;
  150. end;
  151. //-------------------------------------------------------------------
  152. function TGLLibMaterialPickerForm.GetLibMaterial1: TGLAbstractLibMaterial;
  153. begin
  154. Result := FLibMaterial1;
  155. end;
  156. function TGLLibMaterialPickerForm.GetMaterial1: TGLMaterial;
  157. begin
  158. Result := GLMaterialLibrary1.Materials[0].Material;
  159. end;
  160. procedure TGLLibMaterialPickerForm.ListBoxMaterialsClick(Sender: TObject);
  161. begin
  162. if ListBoxMaterials.ItemIndex >= 0 then
  163. LibMaterial1 := TGLAbstractLibMaterial(ListBoxMaterials.Items.Objects[ListBoxMaterials.ItemIndex]);
  164. Cube1.Material := Material1;
  165. Sphere1.Material := Material1;
  166. TeaPot1.Material := Material1;
  167. end;
  168. procedure TGLLibMaterialPickerForm.ListBoxMaterialsKeyPress(Sender: TObject;
  169. var Key: Char);
  170. begin
  171. ListBoxMaterialsClick(Sender);
  172. end;
  173. procedure TGLLibMaterialPickerForm.SetLibMaterial1(const Value: TGLAbstractLibMaterial);
  174. begin
  175. FLibMaterial1 := Value;
  176. if Assigned(FLibMaterial1) then
  177. begin
  178. GLMaterialLibrary1.Materials[0].Material.MaterialLibrary := FLibMaterial1.MaterialLibrary;
  179. GLMaterialLibrary1.Materials[0].Material.LibMaterialName := FLibMaterial1.Name
  180. end
  181. else
  182. begin
  183. GLMaterialLibrary1.Materials[0].Material.MaterialLibrary := nil;
  184. GLMaterialLibrary1.Materials[0].Material.LibMaterialName := '';
  185. end;
  186. end;
  187. procedure TGLLibMaterialPickerForm.SetMaterial1(const Value: TGLMaterial);
  188. begin
  189. GLMaterialLibrary1.Materials[0].Material.Assign(Value.GetActualPrimaryMaterial);
  190. end;
  191. // ------------------- ComboBoxObject1Change -----------------------------
  192. procedure TGLLibMaterialPickerForm.ComboBoxObject1Change(Sender: TObject);
  193. begin
  194. var i: Integer := ComboBoxObject1.ItemIndex;
  195. Cube1.Visible := i = 0;
  196. Sphere1.Visible := i = 1;
  197. Teapot1.Visible := i = 2;
  198. end;
  199. // ------------------- ComboBoxBackGround1Change -----------------------------
  200. procedure TGLLibMaterialPickerForm.ComboBoxBackGround1Change(Sender: TObject);
  201. var
  202. bgColor: TColor; // from Vcl.Graphics
  203. begin
  204. case ComboBoxBackground1.ItemIndex of
  205. 1: bgColor := clWhite;
  206. 2: bgColor := clBlack;
  207. 3: bgColor := clBlue;
  208. 4: bgColor := clRed;
  209. 5: bgColor := clGreen;
  210. else
  211. bgColor := clNone; // 0 - pattern background
  212. end;
  213. BackGroundSprite1.Material.Texture.Disabled := (bgColor <> clNone);
  214. BackGroundSprite1.Material.FrontProperties.Diffuse.Color := ConvertWinColor(bgColor);
  215. end;
  216. procedure TGLLibMaterialPickerForm.ListBoxMaterialsDblClick(Sender: TObject);
  217. begin
  218. BitBtnOk.Click;
  219. end;
  220. //-----------------------------------------------------------------
  221. initialization
  222. //-----------------------------------------------------------------
  223. finalization
  224. ReleaseLibMaterialPickerForm;
  225. end.