fPostShaderD.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. unit fPostShaderD;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. System.SysUtils,
  6. System.Classes,
  7. Vcl.Graphics,
  8. Vcl.Controls,
  9. Vcl.Forms,
  10. Vcl.CheckLst,
  11. Vcl.ExtCtrls,
  12. Vcl.StdCtrls,
  13. Vcl.ComCtrls,
  14. GLS.Texture,
  15. GLS.Cadencer,
  16. GLS.SceneViewer,
  17. GLS.Scene,
  18. GLS.Graph,
  19. GLS.Utils,
  20. GLS.Context,
  21. GLS.VectorGeometry,
  22. GLS.GeomObjects,
  23. GLS.Coordinates,
  24. GLS.Objects,
  25. GLS.VectorFileObjects,
  26. GLS.SimpleNavigation,
  27. GLS.Material,
  28. GLS.BaseClasses,
  29. GLSL.PostShaders,
  30. GLSL.PostEffects,
  31. GLS.CgPostTransformationShader,
  32. GLS.FileMD2,
  33. GLS.FileMS3D,
  34. GLS.File3DS;
  35. type
  36. TFormPostShader = class(TForm)
  37. Scene: TGLScene;
  38. Viewer: TGLSceneViewer;
  39. Cadencer: TGLCadencer;
  40. Camera: TGLCamera;
  41. Light: TGLLightSource;
  42. LightCube: TGLDummyCube;
  43. GLSphere1: TGLSphere;
  44. GLXYZGrid1: TGLXYZGrid;
  45. GLArrowLine1: TGLArrowLine;
  46. Panel1: TPanel;
  47. LightMovingCheckBox: TCheckBox;
  48. GUICube: TGLDummyCube;
  49. WorldCube: TGLDummyCube;
  50. actFighter: TGLActor;
  51. actTeapot: TGLActor;
  52. actSphere_big: TGLActor;
  53. actSphere_lit: TGLActor;
  54. MaterialLibrary: TGLMaterialLibrary;
  55. TurnPitchrollCheckBox: TCheckBox;
  56. Panel2: TPanel;
  57. ShaderCheckListBox: TCheckListBox;
  58. Label1: TLabel;
  59. GLSimpleNavigation1: TGLSimpleNavigation;
  60. PostShaderHolder: TGLPostShaderHolder;
  61. Label2: TLabel;
  62. tbBlurValue: TTrackBar;
  63. lblBlurValue: TLabel;
  64. tbThermalThreshold: TTrackBar;
  65. Label3: TLabel;
  66. lblThermalThreshold: TLabel;
  67. tbThermalIntensity: TTrackBar;
  68. Label5: TLabel;
  69. lblThermalIntensity: TLabel;
  70. Label4: TLabel;
  71. tblNightThreshold: TTrackBar;
  72. lblNight: TLabel;
  73. Label6: TLabel;
  74. lblNightAmplification: TLabel;
  75. tbNightAmplification: TTrackBar;
  76. Label7: TLabel;
  77. lblDreamThreshold: TLabel;
  78. tbDreamThreshold: TTrackBar;
  79. Label8: TLabel;
  80. lblPixelateWidth: TLabel;
  81. tbPixelateWidth: TTrackBar;
  82. Label9: TLabel;
  83. lblPixelateHeight: TLabel;
  84. tbPixelateHeight: TTrackBar;
  85. Label10: TLabel;
  86. tbPosterizeGamma: TTrackBar;
  87. lblPosterizeGamma: TLabel;
  88. Label12: TLabel;
  89. tbPosterizeColors: TTrackBar;
  90. lblPosterizeColors: TLabel;
  91. tbFrostRand: TTrackBar;
  92. Label11: TLabel;
  93. lblFrostRand: TLabel;
  94. tbFrostFactor: TTrackBar;
  95. Label14: TLabel;
  96. lblFrostFactor: TLabel;
  97. Label13: TLabel;
  98. lblTroubleWidth: TLabel;
  99. tbTroubleWidth: TTrackBar;
  100. Label16: TLabel;
  101. lblTroubleHeight: TLabel;
  102. tbTroubleHeight: TTrackBar;
  103. Label18: TLabel;
  104. lblTroubleFreq: TLabel;
  105. tbTroubleFreq: TTrackBar;
  106. procedure FormCreate(Sender: TObject);
  107. procedure CadencerProgress(Sender: TObject;
  108. const deltaTime, newTime: double);
  109. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  110. procedure LightCubeProgress(Sender: TObject;
  111. const deltaTime, newTime: double);
  112. procedure ShaderCheckListBoxClick(Sender: TObject);
  113. procedure tbBlurValueChange(Sender: TObject);
  114. procedure tbThermalThresholdChange(Sender: TObject);
  115. procedure tbThermalIntensityChange(Sender: TObject);
  116. procedure tblNightThresholdChange(Sender: TObject);
  117. procedure tbNightAmplificationChange(Sender: TObject);
  118. procedure tbDreamThresholdChange(Sender: TObject);
  119. procedure tbPixelateWidthChange(Sender: TObject);
  120. procedure tbPixelateHeightChange(Sender: TObject);
  121. procedure tbPosterizeGammaChange(Sender: TObject);
  122. procedure tbPosterizeColorsChange(Sender: TObject);
  123. procedure tbFrostRandChange(Sender: TObject);
  124. procedure tbFrostFactorChange(Sender: TObject);
  125. procedure tbTroubleWidthChange(Sender: TObject);
  126. procedure tbTroubleHeightChange(Sender: TObject);
  127. procedure tbTroubleFreqChange(Sender: TObject);
  128. end;
  129. var
  130. FormPostShader: TFormPostShader;
  131. //Shaders
  132. BlurShader: TGLSLPostBlurShader;
  133. ThermalVisionShader: TGLSLPostThermalVisionShader;
  134. TransformationShader: TGLCGPostTransformationShader;
  135. DreamVisionShader: TGLSLPostDreamVisionShader;
  136. NightVisionShader: TGLSLPostNightVisionShader;
  137. PosterizeShader: TGLSLPostPosterizeShader;
  138. FrostShader: TGLSLPostFrostShader;
  139. PixelateShader: TGLSLPostPixelateShader;
  140. TroubleShader: TGLSLPostTroubleShader;
  141. implementation
  142. {$R *.dfm}
  143. procedure TFormPostShader.FormCreate(Sender: TObject);
  144. begin
  145. // First load animated models with textures
  146. var Path: TFileName := GetCurrentAssetPath();
  147. SetCurrentDir(Path + '\modelext');
  148. actFighter.LoadFromFile('waste.md2'); // Fighter
  149. actFighter.SwitchToAnimation(0, True);
  150. actFighter.AnimationMode := aamLoop;
  151. actFighter.Scale.Scale(2);
  152. MaterialLibrary.LibMaterialByName('Fighter').Material.Texture.Image.LoadFromFile('Waste.jpg');
  153. // Loading static models
  154. SetCurrentDir(Path + '\model');
  155. actTeapot.LoadFromFile('Teapot.3ds'); // Teapot (no texture coordinates)
  156. actTeapot.Scale.Scale(0.8);
  157. actSphere_big.LoadFromFile('Sphere_big.3DS');
  158. actSphere_big.Scale.Scale(70);
  159. actSphere_lit.LoadFromFile('Sphere.3ds');
  160. actSphere_lit.Scale.Scale(4);
  161. SetCurrentDir(Path + '\map');
  162. MaterialLibrary.LibMaterialByName('Earth').Material.Texture.Image.LoadFromFile('earth.jpg');
  163. // Then load textures.
  164. SetCurrentDir(Path + '\texture');
  165. MaterialLibrary.LibMaterialByName('Noise').Material.Texture.Image.LoadFromFile('Flare1.bmp');
  166. // MaterialLibrary.LibMaterialByName('Noise').Material.Texture.Image.LoadFromFile('wikiNoise.jpg');
  167. MaterialLibrary.LibMaterialByName('Mask').Material.Texture.Image.LoadFromFile('wikiMask.jpg');
  168. // Creating Blur Shader
  169. BlurShader := TGLSLPostBlurShader.Create(Self);
  170. BlurShader.Enabled := false;
  171. BlurShader.Threshold := 0.001;
  172. PostShaderHolder.Shaders.Add.Shader := BlurShader;
  173. ShaderCheckListBox.Items.AddObject('Blur Shader', BlurShader);
  174. ShaderCheckListBox.Checked[0] := false;
  175. // Creating ThermalVision Shader
  176. ThermalVisionShader := TGLSLPostThermalVisionShader.Create(Self);
  177. ThermalVisionShader.Enabled := false;
  178. PostShaderHolder.Shaders.Add.Shader := ThermalVisionShader;
  179. ShaderCheckListBox.Items.AddObject('Thermal Vision Shader',
  180. ThermalVisionShader);
  181. ShaderCheckListBox.Checked[1] := false;
  182. // Creating DreamVision Shader
  183. DreamVisionShader := TGLSLPostDreamVisionShader.Create(Self);
  184. DreamVisionShader.Enabled := false;
  185. PostShaderHolder.Shaders.Add.Shader := DreamVisionShader;
  186. ShaderCheckListBox.Items.AddObject('Dream Vision Shader', DreamVisionShader);
  187. ShaderCheckListBox.Checked[2] := false;
  188. // Creating NightVision Shader
  189. NightVisionShader := TGLSLPostNightVisionShader.Create(Self);
  190. NightVisionShader.Enabled := false;
  191. NightVisionShader.MaterialLibrary := MaterialLibrary;
  192. NightVisionShader.NoiseTexName := 'Noise';
  193. NightVisionShader.MaskTexName := 'Mask';
  194. NightVisionShader.UseMask := 1;
  195. PostShaderHolder.Shaders.Add.Shader := NightVisionShader;
  196. ShaderCheckListBox.Items.AddObject('Night Vision Shader', NightVisionShader);
  197. ShaderCheckListBox.Checked[3] := false;
  198. // Creating Pixelate Shader
  199. PixelateShader := TGLSLPostPixelateShader.Create(Self);
  200. PixelateShader.Enabled := false;
  201. PostShaderHolder.Shaders.Add.Shader := PixelateShader;
  202. ShaderCheckListBox.Items.AddObject('Pixelate Shader', PixelateShader);
  203. ShaderCheckListBox.Checked[4] := false;
  204. // Creating Posterize Shader
  205. PosterizeShader := TGLSLPostPosterizeShader.Create(Self);
  206. PosterizeShader.Enabled := false;
  207. PostShaderHolder.Shaders.Add.Shader := PosterizeShader;
  208. ShaderCheckListBox.Items.AddObject('Posterize Shader', PosterizeShader);
  209. ShaderCheckListBox.Checked[5] := false;
  210. // Creating Frost Shader
  211. FrostShader := TGLSLPostFrostShader.Create(Self);
  212. FrostShader.Enabled := false;
  213. PostShaderHolder.Shaders.Add.Shader := FrostShader;
  214. ShaderCheckListBox.Items.AddObject('Frost Shader', FrostShader);
  215. ShaderCheckListBox.Checked[6] := false;
  216. // Creating Trouble Shader
  217. TroubleShader := TGLSLPostTroubleShader.Create(Self);
  218. TroubleShader.Enabled := false;
  219. TroubleShader.MaterialLibrary := MaterialLibrary;
  220. TroubleShader.NoiseTexName := 'Noise';
  221. PostShaderHolder.Shaders.Add.Shader := TroubleShader;
  222. ShaderCheckListBox.Items.AddObject('Trouble Shader', TroubleShader);
  223. ShaderCheckListBox.Checked[7] := false;
  224. // Creating Transformation Shader
  225. TransformationShader := TGLCGPostTransformationShader.Create(Self);
  226. TransformationShader.TransformationTexture :=
  227. MaterialLibrary.LibMaterialByName('Noise').Material.Texture;
  228. PostShaderHolder.Shaders.Add.Shader := TransformationShader;
  229. ShaderCheckListBox.Items.AddObject('Transformation Shader',
  230. TransformationShader);
  231. ShaderCheckListBox.Checked[8] := True;
  232. end;
  233. //-------------------------------------------------------
  234. procedure TFormPostShader.CadencerProgress(Sender: TObject;
  235. const deltaTime, newTime: double);
  236. begin
  237. Viewer.Invalidate;
  238. if TurnPitchrollCheckBox.Checked then
  239. begin
  240. actFighter.Roll(20 * deltaTime);
  241. actSphere_big.Pitch(40 * deltaTime);
  242. actSphere_big.Turn(40 * deltaTime);
  243. actSphere_lit.Roll(40 * deltaTime);
  244. actTeapot.Roll(-20 * deltaTime);
  245. end;
  246. if NightVisionShader.Enabled then
  247. NightVisionShader.ElapsedTime := newTime; // 20*deltaTime;
  248. end;
  249. //-------------------------------------------------------
  250. procedure TFormPostShader.LightCubeProgress(Sender: TObject;
  251. const deltaTime, newTime: double);
  252. begin
  253. if LightMovingCheckBox.Checked then
  254. LightCube.MoveObjectAround(Camera.TargetObject, sin(newTime) * deltaTime *
  255. 10, deltaTime * 20);
  256. end;
  257. //-------------------------------------------------------
  258. procedure TFormPostShader.ShaderCheckListBoxClick(Sender: TObject);
  259. var
  260. I: Integer;
  261. begin
  262. if ShaderCheckListBox.Items.Count <> 0 then
  263. for I := 0 to ShaderCheckListBox.Items.Count - 1 do
  264. TGLShader(ShaderCheckListBox.Items.Objects[I]).Enabled :=
  265. ShaderCheckListBox.Checked[I];
  266. end;
  267. //-------------------------------------------------------
  268. procedure TFormPostShader.tbBlurValueChange(Sender: TObject);
  269. begin
  270. BlurShader.Threshold := tbBlurValue.Position / 100;
  271. lblBlurValue.Caption := FloatToStrF(BlurShader.Threshold, ffFixed, 5, 2);
  272. end;
  273. //-------------------------------------------------------
  274. procedure TFormPostShader.tbDreamThresholdChange(Sender: TObject);
  275. begin
  276. DreamVisionShader.Threshold := tbDreamThreshold.Position / 100;
  277. lblDreamThreshold.Caption := FloatToStrF(DreamVisionShader.Threshold,
  278. ffFixed, 5, 2);
  279. end;
  280. //-------------------------------------------------------
  281. procedure TFormPostShader.tbFrostFactorChange(Sender: TObject);
  282. begin
  283. FrostShader.RandFactor := tbFrostFactor.Position;
  284. lblFrostFactor.Caption := FloatToStrF(FrostShader.RandFactor, ffFixed, 5, 2);
  285. end;
  286. //-------------------------------------------------------
  287. procedure TFormPostShader.tbFrostRandChange(Sender: TObject);
  288. begin
  289. FrostShader.RandScale := tbFrostRand.Position;
  290. lblFrostRand.Caption := FloatToStrF(FrostShader.RandScale, ffFixed, 5, 2);
  291. end;
  292. //-------------------------------------------------------
  293. procedure TFormPostShader.tblNightThresholdChange(Sender: TObject);
  294. begin
  295. NightVisionShader.LuminanceThreshold := tblNightThreshold.Position / 100;
  296. lblNight.Caption := FloatToStrF(NightVisionShader.LuminanceThreshold,
  297. ffFixed, 5, 2);
  298. end;
  299. //-------------------------------------------------------
  300. procedure TFormPostShader.tbNightAmplificationChange(Sender: TObject);
  301. begin
  302. NightVisionShader.ColorAmplification := tbNightAmplification.Position / 100;
  303. lblNightAmplification.Caption :=
  304. FloatToStrF(NightVisionShader.ColorAmplification, ffFixed, 5, 2);
  305. end;
  306. //-------------------------------------------------------
  307. procedure TFormPostShader.tbPixelateHeightChange(Sender: TObject);
  308. begin
  309. PixelateShader.PixelHeight := tbPixelateHeight.Position;
  310. lblPixelateHeight.Caption := FloatToStrF(PixelateShader.PixelHeight,
  311. ffFixed, 5, 0);
  312. end;
  313. //-------------------------------------------------------
  314. procedure TFormPostShader.tbPixelateWidthChange(Sender: TObject);
  315. begin
  316. PixelateShader.PixelWidth := tbPixelateWidth.Position;
  317. lblPixelateWidth.Caption := FloatToStrF(PixelateShader.PixelWidth,
  318. ffFixed, 5, 0);
  319. end;
  320. //-------------------------------------------------------
  321. procedure TFormPostShader.tbPosterizeColorsChange(Sender: TObject);
  322. begin
  323. PosterizeShader.NumColors := tbPosterizeColors.Position;
  324. lblPosterizeColors.Caption := FloatToStrF(PosterizeShader.NumColors,
  325. ffFixed, 5, 2);
  326. end;
  327. //-------------------------------------------------------
  328. procedure TFormPostShader.tbPosterizeGammaChange(Sender: TObject);
  329. begin
  330. PosterizeShader.Gamma := tbPosterizeGamma.Position / 100;
  331. lblPosterizeGamma.Caption := FloatToStrF(PosterizeShader.Gamma,
  332. ffFixed, 5, 2);
  333. end;
  334. //-------------------------------------------------------
  335. procedure TFormPostShader.tbThermalIntensityChange(Sender: TObject);
  336. begin
  337. ThermalVisionShader.Intensity := tbThermalIntensity.Position / 100;
  338. lblThermalIntensity.Caption := FloatToStrF(ThermalVisionShader.Intensity,
  339. ffFixed, 5, 2);
  340. end;
  341. //-------------------------------------------------------
  342. procedure TFormPostShader.tbThermalThresholdChange(Sender: TObject);
  343. begin
  344. ThermalVisionShader.Threshold := tbThermalThreshold.Position / 100;
  345. lblThermalThreshold.Caption := FloatToStrF(ThermalVisionShader.Threshold,
  346. ffFixed, 5, 2);
  347. end;
  348. //-------------------------------------------------------
  349. procedure TFormPostShader.tbTroubleFreqChange(Sender: TObject);
  350. begin
  351. TroubleShader.Freq := tbTroubleFreq.Position / 100;
  352. lblTroubleFreq.Caption := FloatToStrF(TroubleShader.Freq, ffFixed, 5, 2);
  353. end;
  354. //-------------------------------------------------------
  355. procedure TFormPostShader.tbTroubleHeightChange(Sender: TObject);
  356. begin
  357. TroubleShader.PixelY := tbTroubleHeight.Position;
  358. lblTroubleHeight.Caption := FloatToStrF(TroubleShader.PixelY, ffFixed, 5, 2);
  359. end;
  360. //-------------------------------------------------------
  361. procedure TFormPostShader.tbTroubleWidthChange(Sender: TObject);
  362. begin
  363. TroubleShader.PixelX := tbTroubleWidth.Position;
  364. lblTroubleWidth.Caption := FloatToStrF(TroubleShader.PixelX, ffFixed, 5, 2);
  365. end;
  366. //-------------------------------------------------------
  367. procedure TFormPostShader.FormClose(Sender: TObject;
  368. var Action: TCloseAction);
  369. begin
  370. Cadencer.Enabled := false;
  371. end;
  372. end.