fCgSimpleD.pas 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. unit fCgSimpleD;
  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.StdCtrls,
  12. Vcl.ExtCtrls,
  13. Vcl.ComCtrls,
  14. Cg.Import,
  15. Cg.GL,
  16. Cg.Shader,
  17. GLS.Scene,
  18. GLScene.VectorTypes,
  19. GLS.Objects,
  20. GLS.SceneViewer,
  21. GLS.Texture,
  22. GLScene.VectorGeometry,
  23. GLS.Cadencer,
  24. GLS.VectorFileObjects,
  25. GLS.File3DS,
  26. GLS.Graph,
  27. GLS.Material,
  28. GLS.Coordinates,
  29. GLS.BaseClasses,
  30. GLScene.Utils;
  31. type
  32. TFormCgSimple = class(TForm)
  33. GLScene1: TGLScene;
  34. GLCamera1: TGLCamera;
  35. GLLightSource1: TGLLightSource;
  36. GLMaterialLibrary1: TGLMaterialLibrary;
  37. GLCadencer1: TGLCadencer;
  38. CgShader1: TCgShader;
  39. Panel1: TPanel;
  40. PageControl1: TPageControl;
  41. TabSheet1: TTabSheet;
  42. TabSheet2: TTabSheet;
  43. Splitter1: TSplitter;
  44. Panel2: TPanel;
  45. CBVertexProgram: TCheckBox;
  46. LabelVertProfile: TLabel;
  47. Panel4: TPanel;
  48. LabelFragProfile: TLabel;
  49. CBFragmentProgram: TCheckBox;
  50. Splitter2: TSplitter;
  51. Panel6: TPanel;
  52. Panel7: TPanel;
  53. MemoFragCode: TMemo;
  54. Panel8: TPanel;
  55. Memo3: TMemo;
  56. Panel3: TPanel;
  57. ButtonApplyFP: TButton;
  58. Panel11: TPanel;
  59. Panel12: TPanel;
  60. MemoVertCode: TMemo;
  61. Panel13: TPanel;
  62. ButtonApplyVP: TButton;
  63. Splitter3: TSplitter;
  64. Button2: TButton;
  65. Button3: TButton;
  66. Label1: TLabel;
  67. Panel5: TPanel;
  68. Label2: TLabel;
  69. Memo1: TMemo;
  70. Button1: TButton;
  71. Button4: TButton;
  72. GLFreeForm1: TGLFreeForm;
  73. Panel9: TPanel;
  74. PanelFPS: TPanel;
  75. GLSceneViewer1: TGLSceneViewer;
  76. Timer1: TTimer;
  77. GLXYZGrid1: TGLXYZGrid;
  78. GLDummyCube1: TGLDummyCube;
  79. procedure GLSceneViewer1MouseDown(Sender: TObject;
  80. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  81. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  82. X, Y: Integer);
  83. procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
  84. newTime: Double);
  85. procedure CgShader1ApplyVP(CgProgram: TCgProgram; Sender: TObject);
  86. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  87. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  88. procedure FormCreate(Sender: TObject);
  89. procedure CBVertexProgramClick(Sender: TObject);
  90. procedure CBFragmentProgramClick(Sender: TObject);
  91. procedure ButtonApplyFPClick(Sender: TObject);
  92. procedure MemoFragCodeChange(Sender: TObject);
  93. procedure MemoVertCodeChange(Sender: TObject);
  94. procedure Button1Click(Sender: TObject);
  95. procedure Button2Click(Sender: TObject);
  96. procedure Button3Click(Sender: TObject);
  97. procedure Button4Click(Sender: TObject);
  98. procedure ButtonApplyVPClick(Sender: TObject);
  99. procedure Timer1Timer(Sender: TObject);
  100. procedure FormKeyPress(Sender: TObject; var Key: Char);
  101. procedure CgShader1Initialize(CgShader: TCustomCgShader);
  102. private
  103. public
  104. mx, my : Integer;
  105. end;
  106. var
  107. FormCgSimple: TFormCgSimple;
  108. implementation
  109. {$R *.dfm}
  110. procedure TFormCgSimple.FormCreate(Sender: TObject);
  111. begin
  112. var Path: TFileName := GetCurrentAssetPath();
  113. SetCurrentDir(Path + '\shader');
  114. // Load Cg proggy
  115. with CgShader1 do begin
  116. VertexProgram.LoadFromFile('simple_vp.cg');
  117. MemoVertCode.Lines.Assign(VertexProgram.Code);
  118. FragmentProgram.LoadFromFile('simple_fp.cg');
  119. MemoFragCode.Lines.Assign(FragmentProgram.Code);
  120. VertexProgram.Enabled:=false;
  121. FragmentProgram.Enabled:=false;
  122. end;
  123. ButtonApplyFP.Enabled:=false;
  124. ButtonApplyVP.Enabled:=false;
  125. // Bind shader to the material
  126. GLMaterialLibrary1.Materials[0].Shader := CgShader1;
  127. // Load the teapot model.
  128. SetCurrentDir(Path + '\model');
  129. // Note that GLScene will alter the ModelView matrix
  130. // internally objects like TGLCylinder & TGLSphere, and Cg shader
  131. // is not aware of that. If you apply a vertex shader on those objects, they
  132. // would appear scaled and/or rotated.
  133. GLFreeForm1.LoadFromFile('Teapot.3ds');
  134. end;
  135. procedure TFormCgSimple.CgShader1ApplyVP(CgProgram: TCgProgram; Sender: TObject);
  136. var
  137. v : TGLVector;
  138. Param: TCgParameter;
  139. begin
  140. // rotate light vector for the "simple lighting" vertex program
  141. v := ZHmgVector;
  142. RotateVector(v, YVector, GLCadencer1.CurrentTime);
  143. Param := CgProgram.ParamByName('LightVec');
  144. Param.AsVector:=v;
  145. // or using plain Cg API: cgGLSetParameter4fv(Param.Handle, @v);
  146. // set uniform parameters that change every frame
  147. with CgProgram.ParamByName('ModelViewProj') do
  148. SetAsStateMatrix( CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  149. with CgProgram.ParamByName('ModelViewIT') do
  150. SetAsStateMatrix( CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_INVERSE_TRANSPOSE);
  151. // Or, using plain Cg API:
  152. // Param := CgProgram.ParamByName('ModelViewIT');
  153. // cgGLSetStateMatrixParameter(Param.Handle, CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_INVERSE_TRANSPOSE);
  154. end;
  155. procedure TFormCgSimple.CgShader1Initialize(CgShader: TCustomCgShader);
  156. begin
  157. // Shows the profiles to be used. The latest support profiles would be detected
  158. // if you have CgShader1.VertexProgram.Profile set to vpDetectLatest (similarly
  159. // for the fragment program).
  160. LabelVertProfile.Caption:='Using profile: ' + CgShader1.VertexProgram.GetProfileStringA;
  161. LabelFragProfile.Caption:='Using profile: ' + CgShader1.FragmentProgram.GetProfileStringA;
  162. end;
  163. procedure TFormCgSimple.CBVertexProgramClick(Sender: TObject);
  164. begin
  165. CgShader1.VertexProgram.Enabled:=(Sender as TCheckBox).checked;
  166. end;
  167. procedure TFormCgSimple.CBFragmentProgramClick(Sender: TObject);
  168. begin
  169. CgShader1.FragmentProgram.Enabled:=(Sender as TCheckBox).checked;
  170. end;
  171. procedure TFormCgSimple.ButtonApplyFPClick(Sender: TObject);
  172. begin
  173. CgShader1.FragmentProgram.Code:=MemoFragCode.Lines;
  174. (Sender as TButton).Enabled:=false;
  175. end;
  176. procedure TFormCgSimple.ButtonApplyVPClick(Sender: TObject);
  177. begin
  178. CgShader1.VertexProgram.Code:=MemoVertCode.Lines;
  179. (Sender as TButton).Enabled:=false;
  180. end;
  181. procedure TFormCgSimple.MemoFragCodeChange(Sender: TObject);
  182. begin
  183. ButtonApplyFP.Enabled:=true;
  184. end;
  185. procedure TFormCgSimple.MemoVertCodeChange(Sender: TObject);
  186. begin
  187. ButtonApplyVP.Enabled:=true;
  188. end;
  189. procedure TFormCgSimple.Button1Click(Sender: TObject);
  190. begin
  191. CgShader1.VertexProgram.ListParameters(Memo1.Lines);
  192. end;
  193. procedure TFormCgSimple.Button2Click(Sender: TObject);
  194. begin
  195. CgShader1.FragmentProgram.ListParameters(Memo3.Lines);
  196. end;
  197. procedure TFormCgSimple.Button3Click(Sender: TObject);
  198. begin
  199. CgShader1.FragmentProgram.ListCompilation(Memo3.Lines);
  200. end;
  201. procedure TFormCgSimple.Button4Click(Sender: TObject);
  202. begin
  203. CgShader1.VertexProgram.ListCompilation(Memo1.Lines);
  204. end;
  205. procedure TFormCgSimple.GLSceneViewer1MouseDown(Sender: TObject;
  206. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  207. begin
  208. mx:=X;
  209. my:=Y;
  210. end;
  211. procedure TFormCgSimple.GLSceneViewer1MouseMove(Sender: TObject;
  212. Shift: TShiftState; X, Y: Integer);
  213. begin
  214. if Shift<>[] then begin
  215. GLCamera1.MoveAroundTarget(my-y, mx-x);
  216. mx:=x;
  217. my:=y;
  218. end;
  219. end;
  220. procedure TFormCgSimple.GLCadencer1Progress(Sender: TObject; const deltaTime,
  221. newTime: Double);
  222. begin
  223. GLSceneViewer1.Invalidate;
  224. end;
  225. procedure TFormCgSimple.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  226. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  227. begin
  228. with GLSceneViewer1 do
  229. if PtInRect(ClientRect, ScreenToClient(MousePos)) then begin
  230. GLCamera1.SceneScale:=GLCamera1.SceneScale * (1000 - WheelDelta) / 1000;
  231. Handled:=true;
  232. end;
  233. end;
  234. procedure TFormCgSimple.Timer1Timer(Sender: TObject);
  235. begin
  236. with GLSceneViewer1 do begin
  237. PanelFPS.Caption:=Format('%.1f fps', [FramesPerSecond]);
  238. ResetPerformanceMonitor;
  239. end;
  240. end;
  241. procedure TFormCgSimple.FormKeyPress(Sender: TObject; var Key: Char);
  242. begin
  243. if Key=#27 then Close();
  244. end;
  245. end.