2
0

fCgSimple.pas 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. unit fCgSimple;
  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. Imports.cg,
  15. Imports.cgGL,
  16. Cg.Shader,
  17. GLS.Scene,
  18. GLS.VectorTypes,
  19. GLS.Objects,
  20. GLS.SceneViewer,
  21. GLS.Texture,
  22. GLS.VectorGeometry,
  23. GLS.Cadencer,
  24. GLS.VectorFileObjects,
  25. GLS.File3DS,
  26. GLS.Graph,
  27. GLS.Material,
  28. GLS.Coordinates,
  29. GLS.BaseClasses,
  30. GLS.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. SetGLSceneMediaDir();
  113. // Load Cg proggy
  114. with CgShader1 do begin
  115. VertexProgram.LoadFromFile('Shaders\simple_vp.cg');
  116. MemoVertCode.Lines.Assign(VertexProgram.Code);
  117. FragmentProgram.LoadFromFile('Shaders\simple_fp.cg');
  118. MemoFragCode.Lines.Assign(FragmentProgram.Code);
  119. VertexProgram.Enabled:=false;
  120. FragmentProgram.Enabled:=false;
  121. end;
  122. ButtonApplyFP.Enabled:=false;
  123. ButtonApplyVP.Enabled:=false;
  124. // Bind shader to the material
  125. GLMaterialLibrary1.Materials[0].Shader := CgShader1;
  126. // Load the teapot model from media directory.
  127. SetGLSceneMediaDir();
  128. // Note that GLScene will alter the ModelView matrix
  129. // internally for GLScene objects like TGLCylinder & TGLSphere, and Cg shader
  130. // is not aware of that. If you apply a vertex shader on those objects, they
  131. // would appear scaled and/or rotated.
  132. GLFreeForm1.LoadFromFile('Teapot.3ds');
  133. end;
  134. procedure TFormCgSimple.CgShader1ApplyVP(CgProgram: TCgProgram; Sender: TObject);
  135. var
  136. v : TGLVector;
  137. Param: TCgParameter;
  138. begin
  139. // rotate light vector for the "simple lighting" vertex program
  140. v := ZHmgVector;
  141. RotateVector(v, YVector, GLCadencer1.CurrentTime);
  142. Param := CgProgram.ParamByName('LightVec');
  143. Param.AsVector:=v;
  144. // or using plain Cg API: cgGLSetParameter4fv(Param.Handle, @v);
  145. // set uniform parameters that change every frame
  146. with CgProgram.ParamByName('ModelViewProj') do
  147. SetAsStateMatrix( CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  148. with CgProgram.ParamByName('ModelViewIT') do
  149. SetAsStateMatrix( CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_INVERSE_TRANSPOSE);
  150. // Or, using plain Cg API:
  151. // Param := CgProgram.ParamByName('ModelViewIT');
  152. // cgGLSetStateMatrixParameter(Param.Handle, CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_INVERSE_TRANSPOSE);
  153. end;
  154. procedure TFormCgSimple.CgShader1Initialize(CgShader: TCustomCgShader);
  155. begin
  156. // Shows the profiles to be used. The latest support profiles would be detected
  157. // if you have CgShader1.VertexProgram.Profile set to vpDetectLatest (similarly
  158. // for the fragment program).
  159. LabelVertProfile.Caption:='Using profile: ' + CgShader1.VertexProgram.GetProfileStringA;
  160. LabelFragProfile.Caption:='Using profile: ' + CgShader1.FragmentProgram.GetProfileStringA;
  161. end;
  162. procedure TFormCgSimple.CBVertexProgramClick(Sender: TObject);
  163. begin
  164. CgShader1.VertexProgram.Enabled:=(Sender as TCheckBox).checked;
  165. end;
  166. procedure TFormCgSimple.CBFragmentProgramClick(Sender: TObject);
  167. begin
  168. CgShader1.FragmentProgram.Enabled:=(Sender as TCheckBox).checked;
  169. end;
  170. procedure TFormCgSimple.ButtonApplyFPClick(Sender: TObject);
  171. begin
  172. CgShader1.FragmentProgram.Code:=MemoFragCode.Lines;
  173. (Sender as TButton).Enabled:=false;
  174. end;
  175. procedure TFormCgSimple.ButtonApplyVPClick(Sender: TObject);
  176. begin
  177. CgShader1.VertexProgram.Code:=MemoVertCode.Lines;
  178. (Sender as TButton).Enabled:=false;
  179. end;
  180. procedure TFormCgSimple.MemoFragCodeChange(Sender: TObject);
  181. begin
  182. ButtonApplyFP.Enabled:=true;
  183. end;
  184. procedure TFormCgSimple.MemoVertCodeChange(Sender: TObject);
  185. begin
  186. ButtonApplyVP.Enabled:=true;
  187. end;
  188. procedure TFormCgSimple.Button1Click(Sender: TObject);
  189. begin
  190. CgShader1.VertexProgram.ListParameters(Memo1.Lines);
  191. end;
  192. procedure TFormCgSimple.Button2Click(Sender: TObject);
  193. begin
  194. CgShader1.FragmentProgram.ListParameters(Memo3.Lines);
  195. end;
  196. procedure TFormCgSimple.Button3Click(Sender: TObject);
  197. begin
  198. CgShader1.FragmentProgram.ListCompilation(Memo3.Lines);
  199. end;
  200. procedure TFormCgSimple.Button4Click(Sender: TObject);
  201. begin
  202. CgShader1.VertexProgram.ListCompilation(Memo1.Lines);
  203. end;
  204. procedure TFormCgSimple.GLSceneViewer1MouseDown(Sender: TObject;
  205. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  206. begin
  207. mx:=X;
  208. my:=Y;
  209. end;
  210. procedure TFormCgSimple.GLSceneViewer1MouseMove(Sender: TObject;
  211. Shift: TShiftState; X, Y: Integer);
  212. begin
  213. if Shift<>[] then begin
  214. GLCamera1.MoveAroundTarget(my-y, mx-x);
  215. mx:=x;
  216. my:=y;
  217. end;
  218. end;
  219. procedure TFormCgSimple.GLCadencer1Progress(Sender: TObject; const deltaTime,
  220. newTime: Double);
  221. begin
  222. GLSceneViewer1.Invalidate;
  223. end;
  224. procedure TFormCgSimple.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  225. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  226. begin
  227. with GLSceneViewer1 do
  228. if PtInRect(ClientRect, ScreenToClient(MousePos)) then begin
  229. GLCamera1.SceneScale:=GLCamera1.SceneScale * (1000 - WheelDelta) / 1000;
  230. Handled:=true;
  231. end;
  232. end;
  233. procedure TFormCgSimple.Timer1Timer(Sender: TObject);
  234. begin
  235. with GLSceneViewer1 do begin
  236. PanelFPS.Caption:=Format('%.1f fps', [FramesPerSecond]);
  237. ResetPerformanceMonitor;
  238. end;
  239. end;
  240. procedure TFormCgSimple.FormKeyPress(Sender: TObject; var Key: Char);
  241. begin
  242. if Key=#27 then Close();
  243. end;
  244. end.