FRMaterialPreview.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. //
  2. // The graphics rendering engine GLScene http://glscene.org
  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. CBObject: TComboBox;
  31. Camera: TGLCamera;
  32. Cube: TGLCube;
  33. Sphere: TGLSphere;
  34. LightSource: TGLLightSource;
  35. CBBackground: TComboBox;
  36. BackGroundSprite: TGLHUDSprite;
  37. Cone: TGLCone;
  38. Teapot: TGLTeapot;
  39. World: TGLDummyCube;
  40. Light: TGLDummyCube;
  41. FireSphere: TGLSphere;
  42. GLMaterialLibrary: TGLMaterialLibrary;
  43. GLSceneViewer: TGLSceneViewer;
  44. procedure CBObjectChange(Sender: TObject);
  45. procedure CBBackgroundChange(Sender: TObject);
  46. procedure SceneViewerMouseMove(Sender: TObject; Shift: TShiftState; X,
  47. Y: Integer);
  48. procedure SceneViewerMouseDown(Sender: TObject; Button: TMouseButton;
  49. Shift: TShiftState; X, Y: Integer);
  50. procedure SceneViewerMouseWheel(Sender: TObject; Shift: TShiftState;
  51. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  52. private
  53. FLibMaterial: TGLAbstractLibMaterial;
  54. function GetMaterial: TGLMaterial;
  55. procedure SetMaterial(const Value: TGLMaterial);
  56. function GetLibMaterial: TGLAbstractLibMaterial;
  57. procedure SetLibMaterial(const Value: TGLAbstractLibMaterial);
  58. public
  59. constructor Create(AOwner : TComponent); override;
  60. property Material : TGLMaterial read GetMaterial
  61. write SetMaterial;
  62. property LibMaterial : TGLAbstractLibMaterial read GetLibMaterial
  63. write SetLibMaterial;
  64. end;
  65. // ------------------------------------------------------------------
  66. implementation
  67. // ------------------------------------------------------------------
  68. {$R *.dfm}
  69. var
  70. MX, MY: Integer;
  71. constructor TRMaterialPreview.Create(AOwner : TComponent);
  72. begin
  73. inherited;
  74. BackGroundSprite.Position.X := GLSceneViewer.Width div 2;
  75. BackGroundSprite.Position.Y := GLSceneViewer.Height div 2;
  76. BackGroundSprite.Width := GLSceneViewer.Width;
  77. BackGroundSprite.Height := GLSceneViewer.Height;
  78. CBObject.ItemIndex:=0; CBObjectChange(Self);
  79. CBBackground.ItemIndex:=0; CBBackgroundChange(Self);
  80. end;
  81. procedure TRMaterialPreview.CBObjectChange(Sender: TObject);
  82. var
  83. i : Integer;
  84. begin
  85. i:=CBObject.ItemIndex;
  86. Cube.Visible := I = 0;
  87. Sphere.Visible := I = 1;
  88. Cone.Visible := I = 2;
  89. Teapot.Visible := I = 3;
  90. end;
  91. procedure TRMaterialPreview.CBBackgroundChange(Sender: TObject);
  92. var
  93. bgColor : TColor;
  94. begin
  95. case CBBackground.ItemIndex of
  96. 1 : bgColor:=clWhite;
  97. 2 : bgColor:=clBlack;
  98. 3 : bgColor:=clBlue;
  99. 4 : bgColor:=clRed;
  100. 5 : bgColor:=clGreen;
  101. else
  102. bgColor:=clNone;
  103. end;
  104. with BackGroundSprite.Material do begin
  105. Texture.Disabled:=(bgColor<>clNone);
  106. FrontProperties.Diffuse.Color:=ConvertWinColor(bgColor);
  107. end;
  108. end;
  109. procedure TRMaterialPreview.SceneViewerMouseMove(Sender: TObject;
  110. Shift: TShiftState; X, Y: Integer);
  111. begin
  112. if (ssRight in Shift) and (ssLeft in Shift) then
  113. Camera.AdjustDistanceToTarget(1 - 0.01 * (MY - Y))
  114. else
  115. if (ssRight in Shift) or (ssLeft in Shift) then
  116. Camera.MoveAroundTarget(Y - MY, X - MX);
  117. MX := X;
  118. MY := Y;
  119. end;
  120. procedure TRMaterialPreview.SceneViewerMouseDown(Sender: TObject;
  121. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  122. begin
  123. MX := X;
  124. MY := Y;
  125. end;
  126. procedure TRMaterialPreview.SceneViewerMouseWheel(Sender: TObject;
  127. Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  128. var Handled: Boolean);
  129. begin
  130. Camera.AdjustDistanceToTarget(1 - 0.1 * (Abs(WheelDelta) / WheelDelta));
  131. end;
  132. function TRMaterialPreview.GetMaterial: TGLMaterial;
  133. begin
  134. Result := GLMaterialLibrary.Materials[0].Material;
  135. end;
  136. procedure TRMaterialPreview.SetMaterial(const Value: TGLMaterial);
  137. begin
  138. GLMaterialLibrary.Materials[0].Material.Assign(Value.GetActualPrimaryMaterial);
  139. end;
  140. function TRMaterialPreview.GetLibMaterial: TGLAbstractLibMaterial;
  141. begin
  142. Result := FLibMaterial;
  143. end;
  144. procedure TRMaterialPreview.SetLibMaterial(const Value: TGLAbstractLibMaterial);
  145. begin
  146. FLibMaterial := Value;
  147. if Assigned(FLibMaterial) then
  148. begin
  149. with GLMaterialLibrary.Materials[0] do
  150. begin
  151. Material.MaterialLibrary := FLibMaterial.MaterialLibrary;
  152. Material.LibMaterialName := FLibMaterial.Name
  153. end;
  154. end
  155. else
  156. with GLMaterialLibrary.Materials[0] do
  157. begin
  158. Material.MaterialLibrary := nil;
  159. Material.LibMaterialName := '';
  160. end;
  161. end;
  162. end.