fShadowsD.pas 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. unit fShadowsD;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. System.SysUtils,
  6. System.Classes,
  7. Vcl.Graphics,
  8. Vcl.Controls,
  9. Vcl.Forms,
  10. Vcl.Dialogs,
  11. Vcl.ExtCtrls,
  12. Vcl.StdCtrls,
  13. Vcl.ComCtrls,
  14. Vcl.Imaging.JPeg,
  15. Stage.VectorTypes,
  16. Stage.VectorGeometry,
  17. GLS.BaseClasses,
  18. GLS.Scene,
  19. GLS.Graph,
  20. GLS.Objects,
  21. GLS.Texture,
  22. GLS.Graphics,
  23. GLS.HUDObjects,
  24. GLS.zBuffer,
  25. GLS.Cadencer,
  26. GLS.AsyncTimer,
  27. GLS.SceneViewer,
  28. GLS.GeomObjects,
  29. GLS.Material,
  30. GLS.Coordinates,
  31. GLS.Behaviours,
  32. Stage.Utils;
  33. type
  34. TFormShadows = class(TForm)
  35. Panel2: TPanel;
  36. Panel1: TPanel;
  37. Panel3: TPanel;
  38. GLScene1: TGLScene;
  39. Label1: TLabel;
  40. Label2: TLabel;
  41. GLCamera1: TGLCamera;
  42. GLCamera2: TGLCamera;
  43. Objects: TGLDummyCube;
  44. GLLightSource1: TGLLightSource;
  45. Viewer: TGLSceneViewer;
  46. Caster: TGLSceneViewer;
  47. Panel4: TPanel;
  48. Label4: TLabel;
  49. DistanceBar: TTrackBar;
  50. Label3: TLabel;
  51. DistanceBar2: TTrackBar;
  52. Panel5: TPanel;
  53. GLMaterialLibrary1: TGLMaterialLibrary;
  54. MemView: TGLMemoryViewer;
  55. Shadows1: TGLZShadows;
  56. Cube1: TGLCube;
  57. FrustBox: TCheckBox;
  58. AsyncTimer1: TGLAsyncTimer;
  59. Torus1: TGLTorus;
  60. RotateBox: TCheckBox;
  61. ShadowOnBox: TCheckBox;
  62. GLCadencer1: TGLCadencer;
  63. HeightField1: TGLHeightField;
  64. Teapot1: TGLTeapot;
  65. SoftBox: TCheckBox;
  66. SkyShadBox: TCheckBox;
  67. Focal: TTrackBar;
  68. Label5: TLabel;
  69. CastBtn: TButton;
  70. TimeLbl: TLabel;
  71. Panel6: TPanel;
  72. FadeBox: TCheckBox;
  73. dovBar: TTrackBar;
  74. Memo1: TMemo;
  75. AlphaBar: TTrackBar;
  76. Label9: TLabel;
  77. procedure ViewerMouseDown(Sender: TObject; Button: TMouseButton;
  78. Shift: TShiftState; X, Y: Integer);
  79. procedure ViewerMouseMove(Sender: TObject; Shift: TShiftState;
  80. X, Y: Integer);
  81. procedure CasterMouseDown(Sender: TObject; Button: TMouseButton;
  82. Shift: TShiftState; X, Y: Integer);
  83. procedure CasterMouseMove(Sender: TObject; Shift: TShiftState;
  84. X, Y: Integer);
  85. procedure DistanceBarChange(Sender: TObject);
  86. procedure DistanceBar2Change(Sender: TObject);
  87. procedure FormCreate(Sender: TObject);
  88. procedure CastBtnClick(Sender: TObject);
  89. procedure ViewerMouseUp(Sender: TObject; Button: TMouseButton;
  90. Shift: TShiftState; X, Y: Integer);
  91. procedure CasterMouseUp(Sender: TObject; Button: TMouseButton;
  92. Shift: TShiftState; X, Y: Integer);
  93. procedure FadeBoxClick(Sender: TObject);
  94. procedure HeightField1GetHeight(const X, Y: Single; var z: Single;
  95. var color: TVector4f; var texPoint: TTexPoint);
  96. procedure FrustBoxClick(Sender: TObject);
  97. procedure AsyncTimer1Timer(Sender: TObject);
  98. procedure RotateBoxClick(Sender: TObject);
  99. procedure ShadowOnBoxClick(Sender: TObject);
  100. procedure SoftBoxClick(Sender: TObject);
  101. procedure SkyShadBoxClick(Sender: TObject);
  102. procedure FocalChange(Sender: TObject);
  103. procedure dovBarChange(Sender: TObject);
  104. procedure AlphaBarChange(Sender: TObject);
  105. procedure GLCadencer1Progress(Sender: TObject;
  106. const deltaTime, newTime: Double);
  107. private
  108. public
  109. mx, my: Integer;
  110. mx2, my2: Integer;
  111. zViewer, zCaster: TGLzBuffer;
  112. end;
  113. var
  114. FormShadows: TFormShadows;
  115. implementation
  116. {$R *.DFM}
  117. procedure TFormShadows.FormCreate(Sender: TObject);
  118. begin
  119. var Path: TFileName := GetCurrentAssetPath();
  120. SetCurrentDir(Path + '\texture');
  121. GLMaterialLibrary1.Materials[2].Material.texture.Image.loadFromFile
  122. ('marbletiles.jpg');
  123. GLMaterialLibrary1.Materials[2].Material.texture.disabled := false;
  124. GLMaterialLibrary1.Materials[3].Material.texture.Image.loadFromFile
  125. ('beigemarble.jpg');
  126. GLMaterialLibrary1.Materials[3].Material.texture.disabled := false;
  127. RotateBoxClick(Sender);
  128. end;
  129. procedure TFormShadows.ViewerMouseDown(Sender: TObject; Button: TMouseButton;
  130. Shift: TShiftState; X, Y: Integer);
  131. begin
  132. mx := X;
  133. my := Y;
  134. ActiveControl := DistanceBar;
  135. end;
  136. procedure TFormShadows.ViewerMouseMove(Sender: TObject; Shift: TShiftState;
  137. X, Y: Integer);
  138. begin
  139. if Shift <> [] then
  140. GLCamera1.MoveAroundTarget(my - Y, mx - X);
  141. mx := X;
  142. my := Y;
  143. GLCadencer1.Progress;
  144. Viewer.Refresh;
  145. Caster.Refresh;
  146. end;
  147. procedure TFormShadows.CasterMouseDown(Sender: TObject; Button: TMouseButton;
  148. Shift: TShiftState; X, Y: Integer);
  149. begin
  150. mx2 := X;
  151. my2 := Y;
  152. ActiveControl := DistanceBar2;
  153. end;
  154. procedure TFormShadows.CasterMouseMove(Sender: TObject; Shift: TShiftState;
  155. X, Y: Integer);
  156. begin
  157. if Shift <> [] then
  158. GLCamera2.MoveAroundTarget(my2 - Y, mx2 - X);
  159. mx2 := X;
  160. my2 := Y;
  161. if Shift <> [] then
  162. begin
  163. Shadows1.CastShadow;
  164. GLCadencer1.Progress;
  165. Viewer.Refresh;
  166. Caster.Refresh;
  167. end;
  168. end;
  169. procedure TFormShadows.DistanceBarChange(Sender: TObject);
  170. var
  171. Dist, NewDist: Single;
  172. begin
  173. with GLCamera1 do
  174. begin
  175. Dist := DistanceToTarget;
  176. NewDist := Sqr(DistanceBar.Position / 4) + 1;
  177. Position.AsAffineVector := VectorScale(Position.AsAffineVector,
  178. NewDist / Dist);
  179. end;
  180. end;
  181. procedure TFormShadows.DistanceBar2Change(Sender: TObject);
  182. var
  183. Dist, NewDist: Single;
  184. begin
  185. with GLCamera2 do
  186. begin
  187. Dist := DistanceToTarget;
  188. NewDist := Sqr(DistanceBar2.Position / 4) + 1;
  189. Position.AsAffineVector := VectorScale(Position.AsAffineVector,
  190. NewDist / Dist);
  191. end;
  192. Shadows1.CastShadow;
  193. Caster.Refresh;
  194. end;
  195. procedure TFormShadows.CastBtnClick(Sender: TObject);
  196. var
  197. RefTime: Double;
  198. begin
  199. RefTime := GLCadencer1.GetcurrentTime;
  200. Shadows1.CastShadow;
  201. Viewer.Refresh;
  202. TimeLbl.Caption := IntToStr(Round((GLCadencer1.GetcurrentTime - RefTime) *
  203. 1000.00));
  204. end;
  205. procedure TFormShadows.ViewerMouseUp(Sender: TObject; Button: TMouseButton;
  206. Shift: TShiftState; X, Y: Integer);
  207. begin
  208. Viewer.Visible := True;
  209. end;
  210. procedure TFormShadows.CasterMouseUp(Sender: TObject; Button: TMouseButton;
  211. Shift: TShiftState; X, Y: Integer);
  212. begin
  213. Shadows1.CastShadow;
  214. end;
  215. procedure TFormShadows.FadeBoxClick(Sender: TObject);
  216. begin
  217. Shadows1.DepthFade := FadeBox.Checked;
  218. end;
  219. procedure TFormShadows.HeightField1GetHeight(const X, Y: Single; var z: Single;
  220. var color: TVector4f; var texPoint: TTexPoint);
  221. begin
  222. z := 0;
  223. end;
  224. procedure TFormShadows.FrustBoxClick(Sender: TObject);
  225. begin
  226. Shadows1.FrustShadow := FrustBox.Checked;
  227. end;
  228. procedure TFormShadows.AsyncTimer1Timer(Sender: TObject);
  229. begin
  230. Caption := 'Shadows ' + Format('%.2f FPS', [Viewer.FramesPerSecond]);
  231. Viewer.ResetPerformanceMonitor;
  232. end;
  233. procedure TFormShadows.RotateBoxClick(Sender: TObject);
  234. begin
  235. // AsyncTimer1.Enabled:=RotateBox.checked;
  236. GLCadencer1.Enabled := RotateBox.Checked;
  237. end;
  238. procedure TFormShadows.ShadowOnBoxClick(Sender: TObject);
  239. begin
  240. Shadows1.Visible := ShadowOnBox.Checked;
  241. end;
  242. procedure TFormShadows.SoftBoxClick(Sender: TObject);
  243. begin
  244. Shadows1.Soft := SoftBox.Checked;
  245. end;
  246. procedure TFormShadows.SkyShadBoxClick(Sender: TObject);
  247. begin
  248. Shadows1.SkyShadow := SkyShadBox.Checked;
  249. end;
  250. procedure TFormShadows.FocalChange(Sender: TObject);
  251. begin
  252. GLCamera2.FocalLength := Focal.Position;
  253. MemView.Render;
  254. Caster.Refresh;
  255. Shadows1.CastShadow;
  256. Viewer.Refresh;
  257. end;
  258. procedure TFormShadows.dovBarChange(Sender: TObject);
  259. begin
  260. GLCamera2.DepthOfView := dovBar.Position;
  261. MemView.Render;
  262. Caster.Refresh;
  263. Shadows1.CastShadow;
  264. Viewer.Refresh;
  265. end;
  266. procedure TFormShadows.AlphaBarChange(Sender: TObject);
  267. begin
  268. Shadows1.color.Alpha := AlphaBar.Position / 256;
  269. end;
  270. procedure TFormShadows.GLCadencer1Progress(Sender: TObject;
  271. const deltaTime, newTime: Double);
  272. begin
  273. Shadows1.CastShadow;
  274. end;
  275. end.