FmShaderUniformEditor.pas 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. //
  2. // The graphics engine GLScene
  3. //
  4. unit FmShaderUniformEditor;
  5. (* Uniform editor for shaders *)
  6. interface
  7. {$I Stage.Defines.inc}
  8. uses
  9. System.SysUtils,
  10. System.Variants,
  11. System.Classes,
  12. VCL.Graphics,
  13. VCL.Controls,
  14. VCL.Forms,
  15. VCL.Dialogs,
  16. VCL.StdCtrls,
  17. VCL.ExtCtrls,
  18. VCL.Buttons,
  19. Stage.Strings,
  20. GLSL.ShaderParameter,
  21. Stage.TextureFormat,
  22. Stage.VectorGeometry;
  23. type
  24. TGLShaderUniformEditor = class(TForm)
  25. LBUniforms: TListBox;
  26. Labe1: TLabel;
  27. AutoSetBox: TComboBox;
  28. SamplerBox: TComboBox;
  29. Panel1: TPanel;
  30. RedGroup: TRadioGroup;
  31. GreenGroup: TRadioGroup;
  32. BlueGroup: TRadioGroup;
  33. AlphaGroup: TRadioGroup;
  34. Label1: TLabel;
  35. Label2: TLabel;
  36. Label3: TLabel;
  37. Label4: TLabel;
  38. TextureBox: TComboBox;
  39. Button1: TButton;
  40. procedure FormDestroy(Sender: TObject);
  41. procedure LBUniformsClick(Sender: TObject);
  42. procedure ColorGroupClick(Sender: TObject);
  43. procedure AutoSetBoxChange(Sender: TObject);
  44. procedure TextureBoxChange(Sender: TObject);
  45. procedure SamplerBoxChange(Sender: TObject);
  46. procedure LBUniformsKeyPress(Sender: TObject; var Key: Char);
  47. private
  48. FUniformList: array of IShaderParameter;
  49. public
  50. procedure Clear;
  51. procedure AddTextureName(const S: string);
  52. procedure AddSamplerName(const S: string);
  53. procedure AddUniform(AValue: IShaderParameter);
  54. procedure Execute;
  55. end;
  56. function GLShaderUniformEditor: TGLShaderUniformEditor;
  57. procedure ReleaseShaderUniformEditor;
  58. //-----------------------------------------------------------------
  59. implementation
  60. //-----------------------------------------------------------------
  61. {$R *.dfm}
  62. var
  63. vGLShaderUniformEditor: TGLShaderUniformEditor;
  64. function GLShaderUniformEditor: TGLShaderUniformEditor;
  65. begin
  66. if not Assigned(vGLShaderUniformEditor) then
  67. vGLShaderUniformEditor := TGLShaderUniformEditor.Create(nil);
  68. Result := vGLShaderUniformEditor;
  69. end;
  70. procedure ReleaseShaderUniformEditor;
  71. begin
  72. if Assigned(vGLShaderUniformEditor) then
  73. begin
  74. vGLShaderUniformEditor.Free;
  75. vGLShaderUniformEditor := nil;
  76. end;
  77. end;
  78. //-----------------------------
  79. // TShaderUniformEditor
  80. //-----------------------------
  81. procedure TGLShaderUniformEditor.AddUniform(AValue: IShaderParameter);
  82. begin
  83. if AValue <> nil then
  84. begin
  85. SetLength(FUniformList, Length(FUniformList)+1);
  86. FUniformList[High(FUniformList)] := AValue;
  87. end;
  88. end;
  89. procedure TGLShaderUniformEditor.AutoSetBoxChange(Sender: TObject);
  90. begin
  91. if LBUniforms.ItemIndex >= 0 then
  92. begin
  93. FUniformList[LBUniforms.ItemIndex].AutoSetMethod := AutoSetBox.Items[AutoSetBox.ItemIndex];
  94. end;
  95. end;
  96. procedure TGLShaderUniformEditor.Clear;
  97. var
  98. I: Integer;
  99. begin
  100. for I := 0 to High(FUniformList) do
  101. FUniformList[I] := nil;
  102. SetLength(FUniformList, 0);
  103. LBUniforms.Items.Clear;
  104. LBUniforms.ItemIndex := -1;
  105. AutoSetBox.Items.Clear;
  106. TextureBox.Items.Clear;
  107. SamplerBox.Items.Clear;
  108. AutoSetBox.Items.Add(strNothing);
  109. TextureBox.Items.Add(strNothing);
  110. SamplerBox.Items.Add(strNothing);
  111. AutoSetBox.ItemIndex := 0;
  112. TextureBox.ItemIndex := 0;
  113. SamplerBox.ItemIndex := 0;
  114. RedGroup.ItemIndex := -1;
  115. GreenGroup.ItemIndex := -1;
  116. BlueGroup.ItemIndex := -1;
  117. AlphaGroup.ItemIndex := -1;
  118. end;
  119. procedure TGLShaderUniformEditor.Execute;
  120. var
  121. I: Integer;
  122. str: AnsiString;
  123. begin
  124. for I := 0 to High(FUniformList) do
  125. begin
  126. if FUniformList[I].GLSLType <> GLSLTypeUndefined then
  127. str := cGLSLTypeString[FUniformList[I].GLSLType];
  128. if FUniformList[I].GLSLSamplerType <> GLSLSamplerUndefined then
  129. str := cGLSLSamplerString[FUniformList[I].GLSLSamplerType];
  130. LBUniforms.Items.Add(FUniformList[I].Name+': '+string(str));
  131. end;
  132. ShowModal;
  133. end;
  134. procedure TGLShaderUniformEditor.FormDestroy(Sender: TObject);
  135. begin
  136. FUniformList := nil;
  137. end;
  138. procedure TGLShaderUniformEditor.LBUniformsClick(Sender: TObject);
  139. var
  140. SV: TglSwizzleVector;
  141. IParam: IShaderParameter;
  142. begin
  143. if LBUniforms.ItemIndex >= 0 then
  144. begin
  145. AutoSetBox.Items.Clear;
  146. AutoSetBox.Items.Add(strNothing);
  147. IParam := FUniformList[LBUniforms.ItemIndex];
  148. if IParam.GLSLSamplerType <> GLSLSamplerUndefined then
  149. begin
  150. FillUniformAutoSetMethodList(AutoSetBox.Items, IParam.GLSLSamplerType);
  151. AutoSetBox.ItemIndex :=
  152. MaxInteger(AutoSetBox.Items.IndexOf(IParam.AutoSetMethod), 0);
  153. TextureBox.Enabled := True;
  154. SamplerBox.Enabled := True;
  155. TextureBox.ItemIndex :=
  156. MaxInteger(TextureBox.Items.IndexOf(IParam.TextureName), 0);
  157. SamplerBox.ItemIndex :=
  158. MaxInteger(SamplerBox.Items.IndexOf(IParam.SamplerName), 0);
  159. SV := IParam.GetTextureSwizzle;
  160. RedGroup.ItemIndex := Ord(SV[0]);
  161. GreenGroup.ItemIndex := Ord(SV[1]);
  162. BlueGroup.ItemIndex := Ord(SV[2]);
  163. AlphaGroup.ItemIndex := Ord(SV[3]);
  164. end
  165. else
  166. begin
  167. TextureBox.Enabled := False;
  168. SamplerBox.Enabled := False;
  169. FillUniformAutoSetMethodList(AutoSetBox.Items, IParam.GLSLType);
  170. AutoSetBox.ItemIndex :=
  171. MaxInteger(AutoSetBox.Items.IndexOf(IParam.AutoSetMethod), 0);
  172. RedGroup.ItemIndex := -1;
  173. GreenGroup.ItemIndex := -1;
  174. BlueGroup.ItemIndex := -1;
  175. AlphaGroup.ItemIndex := -1;
  176. end;
  177. end;
  178. end;
  179. procedure TGLShaderUniformEditor.LBUniformsKeyPress(Sender: TObject; var Key: Char);
  180. begin
  181. LBUniformsClick(Self);
  182. end;
  183. procedure TGLShaderUniformEditor.SamplerBoxChange(Sender: TObject);
  184. begin
  185. if LBUniforms.ItemIndex >= 0 then
  186. begin
  187. FUniformList[LBUniforms.ItemIndex].SamplerName :=
  188. SamplerBox.Items[SamplerBox.ItemIndex];
  189. end;
  190. end;
  191. procedure TGLShaderUniformEditor.TextureBoxChange(Sender: TObject);
  192. begin
  193. if LBUniforms.ItemIndex >= 0 then
  194. begin
  195. FUniformList[LBUniforms.ItemIndex].TextureName :=
  196. TextureBox.Items[TextureBox.ItemIndex];
  197. end;
  198. end;
  199. procedure TGLShaderUniformEditor.ColorGroupClick(Sender: TObject);
  200. var
  201. SV: TglSwizzleVector;
  202. begin
  203. if LBUniforms.ItemIndex >= 0 then
  204. begin
  205. if FUniformList[LBUniforms.ItemIndex].GLSLSamplerType = GLSLSamplerUndefined then
  206. exit;
  207. SV := FUniformList[LBUniforms.ItemIndex].GetTextureSwizzle;
  208. SV[TRadioGroup(Sender).Tag] := TGLTextureSwizzle(TRadioGroup(Sender).ItemIndex);
  209. FUniformList[LBUniforms.ItemIndex].SetTextureSwizzle(SV);
  210. end;
  211. end;
  212. procedure TGLShaderUniformEditor.AddTextureName(const S: string);
  213. begin
  214. TextureBox.Items.Add(S);
  215. end;
  216. procedure TGLShaderUniformEditor.AddSamplerName(const S: string);
  217. begin
  218. SamplerBox.Items.Add(S);
  219. end;
  220. //---------------------------------
  221. initialization
  222. //---------------------------------
  223. finalization
  224. ReleaseShaderUniformEditor;
  225. end.