fCgTextureD.pas 9.7 KB

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