FRMaterialPreview.pas 4.9 KB

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