FRTextureEdit.pas 5.5 KB

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