FMxMaterialEditor.pas 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //
  2. // The graphics engine GXScene https://github.com/glscene
  3. //
  4. unit FMxMaterialEditor;
  5. (* Editor window for a material (with preview) *)
  6. interface
  7. uses
  8. System.Classes,
  9. System.SysUtils,
  10. System.TypInfo,
  11. System.Types,
  12. System.UITypes,
  13. System.Variants,
  14. FMX.Types,
  15. FMX.Controls,
  16. FMX.Forms,
  17. FMX.Graphics,
  18. FMX.Dialogs,
  19. FMX.TabControl,
  20. FMX.StdCtrls,
  21. FMX.Objects,
  22. FMX.ListBox,
  23. FMX.Controls.Presentation,
  24. FRxMaterialPreview,
  25. FRxColorEditor,
  26. FRxFaceEditor,
  27. FRxTextureEdit,
  28. GXS.Texture,
  29. GXS.Material,
  30. GXS.State;
  31. type
  32. TMaterialEditorForm = class(TForm)
  33. TabControl1: TTabControl;
  34. TIFront: TTabItem;
  35. TIBack: TTabItem;
  36. TITexture: TTabItem;
  37. FEFront: TFaceEditorFrame;
  38. FEBack: TFaceEditorFrame;
  39. GroupBox1: TGroupBox;
  40. MPPreview: TMaterialPreviewFrame;
  41. BBOK: TButton;
  42. ImageOK: TImage;
  43. BBCancel: TButton;
  44. ImageCancel: TImage;
  45. RTextureEdit: TTextureEditFrame;
  46. CBBlending: TComboBox;
  47. Label1: TLabel;
  48. Label2: TLabel;
  49. CBPolygonMode: TComboBox;
  50. procedure OnMaterialChanged(Sender: TObject);
  51. public
  52. constructor Create(AOwner: TComponent); override;
  53. function Execute(AMaterial: TgxMaterial): Boolean;
  54. end;
  55. function MaterialEditorForm: TMaterialEditorForm;
  56. procedure ReleaseMaterialEditorForm;
  57. //======================================================================
  58. implementation
  59. //======================================================================
  60. {$R *.fmx}
  61. var
  62. vMaterialEditorForm: TMaterialEditorForm;
  63. function MaterialEditorForm: TMaterialEditorForm;
  64. begin
  65. if not Assigned(vMaterialEditorForm) then
  66. vMaterialEditorForm := TMaterialEditorForm.Create(nil);
  67. Result := vMaterialEditorForm;
  68. end;
  69. procedure ReleaseMaterialEditorForm;
  70. begin
  71. if Assigned(vMaterialEditorForm) then
  72. begin
  73. vMaterialEditorForm.Free;
  74. vMaterialEditorForm := nil;
  75. end;
  76. end;
  77. //------------------------------------------------------------------
  78. constructor TMaterialEditorForm.Create(AOwner: TComponent);
  79. var
  80. I: Integer;
  81. begin
  82. inherited;
  83. for i := 0 to Integer(High(TgxBlendingMode)) do
  84. CBBlending.Items.Add(GetEnumName(TypeInfo(TgxBlendingMode), i));
  85. for i := 0 to Integer(High(TgxPolygonMode)) do
  86. CBPolygonMode.Items.Add(GetEnumName(TypeInfo(TgxPolygonMode), i));
  87. FEFront.OnChange := OnMaterialChanged;
  88. FEBack.OnChange := OnMaterialChanged;
  89. RTextureEdit.OnChange := OnMaterialChanged;
  90. end;
  91. function TMaterialEditorForm.Execute(AMaterial: TgxMaterial): Boolean;
  92. begin
  93. with AMaterial.GetActualPrimaryMaterial do
  94. begin
  95. FEFront.FaceProperties := FrontProperties;
  96. FEBack.FaceProperties := BackProperties;
  97. RTextureEdit.Texture := Texture;
  98. CBPolygonMode.ItemIndex:=Integer(PolygonMode);
  99. CBBlending.ItemIndex := Integer(BlendingMode);
  100. end;
  101. MPPreview.Material := AMaterial;
  102. Result := (ShowModal = mrOk);
  103. if Result then
  104. with AMaterial.GetActualPrimaryMaterial do
  105. begin
  106. FrontProperties := FEFront.FaceProperties;
  107. BackProperties := FEBack.FaceProperties;
  108. Texture := RTextureEdit.Texture;
  109. BlendingMode := TgxBlendingMode(CBBlending.ItemIndex);
  110. PolygonMode := TgxPolygonMode(CBPolygonMode.ItemIndex);
  111. end;
  112. end;
  113. procedure TMaterialEditorForm.OnMaterialChanged(Sender: TObject);
  114. begin
  115. MPPreview.GLSViewer.BeginUpdate;
  116. with MPPreview.Material do
  117. begin
  118. FrontProperties := FEFront.FaceProperties;
  119. BackProperties := FEBack.FaceProperties;
  120. Texture := RTextureEdit.Texture;
  121. BlendingMode := TgxBlendingMode(CBBlending.ItemIndex);
  122. PolygonMode := TgxPolygonMode(CBPolygonMode.ItemIndex);
  123. end;
  124. MPPreview.GLSViewer.EndUpdate;
  125. end;
  126. // ------------------------------------------------------------------
  127. initialization
  128. // ------------------------------------------------------------------
  129. finalization
  130. ReleaseMaterialEditorForm;
  131. end.