fCgTextureD.pas 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. unit fCgTextureD;
  2. interface
  3. uses
  4. System.SysUtils,
  5. System.Classes,
  6. System.Types,
  7. Vcl.Graphics,
  8. Vcl.Controls,
  9. Vcl.Forms,
  10. Vcl.Dialogs,
  11. Vcl.Imaging.Jpeg,
  12. Vcl.StdCtrls,
  13. Vcl.ExtCtrls,
  14. Vcl.ComCtrls,
  15. Cg.Import,
  16. Cg.GL,
  17. Cg.Shader,
  18. GLS.Scene,
  19. GLS.VectorTypes,
  20. GLS.Objects,
  21. GLS.SceneViewer,
  22. GLS.Texture,
  23. GLS.VectorGeometry,
  24. GLS.Cadencer,
  25. GLS.Graph,
  26. GLS.Material,
  27. GLS.Coordinates,
  28. GLS.Utils,
  29. GLS.BaseClasses;
  30. type
  31. TFormCgTexture = class(TForm)
  32. GLScene1: TGLScene;
  33. GLCamera1: TGLCamera;
  34. GLCadencer1: TGLCadencer;
  35. CgShader1: TCgShader;
  36. Panel1: TPanel;
  37. PageControl1: TPageControl;
  38. TabSheet1: TTabSheet;
  39. TabSheet2: TTabSheet;
  40. Splitter1: TSplitter;
  41. Panel2: TPanel;
  42. CBVertexProgram: TCheckBox;
  43. LabelVertProfile: TLabel;
  44. Panel4: TPanel;
  45. LabelFragProfile: TLabel;
  46. CBFragmentProgram: TCheckBox;
  47. Splitter2: TSplitter;
  48. Panel6: TPanel;
  49. Panel7: TPanel;
  50. MemoFragCode: TMemo;
  51. Panel8: TPanel;
  52. Memo3: TMemo;
  53. Panel3: TPanel;
  54. ButtonApplyFP: TButton;
  55. Panel11: TPanel;
  56. Panel12: TPanel;
  57. MemoVertCode: TMemo;
  58. Panel13: TPanel;
  59. ButtonApplyVP: TButton;
  60. Splitter3: TSplitter;
  61. Button2: TButton;
  62. Button3: TButton;
  63. Label1: TLabel;
  64. Panel5: TPanel;
  65. Label2: TLabel;
  66. Memo1: TMemo;
  67. Button1: TButton;
  68. Button4: TButton;
  69. Panel9: TPanel;
  70. PanelFPS: TPanel;
  71. GLSceneViewer1: TGLSceneViewer;
  72. Timer1: TTimer;
  73. GLXYZGrid1: TGLXYZGrid;
  74. GLPlane1: TGLPlane;
  75. GLMatLib: TGLMaterialLibrary;
  76. TabSheet3: TTabSheet;
  77. GroupBox1: TGroupBox;
  78. Label3: TLabel;
  79. TrackBar1: TTrackBar;
  80. Label4: TLabel;
  81. TrackBar2: TTrackBar;
  82. Label5: TLabel;
  83. TrackBar3: TTrackBar;
  84. Label6: TLabel;
  85. TrackBar4: TTrackBar;
  86. GroupBox2: TGroupBox;
  87. Label7: TLabel;
  88. Label8: TLabel;
  89. Label9: TLabel;
  90. Label10: TLabel;
  91. TrackBar5: TTrackBar;
  92. TrackBar6: TTrackBar;
  93. TrackBar7: TTrackBar;
  94. TrackBar8: TTrackBar;
  95. Label11: TLabel;
  96. Label12: TLabel;
  97. Label14: TLabel;
  98. Label13: TLabel;
  99. Label15: TLabel;
  100. Label16: TLabel;
  101. Label17: TLabel;
  102. Label18: TLabel;
  103. CheckBox2: TCheckBox;
  104. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  105. Shift: TShiftState; X, Y: Integer);
  106. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  107. X, Y: Integer);
  108. procedure GLCadencer1Progress(Sender: TObject;
  109. const deltaTime, newTime: Double);
  110. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  111. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  112. procedure FormCreate(Sender: TObject);
  113. procedure CBVertexProgramClick(Sender: TObject);
  114. procedure CBFragmentProgramClick(Sender: TObject);
  115. procedure ButtonApplyFPClick(Sender: TObject);
  116. procedure MemoFragCodeChange(Sender: TObject);
  117. procedure MemoVertCodeChange(Sender: TObject);
  118. procedure Button1Click(Sender: TObject);
  119. procedure Button2Click(Sender: TObject);
  120. procedure Button3Click(Sender: TObject);
  121. procedure Button4Click(Sender: TObject);
  122. procedure ButtonApplyVPClick(Sender: TObject);
  123. procedure Timer1Timer(Sender: TObject);
  124. procedure FormKeyPress(Sender: TObject; var Key: Char);
  125. procedure CgShader1ApplyVP(CgProgram: TCgProgram; Sender: TObject);
  126. procedure CgShader1ApplyFP(CgProgram: TCgProgram; Sender: TObject);
  127. procedure CgShader1UnApplyFP(CgProgram: TCgProgram);
  128. procedure CgShader1Initialize(CgShader: TCustomCgShader);
  129. procedure CheckBox2Click(Sender: TObject);
  130. public
  131. mx, my: Integer;
  132. end;
  133. var
  134. FormCgTexture: TFormCgTexture;
  135. //------------------------------------
  136. implementation
  137. //------------------------------------
  138. {$R *.dfm}
  139. procedure TFormCgTexture.FormCreate(Sender: TObject);
  140. begin
  141. var Path: TFileName := GetCurrentAssetPath();
  142. SetCurrentDir(Path + '\shader');
  143. // load Cg proggy from project dir
  144. with CgShader1 do
  145. begin
  146. VertexProgram.LoadFromFile('cg_texture_vp.cg');
  147. MemoVertCode.Lines.Assign(VertexProgram.Code);
  148. FragmentProgram.LoadFromFile('cg_texture_fp.cg');
  149. MemoFragCode.Lines.Assign(FragmentProgram.Code);
  150. end;
  151. // Load images from texture dir
  152. SetCurrentDir(Path + '\texture');
  153. with GLMatLib do
  154. begin
  155. Materials[0].Material.Texture.Image.LoadFromFile('moon.bmp');
  156. Materials[1].Material.Texture.Image.LoadFromFile('clover.jpg');
  157. Materials[2].Material.Texture.Image.LoadFromFile('marbletiles.jpg');
  158. Materials[3].Material.Texture.Image.LoadFromFile('earth.jpg');
  159. end;
  160. end;
  161. procedure TFormCgTexture.CgShader1Initialize(CgShader: TCustomCgShader);
  162. begin
  163. // Due to parameter shadowing (ref. Cg Manual), parameters that doesn't change
  164. // once set can be assigned for once in the OnInitialize event.
  165. with CgShader1.FragmentProgram, GLMatLib do
  166. begin
  167. ParamByName('Map0').SetToTextureOf(Materials[0]);
  168. ParamByName('Map1').SetToTextureOf(Materials[1]);
  169. ParamByName('Map2').SetToTextureOf(Materials[2]);
  170. ParamByName('Map3').SetToTextureOf(Materials[3]);
  171. // Alternatively, you can set texture parameters using two other methods:
  172. // SetTexture('Map0', Materials[0].Material.Texture.Handle);
  173. // ParamByName('Map0').SetAsTexture2D(Materials[0].Material.Texture.Handle);
  174. end;
  175. // Display profiles used
  176. LabelVertProfile.Caption := 'Using profile: ' +
  177. CgShader1.VertexProgram.GetProfileStringA;
  178. LabelFragProfile.Caption := 'Using profile: ' +
  179. CgShader1.FragmentProgram.GetProfileStringA;
  180. end;
  181. procedure TFormCgTexture.CgShader1ApplyVP(CgProgram: TCgProgram; Sender: TObject);
  182. var
  183. v: TGLVector;
  184. function conv(TrackBar: TTrackBar): single;
  185. var
  186. half: Integer;
  187. begin
  188. half := TrackBar.Max div 2;
  189. result := (TrackBar.Position - half) / half;
  190. end;
  191. begin
  192. with CgProgram.ParamByName('ModelViewProj') do
  193. SetAsStateMatrix(CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  194. // Alternatively, you can set it using:
  195. // CgProgram.SetStateMatrix('ModelViewProj', CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  196. v := vectormake(conv(TrackBar1), conv(TrackBar2), conv(TrackBar3),
  197. conv(TrackBar4));
  198. CgProgram.ParamByName('shifts').SetAsVector(v);
  199. end;
  200. procedure TFormCgTexture.CgShader1ApplyFP(CgProgram: TCgProgram; Sender: TObject);
  201. var
  202. v: TGLVector;
  203. function conv(TrackBar: TTrackBar): single;
  204. var
  205. half: Integer;
  206. begin
  207. half := TrackBar.Max div 2;
  208. result := (TrackBar.Position - half) / half;
  209. end;
  210. begin
  211. with CgProgram do
  212. begin
  213. ParamByName('Map0').EnableTexture;
  214. ParamByName('Map1').EnableTexture;
  215. ParamByName('Map2').EnableTexture;
  216. ParamByName('Map3').EnableTexture;
  217. end;
  218. v := vectormake(conv(TrackBar5), conv(TrackBar6), conv(TrackBar7),
  219. conv(TrackBar8));
  220. CgProgram.ParamByName('weights').SetAsVector(v);
  221. end;
  222. procedure TFormCgTexture.CgShader1UnApplyFP(CgProgram: TCgProgram);
  223. begin
  224. with CgProgram do
  225. begin
  226. ParamByName('Map0').DisableTexture;
  227. ParamByName('Map1').DisableTexture;
  228. ParamByName('Map2').DisableTexture;
  229. ParamByName('Map3').DisableTexture;
  230. end;
  231. end;
  232. // Code below takes care of the UI
  233. procedure TFormCgTexture.CBVertexProgramClick(Sender: TObject);
  234. begin
  235. CgShader1.VertexProgram.Enabled := (Sender as TCheckBox).checked;
  236. end;
  237. procedure TFormCgTexture.CBFragmentProgramClick(Sender: TObject);
  238. begin
  239. CgShader1.FragmentProgram.Enabled := (Sender as TCheckBox).checked;
  240. end;
  241. procedure TFormCgTexture.ButtonApplyFPClick(Sender: TObject);
  242. begin
  243. CgShader1.FragmentProgram.Code := MemoFragCode.Lines;
  244. (Sender as TButton).Enabled := false;
  245. end;
  246. procedure TFormCgTexture.ButtonApplyVPClick(Sender: TObject);
  247. begin
  248. CgShader1.VertexProgram.Code := MemoVertCode.Lines;
  249. (Sender as TButton).Enabled := false;
  250. end;
  251. procedure TFormCgTexture.MemoFragCodeChange(Sender: TObject);
  252. begin
  253. ButtonApplyFP.Enabled := true;
  254. end;
  255. procedure TFormCgTexture.MemoVertCodeChange(Sender: TObject);
  256. begin
  257. ButtonApplyVP.Enabled := true;
  258. end;
  259. procedure TFormCgTexture.Button1Click(Sender: TObject);
  260. begin
  261. CgShader1.VertexProgram.ListParameters(Memo1.Lines);
  262. end;
  263. procedure TFormCgTexture.Button2Click(Sender: TObject);
  264. begin
  265. CgShader1.FragmentProgram.ListParameters(Memo3.Lines);
  266. end;
  267. procedure TFormCgTexture.Button3Click(Sender: TObject);
  268. begin
  269. CgShader1.FragmentProgram.ListCompilation(Memo3.Lines);
  270. end;
  271. procedure TFormCgTexture.Button4Click(Sender: TObject);
  272. begin
  273. CgShader1.VertexProgram.ListCompilation(Memo1.Lines);
  274. end;
  275. procedure TFormCgTexture.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  276. Shift: TShiftState; X, Y: Integer);
  277. begin
  278. mx := X;
  279. my := Y;
  280. end;
  281. procedure TFormCgTexture.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  282. X, Y: Integer);
  283. begin
  284. if Shift <> [] then
  285. begin
  286. GLCamera1.MoveAroundTarget(my - Y, mx - X);
  287. mx := X;
  288. my := Y;
  289. end;
  290. end;
  291. procedure TFormCgTexture.GLCadencer1Progress(Sender: TObject;
  292. const deltaTime, newTime: Double);
  293. begin
  294. GLSceneViewer1.Invalidate;
  295. end;
  296. procedure TFormCgTexture.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  297. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  298. begin
  299. with GLSceneViewer1 do
  300. if PtInRect(ClientRect, ScreenToClient(MousePos)) then
  301. begin
  302. GLCamera1.SceneScale := GLCamera1.SceneScale * (1000 - WheelDelta) / 1000;
  303. Handled := true;
  304. end;
  305. end;
  306. procedure TFormCgTexture.Timer1Timer(Sender: TObject);
  307. begin
  308. with GLSceneViewer1 do
  309. begin
  310. PanelFPS.Caption := Format('%.1f fps', [FramesPerSecond]);
  311. ResetPerformanceMonitor;
  312. end;
  313. end;
  314. procedure TFormCgTexture.FormKeyPress(Sender: TObject; var Key: Char);
  315. begin
  316. if Key = #27 then
  317. close;
  318. end;
  319. procedure TFormCgTexture.CheckBox2Click(Sender: TObject);
  320. begin
  321. CgShader1.Enabled := CheckBox2.checked;
  322. end;
  323. end.