FRxMaterialPreview.pas 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. //
  2. // The graphics engine GXScene https://github.com/glscene
  3. //
  4. unit FRxMaterialPreview;
  5. (* Material Preview frame *)
  6. interface
  7. uses
  8. System.SysUtils,
  9. System.Types,
  10. System.UITypes,
  11. System.Classes,
  12. System.Variants,
  13. System.Math.Vectors,
  14. FMX.Types,
  15. FMX.Graphics,
  16. FMX.Controls,
  17. FMX.Forms,
  18. FMX.Dialogs,
  19. FMX.StdCtrls,
  20. FMX.Media,
  21. FMX.Viewport3D,
  22. FMX.ListBox,
  23. FMX.Types3D,
  24. FMX.Controls3D,
  25. FMX.Objects3D,
  26. FMX.MaterialSources,
  27. FMX.Layers3D,
  28. GXS.BaseClasses,
  29. GXS.Scene,
  30. // GXS.SceneViewer,
  31. GXS.Material,
  32. GXS.HUDObjects,
  33. GXS.GeomObjects,
  34. GXS.Color,
  35. GXS.Coordinates;
  36. type
  37. TMaterialPreviewFrame = class(TFrame)
  38. CBObject: TComboBox;
  39. Camera: TCamera;
  40. Cube: TCube;
  41. Sphere: TSphere;
  42. LightSource: TLight;
  43. CBBackground: TComboBox;
  44. BackGroundSprite: TImage3D;
  45. LightMaterialSource: TLightMaterialSource;
  46. Cone: TCone;
  47. Teapot: TModel3D;
  48. World: TDummy;
  49. Light: TDummy;
  50. FireSphere: TSphere;
  51. GLSViewer: TViewport3D;
  52. procedure CBObjectChange(Sender: TObject);
  53. procedure CBBackgroundChange(Sender: TObject);
  54. procedure GLSViewerMouseMove(Sender: TObject; Shift: TShiftState; X,
  55. Y: Single);
  56. procedure GLSViewerMouseDown(Sender: TObject; Button: TMouseButton;
  57. Shift: TShiftState; X, Y: Single);
  58. procedure GLSViewerMouseWheel(Sender: TObject; Shift: TShiftState;
  59. WheelDelta: Integer; var Handled: Boolean);
  60. procedure GLSViewerMouseUp(Sender: TObject; Button: TMouseButton;
  61. Shift: TShiftState; X, Y: Single);
  62. private
  63. FLibMaterial: TgxAbstractLibMaterial;
  64. function GetMaterial: TgxMaterial;
  65. procedure SetMaterial(const Value: TgxMaterial);
  66. function GetLibMaterial: TgxAbstractLibMaterial;
  67. procedure SetLibMaterial(const Value: TgxAbstractLibMaterial);
  68. public
  69. IsMouseUp : Boolean;
  70. Down : TPointF;
  71. GLMaterialLibrary: TgxMaterialLibrary;
  72. constructor Create(AOwner : TComponent); override;
  73. property Material : TgxMaterial read GetMaterial
  74. write SetMaterial;
  75. property LibMaterial : TgxAbstractLibMaterial read GetLibMaterial
  76. write SetLibMaterial;
  77. end;
  78. //=======================================================================
  79. implementation
  80. //=======================================================================
  81. {$R *.fmx}
  82. var
  83. MX, MY: Integer;
  84. //--------------------------------------------------------------
  85. // TRMaterialPreview
  86. //--------------------------------------------------------------
  87. constructor TMaterialPreviewFrame.Create(AOwner: TComponent);
  88. begin
  89. inherited;
  90. BackGroundSprite.Position.X := GLSViewer.Width/2;
  91. BackGroundSprite.Position.Y := GLSViewer.Height/2;
  92. BackGroundSprite.Width := GLSViewer.Width;
  93. BackGroundSprite.Height := GLSViewer.Height;
  94. CBObject.ItemIndex:=0; CBObjectChange(Self);
  95. CBBackground.ItemIndex:=0; CBBackgroundChange(Self);
  96. end;
  97. procedure TMaterialPreviewFrame.CBObjectChange(Sender: TObject);
  98. var
  99. i : Integer;
  100. begin
  101. i:=CBObject.ItemIndex;
  102. Cube.Visible := I = 0;
  103. Sphere.Visible := I = 1;
  104. Cone.Visible := I = 2;
  105. Teapot.Visible := I = 3;
  106. end;
  107. procedure TMaterialPreviewFrame.CBBackgroundChange(Sender: TObject);
  108. var
  109. bgColor : TColor;
  110. begin
  111. case CBBackground.ItemIndex of
  112. 1 : bgColor := TColors.White;
  113. 2 : bgColor := TColors.Black;
  114. 3 : bgColor := TColors.Blue;
  115. 4 : bgColor := TColors.Red;
  116. 5 : bgColor := TColors.Green;
  117. else
  118. bgColor := TColors.SysNone;
  119. end;
  120. if (bgColor<>TColors.SysNone) then
  121. BackGroundSprite.Bitmap.Canvas.Fill.Color := bgColor;
  122. end;
  123. procedure TMaterialPreviewFrame.GLSViewerMouseMove(Sender: TObject;
  124. Shift: TShiftState; X, Y: Single);
  125. begin
  126. if (ssLeft in Shift) and (ssLeft in Shift) then
  127. begin
  128. World.RotationAngle.X := World.RotationAngle.X - ((Y - Down.Y) * 0.3);
  129. World.RotationAngle.Y := World.RotationAngle.Y + ((X - Down.X) * 0.3);
  130. Down := PointF(X, Y);
  131. end;
  132. end;
  133. procedure TMaterialPreviewFrame.GLSViewerMouseUp(Sender: TObject;
  134. Button: TMouseButton; Shift: TShiftState; X, Y: Single);
  135. begin
  136. IsMouseUp := False;
  137. end;
  138. procedure TMaterialPreviewFrame.GLSViewerMouseDown(Sender: TObject;
  139. Button: TMouseButton; Shift: TShiftState; X, Y: Single);
  140. begin
  141. Down := PointF(X, Y);
  142. IsMouseUp := True;
  143. end;
  144. procedure TMaterialPreviewFrame.GLSViewerMouseWheel(Sender: TObject;
  145. Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
  146. var
  147. AVector: TVector3D;
  148. begin
  149. AVector := Vector3D(0, 0, 1);
  150. Camera.Position.Vector := Camera.Position.Vector + AVector * (WheelDelta / 120) * 0.3;
  151. end;
  152. function TMaterialPreviewFrame.GetMaterial: TgxMaterial;
  153. begin
  154. Result := GLMaterialLibrary.Materials[0].Material;
  155. end;
  156. procedure TMaterialPreviewFrame.SetMaterial(const Value: TgxMaterial);
  157. begin
  158. GLMaterialLibrary.Materials[0].Material.Assign(Value.GetActualPrimaryMaterial);
  159. end;
  160. function TMaterialPreviewFrame.GetLibMaterial: TgxAbstractLibMaterial;
  161. begin
  162. Result := FLibMaterial;
  163. end;
  164. procedure TMaterialPreviewFrame.SetLibMaterial(const Value: TgxAbstractLibMaterial);
  165. begin
  166. FLibMaterial := Value;
  167. if Assigned(FLibMaterial) then
  168. begin
  169. with GLMaterialLibrary.Materials[0] do
  170. begin
  171. Material.MaterialLibrary := FLibMaterial.MaterialLibrary;
  172. Material.LibMaterialName := FLibMaterial.Name
  173. end;
  174. end
  175. else
  176. with GLMaterialLibrary.Materials[0] do
  177. begin
  178. Material.MaterialLibrary := nil;
  179. Material.LibMaterialName := '';
  180. end;
  181. end;
  182. end.