fReflectD.pas 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. unit fReflectD;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. Winapi.Windows,
  6. Winapi.Messages,
  7. System.SysUtils,
  8. System.Variants,
  9. System.Classes,
  10. Vcl.Graphics,
  11. Vcl.Controls,
  12. Vcl.Forms,
  13. Vcl.Dialogs,
  14. Vcl.ExtCtrls,
  15. Vcl.StdCtrls,
  16. Vcl.ComCtrls,
  17. Vcl.Buttons,
  18. Vcl.Imaging.Jpeg,
  19. Cg.Import,
  20. Cg.GL,
  21. GLS.Scene,
  22. GLS.Objects,
  23. GLS.SceneViewer,
  24. GLS.Texture,
  25. GLS.CgShader,
  26. GLS.VectorGeometry,
  27. GLS.Cadencer,
  28. GLS.VectorFileObjects,
  29. GLS.File3DS,
  30. GLS.Graph,
  31. GLS.VectorTypes,
  32. GLS.GeomObjects,
  33. GLS.Material,
  34. GLS.Coordinates,
  35. GLS.Utils,
  36. GLS.BaseClasses;
  37. type
  38. TForm1 = class(TForm)
  39. GLScene1: TGLScene;
  40. GLCamera1: TGLCamera;
  41. GLLightSource1: TGLLightSource;
  42. GLMaterialLibrary1: TGLMaterialLibrary;
  43. GLCadencer1: TGLCadencer;
  44. CgShader1: TCgShader;
  45. Panel1: TPanel;
  46. PageControl1: TPageControl;
  47. TabSheet1: TTabSheet;
  48. TabSheet2: TTabSheet;
  49. Splitter1: TSplitter;
  50. Panel2: TPanel;
  51. CBVertexProgram: TCheckBox;
  52. LabelVertProfile: TLabel;
  53. Panel4: TPanel;
  54. LabelFragProfile: TLabel;
  55. CheckBox1: TCheckBox;
  56. Splitter2: TSplitter;
  57. Panel6: TPanel;
  58. Panel7: TPanel;
  59. MemoFragCode: TMemo;
  60. Panel8: TPanel;
  61. Memo3: TMemo;
  62. Panel3: TPanel;
  63. ButtonApplyFP: TButton;
  64. Panel11: TPanel;
  65. Panel12: TPanel;
  66. MemoVertCode: TMemo;
  67. Panel13: TPanel;
  68. ButtonApplyVP: TButton;
  69. Splitter3: TSplitter;
  70. Button2: TButton;
  71. Button3: TButton;
  72. Label1: TLabel;
  73. Panel5: TPanel;
  74. Label2: TLabel;
  75. Memo1: TMemo;
  76. Button1: TButton;
  77. Button4: TButton;
  78. Panel9: TPanel;
  79. Panel10: TPanel;
  80. GLSceneViewer1: TGLSceneViewer;
  81. Timer1: TTimer;
  82. plane: TGLFreeForm;
  83. GLTorus1: TGLTorus;
  84. GLMemoryViewer1: TGLMemoryViewer;
  85. GLCamera2: TGLCamera;
  86. GLDummyCube1: TGLDummyCube;
  87. bottom: TGLPlane;
  88. top: TGLPlane;
  89. back: TGLPlane;
  90. left: TGLPlane;
  91. right: TGLPlane;
  92. front: TGLPlane;
  93. GLSphere1: TGLSphere;
  94. TabSheet3: TTabSheet;
  95. TrackBar1: TTrackBar;
  96. GLDummyCube2: TGLDummyCube;
  97. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  98. Shift: TShiftState; X, Y: Integer);
  99. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  100. X, Y: Integer);
  101. procedure GLCadencer1Progress(Sender: TObject;
  102. const deltaTime, newTime: Double);
  103. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  104. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  105. procedure FormCreate(Sender: TObject);
  106. procedure CBVertexProgramClick(Sender: TObject);
  107. procedure CBFragmentProgramClick(Sender: TObject);
  108. procedure ButtonApplyFPClick(Sender: TObject);
  109. procedure MemoFragCodeChange(Sender: TObject);
  110. procedure MemoVertCodeChange(Sender: TObject);
  111. procedure Button1Click(Sender: TObject);
  112. procedure Button2Click(Sender: TObject);
  113. procedure Button3Click(Sender: TObject);
  114. procedure Button4Click(Sender: TObject);
  115. procedure ButtonApplyVPClick(Sender: TObject);
  116. procedure Timer1Timer(Sender: TObject);
  117. procedure FormKeyPress(Sender: TObject; var Key: Char);
  118. procedure CgShader1Initialize(Sender: TCustomCgShader);
  119. procedure TrackBar1Change(Sender: TObject);
  120. procedure CgShader1UnApplyFragmentProgram(Sender: TCgProgram);
  121. procedure CgShader1ApplyFP(CgProgram: TCgProgram; Sender: TObject);
  122. procedure CgShader1ApplyVP(CgProgram: TCgProgram; Sender: TObject);
  123. private
  124. procedure CreateCubeMap;
  125. public
  126. mx, my: Integer;
  127. end;
  128. var
  129. Form1: TForm1;
  130. ref: single;
  131. implementation
  132. {$R *.dfm}
  133. procedure TForm1.FormCreate(Sender: TObject);
  134. begin
  135. var Path: TFileName := GetCurrentAssetPath();
  136. SetCurrentDir(Path + '\model');
  137. // load a flat plane model for the water FreeForm
  138. plane.LoadFromFile('plane.3ds');
  139. // Load Cg shaders for proggy
  140. SetCurrentDir(Path + '\shader');
  141. with CgShader1 do
  142. begin
  143. VertexProgram.LoadFromFile('reflect_vp.cg');
  144. MemoVertCode.Lines.Assign(VertexProgram.Code);
  145. FragmentProgram.LoadFromFile('reflect_fp.cg');
  146. MemoFragCode.Lines.Assign(FragmentProgram.Code);
  147. VertexProgram.Enabled := false;
  148. FragmentProgram.Enabled := false;
  149. end;
  150. ButtonApplyFP.Enabled := false;
  151. ButtonApplyVP.Enabled := false;
  152. ref := 0;
  153. CreateCubeMap;
  154. end;
  155. procedure TForm1.CgShader1ApplyFP(CgProgram: TCgProgram; Sender: TObject);
  156. begin
  157. with CgProgram, GLMaterialLibrary1 do
  158. begin
  159. ParamByName('reflectivity').SetAsScalar(ref); // float
  160. ParamByName('decalMap').SetAsTexture2D(materials[1].Material.Texture.Handle); // sampler2D
  161. ParamByName('decalMap').EnableTexture;
  162. ParamByName('environmentMap').SetAsTextureCUBE(materials[0].Material.Texture.Handle); // samplerCUBE
  163. ParamByName('environmentMap').EnableTexture;
  164. end;
  165. end;
  166. procedure TForm1.CgShader1ApplyVP(CgProgram: TCgProgram; Sender: TObject);
  167. begin
  168. with CgProgram do
  169. begin
  170. ParamByName('ModelViewProj').SetAsStateMatrix
  171. (CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  172. ParamByName('ModelView').SetAsStateMatrix(CG_GL_MODELVIEW_MATRIX,
  173. CG_GL_MATRIX_IDENTITY);
  174. ParamByName('ModelViewIT').SetAsStateMatrix(CG_GL_MODELVIEW_MATRIX,
  175. CG_GL_MATRIX_INVERSE_TRANSPOSE);
  176. // IT in ModelViewIT means Inversed and Transposed
  177. end;
  178. end;
  179. procedure TForm1.CgShader1UnApplyFragmentProgram(Sender: TCgProgram);
  180. begin
  181. with Sender do
  182. begin
  183. ParamByName('decalMap').DisableTexture;
  184. ParamByName('environmentMap').DisableTexture;
  185. end;
  186. end;
  187. procedure TForm1.CreateCubeMap;
  188. begin
  189. GLDummyCube2.Visible := false;
  190. with GLMaterialLibrary1.materials[0].Material.Texture do
  191. begin
  192. ImageClassName := TGLCubeMapImage.ClassName;
  193. with Image as TGLCubeMapImage do
  194. begin
  195. GLMemoryViewer1.RenderCubeMapTextures(GLMaterialLibrary1.materials[0]
  196. .Material.Texture);
  197. end;
  198. disabled := false;
  199. end;
  200. GLDummyCube2.Visible := true;
  201. end;
  202. procedure TForm1.CgShader1Initialize(Sender: TCustomCgShader);
  203. begin
  204. // Shows the profiles to be used. The latest support profiles would be detected
  205. // if you have CgShader1.VertexProgram.Profile set to vpDetectLatest (similarly
  206. // for the fragment program).
  207. LabelVertProfile.Caption := 'Using profile: ' + 'Vertex Program';
  208. // Sender.VertexProgram.GetProfileString;
  209. LabelFragProfile.Caption := 'Using profile: ' + 'Fragment Program';
  210. // Sender.FragmentProgram.GetProfileString;
  211. end;
  212. procedure TForm1.CBVertexProgramClick(Sender: TObject);
  213. begin
  214. CgShader1.VertexProgram.Enabled := (Sender as TCheckBox).checked;
  215. end;
  216. procedure TForm1.CBFragmentProgramClick(Sender: TObject);
  217. begin
  218. CgShader1.FragmentProgram.Enabled := (Sender as TCheckBox).checked;
  219. end;
  220. procedure TForm1.ButtonApplyFPClick(Sender: TObject);
  221. begin
  222. CgShader1.FragmentProgram.Code := MemoFragCode.Lines;
  223. (Sender as TButton).Enabled := false;
  224. end;
  225. procedure TForm1.ButtonApplyVPClick(Sender: TObject);
  226. begin
  227. CgShader1.VertexProgram.Code := MemoVertCode.Lines;
  228. (Sender as TButton).Enabled := false;
  229. end;
  230. procedure TForm1.MemoFragCodeChange(Sender: TObject);
  231. begin
  232. ButtonApplyFP.Enabled := true;
  233. end;
  234. procedure TForm1.MemoVertCodeChange(Sender: TObject);
  235. begin
  236. ButtonApplyVP.Enabled := true;
  237. end;
  238. procedure TForm1.Button1Click(Sender: TObject);
  239. begin
  240. CgShader1.VertexProgram.ListParameters(Memo1.Lines);
  241. end;
  242. procedure TForm1.Button2Click(Sender: TObject);
  243. begin
  244. CgShader1.FragmentProgram.ListParameters(Memo3.Lines);
  245. end;
  246. procedure TForm1.Button3Click(Sender: TObject);
  247. begin
  248. CgShader1.FragmentProgram.ListCompilation(Memo3.Lines);
  249. end;
  250. procedure TForm1.Button4Click(Sender: TObject);
  251. begin
  252. CgShader1.VertexProgram.ListCompilation(Memo1.Lines);
  253. end;
  254. procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  255. Shift: TShiftState; X, Y: Integer);
  256. begin
  257. mx := X;
  258. my := Y;
  259. end;
  260. procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  261. X, Y: Integer);
  262. begin
  263. if Shift <> [] then
  264. begin
  265. GLCamera1.MoveAroundTarget(my - Y, mx - X);
  266. mx := X;
  267. my := Y;
  268. end;
  269. end;
  270. procedure TForm1.GLCadencer1Progress(Sender: TObject;
  271. const deltaTime, newTime: Double);
  272. begin
  273. GLSceneViewer1.Invalidate;
  274. end;
  275. procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  276. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  277. begin
  278. with GLSceneViewer1 do
  279. if PtInRect(ClientRect, ScreenToClient(MousePos)) then
  280. begin
  281. GLCamera1.SceneScale := GLCamera1.SceneScale * (1000 - WheelDelta) / 1000;
  282. Handled := true;
  283. end;
  284. end;
  285. procedure TForm1.Timer1Timer(Sender: TObject);
  286. begin
  287. Caption := Format('Cg Reflect - %.1f fps', [GLSceneViewer1.FramesPerSecond]);
  288. end;
  289. procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
  290. begin
  291. if Key = #27 then
  292. close;
  293. end;
  294. procedure TForm1.TrackBar1Change(Sender: TObject);
  295. begin
  296. with TrackBar1 do
  297. ref := position / max;
  298. end;
  299. end.