fCgTexture.pas 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. unit fCgTexture;
  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. Imports.Cg,
  16. Imports.cgGL,
  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. SetGLSceneMediaDir();
  142. // load Cg proggy from project dir
  143. with CgShader1 do
  144. begin
  145. VertexProgram.LoadFromFile('Shaders\cg_texture_vp.cg');
  146. MemoVertCode.Lines.Assign(VertexProgram.Code);
  147. FragmentProgram.LoadFromFile('Shaders\cg_texture_fp.cg');
  148. MemoFragCode.Lines.Assign(FragmentProgram.Code);
  149. end;
  150. // Load images from media dir
  151. SetGLSceneMediaDir();
  152. with GLMatLib do
  153. begin
  154. Materials[0].Material.Texture.Image.LoadFromFile('moon.bmp');
  155. Materials[1].Material.Texture.Image.LoadFromFile('clover.jpg');
  156. Materials[2].Material.Texture.Image.LoadFromFile('marbletiles.jpg');
  157. Materials[3].Material.Texture.Image.LoadFromFile('chrome_buckle.bmp');
  158. end;
  159. end;
  160. procedure TFormCgTexture.CgShader1Initialize(CgShader: TCustomCgShader);
  161. begin
  162. // Due to parameter shadowing (ref. Cg Manual), parameters that doesn't change
  163. // once set can be assigned for once in the OnInitialize event.
  164. with CgShader1.FragmentProgram, GLMatLib do
  165. begin
  166. ParamByName('Map0').SetToTextureOf(Materials[0]);
  167. ParamByName('Map1').SetToTextureOf(Materials[1]);
  168. ParamByName('Map2').SetToTextureOf(Materials[2]);
  169. ParamByName('Map3').SetToTextureOf(Materials[3]);
  170. // Alternatively, you can set texture parameters using two other methods:
  171. // SetTexture('Map0', Materials[0].Material.Texture.Handle);
  172. // ParamByName('Map0').SetAsTexture2D(Materials[0].Material.Texture.Handle);
  173. end;
  174. // Display profiles used
  175. LabelVertProfile.Caption := 'Using profile: ' +
  176. CgShader1.VertexProgram.GetProfileStringA;
  177. LabelFragProfile.Caption := 'Using profile: ' +
  178. CgShader1.FragmentProgram.GetProfileStringA;
  179. end;
  180. procedure TFormCgTexture.CgShader1ApplyVP(CgProgram: TCgProgram; Sender: TObject);
  181. var
  182. v: TGLVector;
  183. function conv(TrackBar: TTrackBar): single;
  184. var
  185. half: Integer;
  186. begin
  187. half := TrackBar.Max div 2;
  188. result := (TrackBar.Position - half) / half;
  189. end;
  190. begin
  191. with CgProgram.ParamByName('ModelViewProj') do
  192. SetAsStateMatrix(CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  193. // Alternatively, you can set it using:
  194. // CgProgram.SetStateMatrix('ModelViewProj', CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  195. v := vectormake(conv(TrackBar1), conv(TrackBar2), conv(TrackBar3),
  196. conv(TrackBar4));
  197. CgProgram.ParamByName('shifts').SetAsVector(v);
  198. end;
  199. procedure TFormCgTexture.CgShader1ApplyFP(CgProgram: TCgProgram; Sender: TObject);
  200. var
  201. v: TGLVector;
  202. function conv(TrackBar: TTrackBar): single;
  203. var
  204. half: Integer;
  205. begin
  206. half := TrackBar.Max div 2;
  207. result := (TrackBar.Position - half) / half;
  208. end;
  209. begin
  210. with CgProgram do
  211. begin
  212. ParamByName('Map0').EnableTexture;
  213. ParamByName('Map1').EnableTexture;
  214. ParamByName('Map2').EnableTexture;
  215. ParamByName('Map3').EnableTexture;
  216. end;
  217. v := vectormake(conv(TrackBar5), conv(TrackBar6), conv(TrackBar7),
  218. conv(TrackBar8));
  219. CgProgram.ParamByName('weights').SetAsVector(v);
  220. end;
  221. procedure TFormCgTexture.CgShader1UnApplyFP(CgProgram: TCgProgram);
  222. begin
  223. with CgProgram do
  224. begin
  225. ParamByName('Map0').DisableTexture;
  226. ParamByName('Map1').DisableTexture;
  227. ParamByName('Map2').DisableTexture;
  228. ParamByName('Map3').DisableTexture;
  229. end;
  230. end;
  231. // Code below takes care of the UI
  232. procedure TFormCgTexture.CBVertexProgramClick(Sender: TObject);
  233. begin
  234. CgShader1.VertexProgram.Enabled := (Sender as TCheckBox).checked;
  235. end;
  236. procedure TFormCgTexture.CBFragmentProgramClick(Sender: TObject);
  237. begin
  238. CgShader1.FragmentProgram.Enabled := (Sender as TCheckBox).checked;
  239. end;
  240. procedure TFormCgTexture.ButtonApplyFPClick(Sender: TObject);
  241. begin
  242. CgShader1.FragmentProgram.Code := MemoFragCode.Lines;
  243. (Sender as TButton).Enabled := false;
  244. end;
  245. procedure TFormCgTexture.ButtonApplyVPClick(Sender: TObject);
  246. begin
  247. CgShader1.VertexProgram.Code := MemoVertCode.Lines;
  248. (Sender as TButton).Enabled := false;
  249. end;
  250. procedure TFormCgTexture.MemoFragCodeChange(Sender: TObject);
  251. begin
  252. ButtonApplyFP.Enabled := true;
  253. end;
  254. procedure TFormCgTexture.MemoVertCodeChange(Sender: TObject);
  255. begin
  256. ButtonApplyVP.Enabled := true;
  257. end;
  258. procedure TFormCgTexture.Button1Click(Sender: TObject);
  259. begin
  260. CgShader1.VertexProgram.ListParameters(Memo1.Lines);
  261. end;
  262. procedure TFormCgTexture.Button2Click(Sender: TObject);
  263. begin
  264. CgShader1.FragmentProgram.ListParameters(Memo3.Lines);
  265. end;
  266. procedure TFormCgTexture.Button3Click(Sender: TObject);
  267. begin
  268. CgShader1.FragmentProgram.ListCompilation(Memo3.Lines);
  269. end;
  270. procedure TFormCgTexture.Button4Click(Sender: TObject);
  271. begin
  272. CgShader1.VertexProgram.ListCompilation(Memo1.Lines);
  273. end;
  274. procedure TFormCgTexture.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  275. Shift: TShiftState; X, Y: Integer);
  276. begin
  277. mx := X;
  278. my := Y;
  279. end;
  280. procedure TFormCgTexture.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  281. X, Y: Integer);
  282. begin
  283. if Shift <> [] then
  284. begin
  285. GLCamera1.MoveAroundTarget(my - Y, mx - X);
  286. mx := X;
  287. my := Y;
  288. end;
  289. end;
  290. procedure TFormCgTexture.GLCadencer1Progress(Sender: TObject;
  291. const deltaTime, newTime: Double);
  292. begin
  293. GLSceneViewer1.Invalidate;
  294. end;
  295. procedure TFormCgTexture.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  296. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  297. begin
  298. with GLSceneViewer1 do
  299. if PtInRect(ClientRect, ScreenToClient(MousePos)) then
  300. begin
  301. GLCamera1.SceneScale := GLCamera1.SceneScale * (1000 - WheelDelta) / 1000;
  302. Handled := true;
  303. end;
  304. end;
  305. procedure TFormCgTexture.Timer1Timer(Sender: TObject);
  306. begin
  307. with GLSceneViewer1 do
  308. begin
  309. PanelFPS.Caption := Format('%.1f fps', [FramesPerSecond]);
  310. ResetPerformanceMonitor;
  311. end;
  312. end;
  313. procedure TFormCgTexture.FormKeyPress(Sender: TObject; var Key: Char);
  314. begin
  315. if Key = #27 then
  316. close;
  317. end;
  318. procedure TFormCgTexture.CheckBox2Click(Sender: TObject);
  319. begin
  320. CgShader1.Enabled := CheckBox2.checked;
  321. end;
  322. end.