fPostShaderD.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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. CG.PostTransformationShader,
  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. Fighter: TGLActor;
  51. Teapot: TGLActor;
  52. Sphere_big: TGLActor;
  53. Sphere_little: 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. Fighter.LoadFromFile('waste.md2'); // Fighter
  149. Fighter.SwitchToAnimation(0, True);
  150. Fighter.AnimationMode := aamLoop;
  151. Fighter.Scale.Scale(2);
  152. MaterialLibrary.LibMaterialByName('Fighter').Material.Texture.Image.LoadFromFile('Waste.jpg');
  153. // Loading static models
  154. SetCurrentDir(Path + '\model');
  155. Teapot.LoadFromFile('Teapot.3ds'); // Teapot (no texture coordinates)
  156. Teapot.Scale.Scale(0.8);
  157. Sphere_big.LoadFromFile('Sphere_big.3DS');
  158. Sphere_big.Scale.Scale(70);
  159. Sphere_little.LoadFromFile('Sphere.3ds');
  160. Sphere_little.Scale.Scale(4);
  161. // Then load textures.
  162. SetCurrentDir(Path + '\texture');
  163. MaterialLibrary.LibMaterialByName('Earth').Material.Texture.Image.LoadFromFile('Earth.jpg');
  164. MaterialLibrary.LibMaterialByName('Noise').Material.Texture.Image.LoadFromFile('Flare1.bmp');
  165. // MaterialLibrary.LibMaterialByName('Noise').Material.Texture.Image.LoadFromFile('wikiNoise.jpg');
  166. MaterialLibrary.LibMaterialByName('Mask').Material.Texture.Image.LoadFromFile('wikiMask.jpg');
  167. // Creating Blur Shader
  168. BlurShader := TGLSLPostBlurShader.Create(Self);
  169. BlurShader.Enabled := false;
  170. BlurShader.Threshold := 0.001;
  171. PostShaderHolder.Shaders.Add.Shader := BlurShader;
  172. ShaderCheckListBox.Items.AddObject('Blur Shader', BlurShader);
  173. ShaderCheckListBox.Checked[0] := false;
  174. // Creating ThermalVision Shader
  175. ThermalVisionShader := TGLSLPostThermalVisionShader.Create(Self);
  176. ThermalVisionShader.Enabled := false;
  177. PostShaderHolder.Shaders.Add.Shader := ThermalVisionShader;
  178. ShaderCheckListBox.Items.AddObject('Thermal Vision Shader',
  179. ThermalVisionShader);
  180. ShaderCheckListBox.Checked[1] := false;
  181. // Creating DreamVision Shader
  182. DreamVisionShader := TGLSLPostDreamVisionShader.Create(Self);
  183. DreamVisionShader.Enabled := false;
  184. PostShaderHolder.Shaders.Add.Shader := DreamVisionShader;
  185. ShaderCheckListBox.Items.AddObject('Dream Vision Shader', DreamVisionShader);
  186. ShaderCheckListBox.Checked[2] := false;
  187. // Creating NightVision Shader
  188. NightVisionShader := TGLSLPostNightVisionShader.Create(Self);
  189. NightVisionShader.Enabled := false;
  190. NightVisionShader.MaterialLibrary := MaterialLibrary;
  191. NightVisionShader.NoiseTexName := 'Noise';
  192. NightVisionShader.MaskTexName := 'Mask';
  193. NightVisionShader.UseMask := 1;
  194. PostShaderHolder.Shaders.Add.Shader := NightVisionShader;
  195. ShaderCheckListBox.Items.AddObject('Night Vision Shader', NightVisionShader);
  196. ShaderCheckListBox.Checked[3] := false;
  197. // Creating Pixelate Shader
  198. PixelateShader := TGLSLPostPixelateShader.Create(Self);
  199. PixelateShader.Enabled := false;
  200. PostShaderHolder.Shaders.Add.Shader := PixelateShader;
  201. ShaderCheckListBox.Items.AddObject('Pixelate Shader', PixelateShader);
  202. ShaderCheckListBox.Checked[4] := false;
  203. // Creating Posterize Shader
  204. PosterizeShader := TGLSLPostPosterizeShader.Create(Self);
  205. PosterizeShader.Enabled := false;
  206. PostShaderHolder.Shaders.Add.Shader := PosterizeShader;
  207. ShaderCheckListBox.Items.AddObject('Posterize Shader', PosterizeShader);
  208. ShaderCheckListBox.Checked[5] := false;
  209. // Creating Frost Shader
  210. FrostShader := TGLSLPostFrostShader.Create(Self);
  211. FrostShader.Enabled := false;
  212. PostShaderHolder.Shaders.Add.Shader := FrostShader;
  213. ShaderCheckListBox.Items.AddObject('Frost Shader', FrostShader);
  214. ShaderCheckListBox.Checked[6] := false;
  215. // Creating Trouble Shader
  216. TroubleShader := TGLSLPostTroubleShader.Create(Self);
  217. TroubleShader.Enabled := false;
  218. TroubleShader.MaterialLibrary := MaterialLibrary;
  219. TroubleShader.NoiseTexName := 'Noise';
  220. PostShaderHolder.Shaders.Add.Shader := TroubleShader;
  221. ShaderCheckListBox.Items.AddObject('Trouble Shader', TroubleShader);
  222. ShaderCheckListBox.Checked[7] := false;
  223. // Creating Transformation Shader
  224. TransformationShader := TGLCGPostTransformationShader.Create(Self);
  225. TransformationShader.TransformationTexture :=
  226. MaterialLibrary.LibMaterialByName('Noise').Material.Texture;
  227. PostShaderHolder.Shaders.Add.Shader := TransformationShader;
  228. ShaderCheckListBox.Items.AddObject('Transformation Shader',
  229. TransformationShader);
  230. ShaderCheckListBox.Checked[8] := True;
  231. end;
  232. //-------------------------------------------------------
  233. procedure TFormPostShader.CadencerProgress(Sender: TObject;
  234. const deltaTime, newTime: double);
  235. begin
  236. Viewer.Invalidate;
  237. if TurnPitchrollCheckBox.Checked then
  238. begin
  239. Fighter.Roll(20 * deltaTime);
  240. Sphere_big.Pitch(40 * deltaTime);
  241. Sphere_big.Turn(40 * deltaTime);
  242. Sphere_little.Roll(40 * deltaTime);
  243. Teapot.Roll(-20 * deltaTime);
  244. end;
  245. if NightVisionShader.Enabled then
  246. NightVisionShader.ElapsedTime := newTime; // 20*deltaTime;
  247. end;
  248. //-------------------------------------------------------
  249. procedure TFormPostShader.LightCubeProgress(Sender: TObject;
  250. const deltaTime, newTime: double);
  251. begin
  252. if LightMovingCheckBox.Checked then
  253. LightCube.MoveObjectAround(Camera.TargetObject, sin(newTime) * deltaTime *
  254. 10, deltaTime * 20);
  255. end;
  256. //-------------------------------------------------------
  257. procedure TFormPostShader.ShaderCheckListBoxClick(Sender: TObject);
  258. var
  259. I: Integer;
  260. begin
  261. if ShaderCheckListBox.Items.Count <> 0 then
  262. for I := 0 to ShaderCheckListBox.Items.Count - 1 do
  263. TGLShader(ShaderCheckListBox.Items.Objects[I]).Enabled :=
  264. ShaderCheckListBox.Checked[I];
  265. end;
  266. //-------------------------------------------------------
  267. procedure TFormPostShader.tbBlurValueChange(Sender: TObject);
  268. begin
  269. BlurShader.Threshold := tbBlurValue.Position / 100;
  270. lblBlurValue.Caption := FloatToStrF(BlurShader.Threshold, ffFixed, 5, 2);
  271. end;
  272. //-------------------------------------------------------
  273. procedure TFormPostShader.tbDreamThresholdChange(Sender: TObject);
  274. begin
  275. DreamVisionShader.Threshold := tbDreamThreshold.Position / 100;
  276. lblDreamThreshold.Caption := FloatToStrF(DreamVisionShader.Threshold,
  277. ffFixed, 5, 2);
  278. end;
  279. //-------------------------------------------------------
  280. procedure TFormPostShader.tbFrostFactorChange(Sender: TObject);
  281. begin
  282. FrostShader.RandFactor := tbFrostFactor.Position;
  283. lblFrostFactor.Caption := FloatToStrF(FrostShader.RandFactor, ffFixed, 5, 2);
  284. end;
  285. //-------------------------------------------------------
  286. procedure TFormPostShader.tbFrostRandChange(Sender: TObject);
  287. begin
  288. FrostShader.RandScale := tbFrostRand.Position;
  289. lblFrostRand.Caption := FloatToStrF(FrostShader.RandScale, ffFixed, 5, 2);
  290. end;
  291. //-------------------------------------------------------
  292. procedure TFormPostShader.tblNightThresholdChange(Sender: TObject);
  293. begin
  294. NightVisionShader.LuminanceThreshold := tblNightThreshold.Position / 100;
  295. lblNight.Caption := FloatToStrF(NightVisionShader.LuminanceThreshold,
  296. ffFixed, 5, 2);
  297. end;
  298. //-------------------------------------------------------
  299. procedure TFormPostShader.tbNightAmplificationChange(Sender: TObject);
  300. begin
  301. NightVisionShader.ColorAmplification := tbNightAmplification.Position / 100;
  302. lblNightAmplification.Caption :=
  303. FloatToStrF(NightVisionShader.ColorAmplification, ffFixed, 5, 2);
  304. end;
  305. //-------------------------------------------------------
  306. procedure TFormPostShader.tbPixelateHeightChange(Sender: TObject);
  307. begin
  308. PixelateShader.PixelHeight := tbPixelateHeight.Position;
  309. lblPixelateHeight.Caption := FloatToStrF(PixelateShader.PixelHeight,
  310. ffFixed, 5, 0);
  311. end;
  312. //-------------------------------------------------------
  313. procedure TFormPostShader.tbPixelateWidthChange(Sender: TObject);
  314. begin
  315. PixelateShader.PixelWidth := tbPixelateWidth.Position;
  316. lblPixelateWidth.Caption := FloatToStrF(PixelateShader.PixelWidth,
  317. ffFixed, 5, 0);
  318. end;
  319. //-------------------------------------------------------
  320. procedure TFormPostShader.tbPosterizeColorsChange(Sender: TObject);
  321. begin
  322. PosterizeShader.NumColors := tbPosterizeColors.Position;
  323. lblPosterizeColors.Caption := FloatToStrF(PosterizeShader.NumColors,
  324. ffFixed, 5, 2);
  325. end;
  326. //-------------------------------------------------------
  327. procedure TFormPostShader.tbPosterizeGammaChange(Sender: TObject);
  328. begin
  329. PosterizeShader.Gamma := tbPosterizeGamma.Position / 100;
  330. lblPosterizeGamma.Caption := FloatToStrF(PosterizeShader.Gamma,
  331. ffFixed, 5, 2);
  332. end;
  333. //-------------------------------------------------------
  334. procedure TFormPostShader.tbThermalIntensityChange(Sender: TObject);
  335. begin
  336. ThermalVisionShader.Intensity := tbThermalIntensity.Position / 100;
  337. lblThermalIntensity.Caption := FloatToStrF(ThermalVisionShader.Intensity,
  338. ffFixed, 5, 2);
  339. end;
  340. //-------------------------------------------------------
  341. procedure TFormPostShader.tbThermalThresholdChange(Sender: TObject);
  342. begin
  343. ThermalVisionShader.Threshold := tbThermalThreshold.Position / 100;
  344. lblThermalThreshold.Caption := FloatToStrF(ThermalVisionShader.Threshold,
  345. ffFixed, 5, 2);
  346. end;
  347. //-------------------------------------------------------
  348. procedure TFormPostShader.tbTroubleFreqChange(Sender: TObject);
  349. begin
  350. TroubleShader.Freq := tbTroubleFreq.Position / 100;
  351. lblTroubleFreq.Caption := FloatToStrF(TroubleShader.Freq, ffFixed, 5, 2);
  352. end;
  353. //-------------------------------------------------------
  354. procedure TFormPostShader.tbTroubleHeightChange(Sender: TObject);
  355. begin
  356. TroubleShader.PixelY := tbTroubleHeight.Position;
  357. lblTroubleHeight.Caption := FloatToStrF(TroubleShader.PixelY, ffFixed, 5, 2);
  358. end;
  359. //-------------------------------------------------------
  360. procedure TFormPostShader.tbTroubleWidthChange(Sender: TObject);
  361. begin
  362. TroubleShader.PixelX := tbTroubleWidth.Position;
  363. lblTroubleWidth.Caption := FloatToStrF(TroubleShader.PixelX, ffFixed, 5, 2);
  364. end;
  365. //-------------------------------------------------------
  366. procedure TFormPostShader.FormClose(Sender: TObject;
  367. var Action: TCloseAction);
  368. begin
  369. Cadencer.Enabled := false;
  370. end;
  371. end.