FRMaterialPreview.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. //
  2. // The multimedia graphics platform GLScene https://github.com/glscene
  3. //
  4. unit FRMaterialPreview;
  5. (* Material Preview frame *)
  6. interface
  7. {$I GLScene.inc}
  8. uses
  9. System.Types,
  10. System.Classes,
  11. Vcl.Graphics,
  12. Vcl.Forms,
  13. Vcl.StdCtrls,
  14. Vcl.ComCtrls,
  15. Vcl.Controls,
  16. GLS.Scene,
  17. GLS.VectorTypes,
  18. GLS.Objects,
  19. GLS.Texture,
  20. GLS.HUDObjects,
  21. GLS.SceneViewer,
  22. GLS.GeomObjects,
  23. GLS.Color,
  24. GLS.Coordinates,
  25. GLS.BaseClasses,
  26. GLS.Material;
  27. type
  28. TRMaterialPreview = class(TFrame)
  29. GLScene: TGLScene;
  30. GLSceneViewer: TGLSceneViewer;
  31. CBObject: TComboBox;
  32. Camera: TGLCamera;
  33. Cube: TGLCube;
  34. Sphere: TGLSphere;
  35. LightSource: TGLLightSource;
  36. CBBackground: TComboBox;
  37. BackGroundSprite: TGLHUDSprite;
  38. Teapot: TGLTeapot;
  39. World: TGLDummyCube;
  40. Light: TGLDummyCube;
  41. FireSphere: TGLSphere;
  42. GLMaterialLibrary: TGLMaterialLibrary;
  43. procedure CBObjectChange(Sender: TObject);
  44. procedure CBBackgroundChange(Sender: TObject);
  45. procedure SceneViewerMouseMove(Sender: TObject; Shift: TShiftState;
  46. X, Y: Integer);
  47. procedure SceneViewerMouseDown(Sender: TObject; Button: TMouseButton;
  48. Shift: TShiftState; X, Y: Integer);
  49. procedure SceneViewerMouseWheel(Sender: TObject; Shift: TShiftState;
  50. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  51. private
  52. FLibMaterial: TGLAbstractLibMaterial;
  53. function GetMaterial: TGLMaterial;
  54. procedure SetMaterial(const Value: TGLMaterial);
  55. function GetLibMaterial: TGLAbstractLibMaterial;
  56. procedure SetLibMaterial(const Value: TGLAbstractLibMaterial);
  57. public
  58. constructor Create(AOwner: TComponent); override;
  59. property Material: TGLMaterial read GetMaterial write SetMaterial;
  60. property LibMaterial: TGLAbstractLibMaterial read GetLibMaterial write SetLibMaterial;
  61. end;
  62. // ------------------------------------------------------------------
  63. implementation
  64. // ------------------------------------------------------------------
  65. {$R *.dfm}
  66. var
  67. MX, MY: Integer;
  68. constructor TRMaterialPreview.Create(AOwner: TComponent);
  69. begin
  70. inherited;
  71. BackGroundSprite.Position.X := GLSceneViewer.Width div 2;
  72. BackGroundSprite.Position.Y := GLSceneViewer.Height div 2;
  73. BackGroundSprite.Width := GLSceneViewer.Width;
  74. BackGroundSprite.Height := GLSceneViewer.Height;
  75. CBObject.ItemIndex := 0;
  76. CBObjectChange(Self);
  77. CBBackground.ItemIndex := 0;
  78. CBBackgroundChange(Self);
  79. end;
  80. procedure TRMaterialPreview.CBObjectChange(Sender: TObject);
  81. var
  82. i: Integer;
  83. begin
  84. i := CBObject.ItemIndex;
  85. Cube.Visible := i = 0;
  86. Sphere.Visible := i = 1;
  87. Teapot.Visible := i = 2;
  88. end;
  89. procedure TRMaterialPreview.CBBackgroundChange(Sender: TObject);
  90. var
  91. bgColor: TColor;
  92. begin
  93. case CBBackground.ItemIndex of
  94. 1: bgColor := clWhite;
  95. 2: bgColor := clBlack;
  96. 3: bgColor := clBlue;
  97. 4: bgColor := clRed;
  98. 5: bgColor := clGreen;
  99. else
  100. bgColor := clNone;
  101. end;
  102. with BackGroundSprite.Material do
  103. begin
  104. Texture.Disabled := (bgColor <> clNone);
  105. FrontProperties.Diffuse.Color := ConvertWinColor(bgColor);
  106. end;
  107. end;
  108. procedure TRMaterialPreview.SceneViewerMouseMove(Sender: TObject;
  109. Shift: TShiftState; X, Y: Integer);
  110. begin
  111. if (ssRight in Shift) and (ssLeft in Shift) then
  112. Camera.AdjustDistanceToTarget(1 - 0.01 * (MY - Y))
  113. else if (ssRight in Shift) or (ssLeft in Shift) then
  114. Camera.MoveAroundTarget(Y - MY, X - MX);
  115. MX := X;
  116. MY := Y;
  117. end;
  118. procedure TRMaterialPreview.SceneViewerMouseDown(Sender: TObject;
  119. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  120. begin
  121. MX := X;
  122. MY := Y;
  123. end;
  124. procedure TRMaterialPreview.SceneViewerMouseWheel(Sender: TObject;
  125. Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  126. var Handled: Boolean);
  127. begin
  128. Camera.AdjustDistanceToTarget(1 - 0.1 * (Abs(WheelDelta) / WheelDelta));
  129. end;
  130. function TRMaterialPreview.GetMaterial: TGLMaterial;
  131. begin
  132. Result := GLMaterialLibrary.Materials[0].Material;
  133. end;
  134. procedure TRMaterialPreview.SetMaterial(const Value: TGLMaterial);
  135. begin
  136. GLMaterialLibrary.Materials[0].Material.Assign(Value.GetActualPrimaryMaterial);
  137. end;
  138. function TRMaterialPreview.GetLibMaterial: TGLAbstractLibMaterial;
  139. begin
  140. Result := FLibMaterial;
  141. end;
  142. procedure TRMaterialPreview.SetLibMaterial(const Value: TGLAbstractLibMaterial);
  143. begin
  144. FLibMaterial := Value;
  145. if Assigned(FLibMaterial) then
  146. begin
  147. with GLMaterialLibrary.Materials[0] do
  148. begin
  149. Material.MaterialLibrary := FLibMaterial.MaterialLibrary;
  150. Material.LibMaterialName := FLibMaterial.Name
  151. end;
  152. end
  153. else
  154. with GLMaterialLibrary.Materials[0] do
  155. begin
  156. Material.MaterialLibrary := nil;
  157. Material.LibMaterialName := '';
  158. end;
  159. end;
  160. end.