FRxTextureEdit.pas 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. //
  2. // The graphics engine GXScene https://github.com/glscene
  3. //
  4. unit FRxTextureEdit;
  5. (* Basic editing frame for Textures *)
  6. interface
  7. // TODO : Replace STImageClass with a dropdown (polymorphism)
  8. uses
  9. System.SysUtils,
  10. System.Types,
  11. System.UITypes,
  12. System.TypInfo,
  13. System.Classes,
  14. System.Variants,
  15. FMX.Types,
  16. FMX.Graphics,
  17. FMX.Controls,
  18. FMX.Forms,
  19. FMX.Dialogs,
  20. FMX.StdCtrls,
  21. FMX.ListBox,
  22. FMX.Controls.Presentation,
  23. GXS.Graphics,
  24. Stage.TextureFormat,
  25. GXS.Texture,
  26. GXS.TextureImageEditors;
  27. type
  28. TTextureEditFrame = class(TFrame)
  29. LabelImage: TLabel;
  30. SBEditImage: TSpeedButton;
  31. CBMagFilter: TComboBox;
  32. LabelImageAlpha: TLabel;
  33. LabelTextureWrap: TLabel;
  34. CBMinFilter: TComboBox;
  35. CBTextureMode: TComboBox;
  36. LabelMagFilter: TLabel;
  37. LabelMinFilter: TLabel;
  38. CBTextureWrap: TComboBox;
  39. CBDisabled: TCheckBox;
  40. CBImageClass: TComboBox;
  41. CBImageAlpha: TComboBox;
  42. LabelFilterQuality: TLabel;
  43. CBFilteringQuality: TComboBox;
  44. LabelTextureMode: TLabel;
  45. procedure CBMagFilterChange(Sender: TObject);
  46. procedure CBMinFilterChange(Sender: TObject);
  47. procedure CBTextureModeChange(Sender: TObject);
  48. procedure CBTextureWrapChange(Sender: TObject);
  49. procedure CBDisabledClick(Sender: TObject);
  50. procedure SBEditImageClick(Sender: TObject);
  51. procedure CBImageClassChange(Sender: TObject);
  52. procedure CBImageAlphaChange(Sender: TObject);
  53. procedure CBFilteringQualityChange(Sender: TObject);
  54. private
  55. FTexture: TgxTexture;
  56. FOnChange: TNotifyEvent;
  57. Changeing: Boolean;
  58. protected
  59. procedure SetTexture(const val: TgxTexture);
  60. procedure DoOnChange; virtual;
  61. public
  62. constructor Create(AOwner: TComponent); override;
  63. destructor Destroy; override;
  64. property Texture: TgxTexture read FTexture write SetTexture;
  65. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  66. end;
  67. //=====================================================================
  68. implementation
  69. //=====================================================================
  70. {$R *.fmx}
  71. constructor TTextureEditFrame.Create(AOwner: TComponent);
  72. var
  73. I: Integer;
  74. begin
  75. inherited;
  76. FTexture := TgxTexture.Create(Self);
  77. SetTexture(FTexture);
  78. SetTextureImageClassesToStrings(CBImageClass.Items);
  79. for I := 0 to Integer(High(TgxTextureImageAlpha)) do
  80. CBImageAlpha.Items.Add(GetEnumName(TypeInfo(TgxTextureImageAlpha), I));
  81. for I := 0 to Integer(High(TgxMagFilter)) do
  82. CBMagFilter.Items.Add(GetEnumName(TypeInfo(TgxMagFilter), I));
  83. for I := 0 to Integer(High(TgxMinFilter)) do
  84. CBMinFilter.Items.Add(GetEnumName(TypeInfo(TgxMinFilter), I));
  85. for I := 0 to Integer(High(TglTextureFilteringQuality)) do
  86. CBFilteringQuality.Items.Add
  87. (GetEnumName(TypeInfo(TglTextureFilteringQuality), I));
  88. for I := 0 to Integer(High(TgxTextureMode)) do
  89. CBTextureMode.Items.Add(GetEnumName(TypeInfo(TgxTextureMode), I));
  90. for I := 0 to Integer(High(TgxTextureWrap)) do
  91. CBTextureWrap.Items.Add(GetEnumName(TypeInfo(TgxTextureWrap), I));
  92. end;
  93. destructor TTextureEditFrame.Destroy;
  94. begin
  95. FTexture.Free;
  96. inherited;
  97. end;
  98. procedure TTextureEditFrame.SetTexture(const val: TgxTexture);
  99. begin
  100. FTexture.Assign(val);
  101. Changeing := True;
  102. try
  103. with CBImageClass do
  104. ItemIndex := Items.IndexOfObject(Pointer(FTexture.Image.ClassType));
  105. CBImageAlpha.ItemIndex := Integer(FTexture.ImageAlpha);
  106. CBMagFilter.ItemIndex := Integer(FTexture.MagFilter);
  107. CBMinFilter.ItemIndex := Integer(FTexture.MinFilter);
  108. CBFilteringQuality.ItemIndex := Integer(FTexture.FilteringQuality);
  109. CBTextureMode.ItemIndex := Integer(FTexture.TextureMode);
  110. CBTextureWrap.ItemIndex := Integer(FTexture.TextureWrap);
  111. CBDisabled.IsChecked := FTexture.Disabled;
  112. finally
  113. Changeing := False;
  114. DoOnChange;
  115. end;
  116. end;
  117. procedure TTextureEditFrame.DoOnChange;
  118. begin
  119. if (not Changeing) and Assigned(FOnChange) then
  120. OnChange(Self);
  121. end;
  122. procedure TTextureEditFrame.CBImageClassChange(Sender: TObject);
  123. var
  124. tic: TgxTextureImageClass;
  125. ti: TgxTextureImage;
  126. begin
  127. if not Changeing then
  128. begin
  129. with CBImageClass do
  130. tic := TgxTextureImageClass(Items.Objects[ItemIndex]);
  131. if FTexture.Image.ClassType <> tic then
  132. begin
  133. ti := TgxTextureImageClass(tic).Create(FTexture);
  134. FTexture.Image := ti;
  135. ti.Free;
  136. end;
  137. DoOnChange;
  138. end;
  139. end;
  140. procedure TTextureEditFrame.CBImageAlphaChange(Sender: TObject);
  141. begin
  142. FTexture.ImageAlpha := TgxTextureImageAlpha(CBImageAlpha.ItemIndex);
  143. DoOnChange;
  144. end;
  145. procedure TTextureEditFrame.CBMagFilterChange(Sender: TObject);
  146. begin
  147. FTexture.MagFilter := TgxMagFilter(CBMagFilter.ItemIndex);
  148. DoOnChange;
  149. end;
  150. procedure TTextureEditFrame.CBMinFilterChange(Sender: TObject);
  151. begin
  152. FTexture.MinFilter := TgxMinFilter(CBMinFilter.ItemIndex);
  153. DoOnChange;
  154. end;
  155. procedure TTextureEditFrame.CBTextureModeChange(Sender: TObject);
  156. begin
  157. FTexture.TextureMode := TgxTextureMode(CBTextureMode.ItemIndex);
  158. DoOnChange;
  159. end;
  160. procedure TTextureEditFrame.CBTextureWrapChange(Sender: TObject);
  161. begin
  162. FTexture.TextureWrap := TgxTextureWrap(CBTextureWrap.ItemIndex);
  163. DoOnChange;
  164. end;
  165. procedure TTextureEditFrame.CBDisabledClick(Sender: TObject);
  166. begin
  167. FTexture.Disabled := CBDisabled.IsChecked;
  168. DoOnChange;
  169. end;
  170. procedure TTextureEditFrame.SBEditImageClick(Sender: TObject);
  171. begin
  172. EditTextureImage(FTexture.Image);
  173. DoOnChange;
  174. end;
  175. procedure TTextureEditFrame.CBFilteringQualityChange(Sender: TObject);
  176. begin
  177. FTexture.FilteringQuality := TglTextureFilteringQuality
  178. (CBFilteringQuality.ItemIndex);
  179. DoOnChange;
  180. end;
  181. end.