GXS.TextureImageEditors.pas 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. //
  2. // The graphics engine GLXEngine. The unit of GXScene for Delphi
  3. //
  4. unit GXS.TextureImageEditors;
  5. (* Standard texture image editors for standard texture image classes *)
  6. interface
  7. {$I Stage.Defines.inc}
  8. uses
  9. System.Classes,
  10. System.SysUtils,
  11. GXS.Texture,
  12. GXS.ProcTextures,
  13. GXS.ImageUtils;
  14. type
  15. TgxTextureImageEditor = class(TObject)
  16. public
  17. (* Request to edit a textureImage.
  18. Returns True if changes have been made.
  19. This method may be invoked from the IDE or at run-time. *)
  20. class function Edit(aTexImage: TgxTextureImage): Boolean; virtual; abstract;
  21. end;
  22. TgxTextureImageEditorClass = class of TgxTextureImageEditor;
  23. TgxBlankTIE = class(TgxTextureImageEditor)
  24. public
  25. class function Edit(aTexImage: TgxTextureImage): Boolean; override;
  26. end;
  27. TgxPersistentTIE = class(TgxTextureImageEditor)
  28. public
  29. class function Edit(aTexImage: TgxTextureImage): Boolean; override;
  30. end;
  31. TgxPicFileTIE = class(TgxTextureImageEditor)
  32. public
  33. class function Edit(aTexImage: TgxTextureImage): Boolean; override;
  34. end;
  35. TgxProcTextureNoiseTIE = class(TgxTextureImageEditor)
  36. public
  37. class function Edit(aTexImage: TgxTextureImage): Boolean; override;
  38. end;
  39. // Invokes the editor for the given TgxTextureImage
  40. function EditTextureImage(aTexImage: TgxTextureImage): Boolean;
  41. procedure RegisterTextureImageEditor(aTexImageClass: TgxTextureImageClass;
  42. texImageEditor: TgxTextureImageEditorClass);
  43. procedure UnRegisterTextureImageEditor(texImageEditor
  44. : TgxTextureImageEditorClass);
  45. // ------------------------------------------------------------------------------
  46. implementation
  47. // ------------------------------------------------------------------------------
  48. var
  49. vTIEClass, vTIEEditor: TList;
  50. function EditTextureImage(aTexImage: TgxTextureImage): Boolean;
  51. var
  52. i: Integer;
  53. editor: TgxTextureImageEditorClass;
  54. begin
  55. if Assigned(vTIEClass) then
  56. begin
  57. i := vTIEClass.IndexOf(Pointer(aTexImage.ClassType));
  58. if i >= 0 then
  59. begin
  60. editor := TgxTextureImageEditorClass(vTIEEditor[i]);
  61. Result := editor.Edit(aTexImage);
  62. Exit;
  63. end;
  64. end;
  65. InformationDlg(aTexImage.ClassName + ': editing not supported.');
  66. Result := False;
  67. end;
  68. procedure RegisterTextureImageEditor(aTexImageClass: TgxTextureImageClass;
  69. texImageEditor: TgxTextureImageEditorClass);
  70. begin
  71. if not Assigned(vTIEClass) then
  72. begin
  73. vTIEClass := TList.Create;
  74. vTIEEditor := TList.Create;
  75. end;
  76. vTIEClass.Add(Pointer(aTexImageClass));
  77. vTIEEditor.Add(texImageEditor);
  78. end;
  79. procedure UnRegisterTextureImageEditor(texImageEditor
  80. : TgxTextureImageEditorClass);
  81. var
  82. i: Integer;
  83. begin
  84. if Assigned(vTIEClass) then
  85. begin
  86. i := vTIEEditor.IndexOf(texImageEditor);
  87. if i >= 0 then
  88. begin
  89. vTIEClass.Delete(i);
  90. vTIEEditor.Delete(i);
  91. end;
  92. end;
  93. end;
  94. // ------------------
  95. // ------------------ TgxBlankTIE ------------------
  96. // ------------------
  97. class function TgxBlankTIE.Edit(aTexImage: TgxTextureImage): Boolean;
  98. var
  99. p1, p2: Integer;
  100. buf, part: String;
  101. texImage: TgxBlankImage;
  102. begin
  103. texImage := (aTexImage as TgxBlankImage);
  104. if texImage.Depth = 0 then
  105. buf := InputDlg('Blank Image', 'Enter size',
  106. Format('%d x %d', [texImage.Width, texImage.Height]))
  107. else
  108. buf := InputDlg('Blank Image', 'Enter size',
  109. Format('%d x %d x %d', [texImage.Width, texImage.Height,
  110. texImage.Depth]));
  111. p1 := Pos('x', buf);
  112. if p1 > 0 then
  113. begin
  114. texImage.Width := StrToIntDef(Trim(Copy(buf, 1, p1 - 1)), 256);
  115. part := Copy(buf, p1 + 1, MaxInt);
  116. p2 := Pos('x', part);
  117. if p2 > 0 then
  118. begin
  119. texImage.Height := StrToIntDef(Trim(Copy(part, 1, p2 - 1)), 256);
  120. texImage.Depth := StrToIntDef(Trim(Copy(part, p2 + 1, MaxInt)), 1)
  121. end
  122. else
  123. begin
  124. texImage.Height := StrToIntDef(Trim(Copy(buf, p1 + 1, MaxInt)), 256);
  125. texImage.Depth := 0;
  126. end;
  127. Result := True;
  128. end
  129. else
  130. begin
  131. InformationDlg('Invalid size');
  132. Result := False;
  133. end;
  134. end;
  135. // ------------------
  136. // ------------------ TgxPersistentTIE ------------------
  137. // ------------------
  138. class function TgxPersistentTIE.Edit(aTexImage: TgxTextureImage): Boolean;
  139. var
  140. fName: String;
  141. begin
  142. fName := '';
  143. Result := OpenPictureDialog(fName);
  144. if Result then
  145. begin
  146. aTexImage.LoadFromFile(fName);
  147. aTexImage.NotifyChange(aTexImage);
  148. end;
  149. end;
  150. // ------------------
  151. // ------------------ TgxPicFileTIE ------------------
  152. // ------------------
  153. class function TgxPicFileTIE.Edit(aTexImage: TgxTextureImage): Boolean;
  154. var
  155. newName: String;
  156. texImage: TgxPicFileImage;
  157. begin
  158. { TODO : A better TgxPicFileImage.Edit is needed... }
  159. texImage := (aTexImage as TgxPicFileImage);
  160. newName := InputDlg('PicFile Image', 'Enter filename',
  161. texImage.PictureFileName);
  162. Result := (texImage.PictureFileName <> newName);
  163. if Result then
  164. texImage.PictureFileName := newName
  165. end;
  166. class function TgxProcTextureNoiseTIE.Edit(aTexImage: TgxTextureImage): Boolean;
  167. var
  168. p: Integer;
  169. buf: String;
  170. begin
  171. with aTexImage as TgxProcTextureNoise do
  172. begin
  173. buf := InputDlg(TgxProcTextureNoise.FriendlyName, 'Enter size',
  174. Format('%d x %d', [Width, Height]));
  175. p := Pos('x', buf);
  176. if p > 0 then
  177. begin
  178. Width := StrToIntDef(Trim(Copy(buf, 1, p - 1)), 256);
  179. Height := StrToIntDef(Trim(Copy(buf, p + 1, MaxInt)), 256);
  180. buf := InputDlg(TgxProcTextureNoise.FriendlyName, 'Minimum Cut',
  181. IntToStr(MinCut));
  182. MinCut := StrToIntDef(buf, 0);
  183. buf := InputDlg(TgxProcTextureNoise.FriendlyName, 'Noise Sharpness',
  184. FloatToStr(NoiseSharpness));
  185. NoiseSharpness := StrToFloatDef(buf, 0.9);
  186. buf := InputDlg(TgxProcTextureNoise.FriendlyName, 'Random Seed',
  187. IntToStr(NoiseRandSeed));
  188. NoiseRandSeed := StrToIntDef(buf, 0);
  189. RandSeed := NoiseRandSeed;
  190. buf := InputDlg(TgxProcTextureNoise.FriendlyName,
  191. 'Generate Seamless Texture (0,1)', IntToStr(Ord(Seamless)));
  192. Seamless := (buf <> '0');
  193. Result := True;
  194. Invalidate;
  195. end
  196. else
  197. begin
  198. InformationDlg('Invalid size');
  199. Result := False;
  200. end;
  201. end;
  202. end;
  203. // ------------------------------------------------------------------
  204. initialization
  205. // ------------------------------------------------------------------
  206. RegisterTextureImageEditor(TgxBlankImage, TgxBlankTIE);
  207. RegisterTextureImageEditor(TgxPersistentImage, TgxPersistentTIE);
  208. RegisterTextureImageEditor(TgxPicFileImage, TgxPicFileTIE);
  209. RegisterTextureImageEditor(TgxProcTextureNoise, TgxProcTextureNoiseTIE);
  210. finalization
  211. UnRegisterTextureImageEditor(TgxBlankTIE);
  212. UnRegisterTextureImageEditor(TgxPersistentTIE);
  213. UnRegisterTextureImageEditor(TgxPicFileTIE);
  214. UnRegisterTextureImageEditor(TgxProcTextureNoiseTIE);
  215. FreeAndNil(vTIEClass);
  216. FreeAndNil(vTIEEditor);
  217. end.