fCloudSkyD.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. unit fCloudSkyD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.Messages,
  6. System.SysUtils,
  7. System.Variants,
  8. System.Classes,
  9. System.Math,
  10. Vcl.Graphics,
  11. Vcl.Controls,
  12. Vcl.Forms,
  13. Vcl.Dialogs,
  14. Vcl.StdCtrls,
  15. Vcl.ExtCtrls,
  16. GLS.Scene,
  17. GLS.Objects,
  18. GLS.SceneViewer,
  19. GLS.AsyncTimer,
  20. GLS.Cadencer,
  21. GLS.VectorGeometry,
  22. GLS.SkyDome,
  23. GLS.Texture,
  24. GLS.FileTGA,
  25. GLS.Keyboard,
  26. GLS.Material,
  27. GLS.Coordinates,
  28. GLS.BaseClasses,
  29. GLS.Utils,
  30. GLS.SimpleNavigation,
  31. GLS.CgShader;
  32. type
  33. TMainForm = class(TForm)
  34. GLScene: TGLScene;
  35. GLSV: TGLSceneViewer;
  36. dc_cam: TGLDummyCube;
  37. cam: TGLCamera;
  38. Cadencer: TGLCadencer;
  39. Timer: TGLAsyncTimer;
  40. SbBackground: TGLSkyBox;
  41. MatLib: TGLMaterialLibrary;
  42. CgBackground: TCgShader;
  43. CgClouds: TCgShader;
  44. SbClouds: TGLSkyBox;
  45. Moons: TGLDummyCube;
  46. sprSecunda: TGLSprite;
  47. sprMasser: TGLSprite;
  48. CgMasser: TCgShader;
  49. CgSecunda: TCgShader;
  50. CgSun: TCgShader;
  51. sprSun: TGLSprite;
  52. Panel1: TPanel;
  53. Label1: TLabel;
  54. Label2: TLabel;
  55. Label3: TLabel;
  56. Label4: TLabel;
  57. Label5: TLabel;
  58. GLSimpleNavigation1: TGLSimpleNavigation;
  59. PanelFPS: TPanel;
  60. procedure CgCloudsApplyVP(CgProgram: TCgProgram; Sender: TObject);
  61. procedure CgSunUnApplyFP(CgProgram: TCgProgram);
  62. procedure CgSunApplyFP(CgProgram: TCgProgram; Sender: TObject);
  63. procedure CgSecundaUnApplyFP(CgProgram: TCgProgram);
  64. procedure CgSecundaApplyFP(CgProgram: TCgProgram; Sender: TObject);
  65. procedure CgMasserUnApplyFP(CgProgram: TCgProgram);
  66. procedure CgMasserApplyFP(CgProgram: TCgProgram; Sender: TObject);
  67. procedure CgCloudsUnApplyFP(CgProgram: TCgProgram);
  68. procedure CgCloudsApplyFP(CgProgram: TCgProgram; Sender: TObject);
  69. procedure CgBackgroundUnApplyFP(CgProgram: TCgProgram);
  70. procedure CgBackgroundApplyFP(CgProgram: TCgProgram; Sender: TObject);
  71. procedure CadencerProgress(Sender: TObject;
  72. const deltaTime, newTime: Double);
  73. procedure FormCreate(Sender: TObject);
  74. procedure GLSVMouseDown(Sender: TObject; Button: TMouseButton;
  75. Shift: TShiftState; X, Y: Integer);
  76. procedure GLSVMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  77. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  78. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  79. procedure TimerTimer(Sender: TObject);
  80. private
  81. mx, my: Integer;
  82. bg_w1, bg_w2, c_w1, c_w2, m_w, a_w: single;
  83. DayMode, WeatherMode: byte;
  84. procedure HandleKeys;
  85. procedure AssignMaterials;
  86. procedure CreateMaterials;
  87. public
  88. end;
  89. var
  90. MainForm: TMainForm;
  91. dirSelf, dirTextures, dirShaders: TFileName;
  92. const
  93. Coeff = 0.1;
  94. // ---------------------------------------------------------
  95. implementation
  96. {$R *.dfm}
  97. // ---------------------------FormCreate--------------------
  98. procedure TMainForm.FormCreate(Sender: TObject);
  99. begin
  100. // GetDir(0, dirSelf);
  101. dirSelf := GetCurrentAssetPath(); // current assets
  102. dirTextures := dirSelf + '\texture\';
  103. dirShaders := dirSelf + '\shader\';
  104. CreateMaterials;
  105. AssignMaterials;
  106. bg_w1 := 1;
  107. bg_w2 := 0;
  108. c_w1 := 1;
  109. c_w2 := 0;
  110. m_w := 0; // moons
  111. a_w := 0; // ambient
  112. WeatherMode := 0;
  113. ClientWidth := 1024;
  114. ClientHeight := 712;
  115. Position := poScreenCenter;
  116. GLSV.Align := alClient;
  117. Timer.Enabled := True;
  118. end;
  119. // ---------------------------CreateMaterials---------------
  120. procedure TMainForm.CreateMaterials;
  121. begin
  122. CgBackground.FragmentProgram.LoadFromFile
  123. (dirShaders + 'fragment_bkground.cg');
  124. CgClouds.FragmentProgram.LoadFromFile(dirShaders + 'fragment_clouds.cg');
  125. CgMasser.FragmentProgram.LoadFromFile(dirShaders + 'fragment_moon.cg');
  126. CgSecunda.FragmentProgram.LoadFromFile(dirShaders + 'fragment_moon.cg');
  127. CgSun.FragmentProgram.LoadFromFile(dirShaders + 'fragment_moon.cg');
  128. // day background
  129. MatLib.AddTextureMaterial('day', dirTextures + 'tx_day.tga');
  130. // night background
  131. MatLib.AddTextureMaterial('night', dirTextures + 'tx_night.tga');
  132. // main skybox material
  133. with MatLib.Materials.Add do
  134. begin
  135. Name := 'background';
  136. Shader := CgBackground;
  137. end;
  138. // clouds
  139. MatLib.AddTextureMaterial('clouds_clear', dirTextures + 'tx_sky_clear.tga');
  140. MatLib.AddTextureMaterial('clouds_cloudy', dirTextures + 'tx_sky_cloudy.tga');
  141. // main clouds material
  142. with MatLib.Materials.Add do
  143. begin
  144. Name := 'clouds';
  145. Material.BlendingMode := bmTransparency;
  146. Shader := CgClouds;
  147. end;
  148. // moons
  149. MatLib.AddTextureMaterial('masser', dirTextures + 'tx_masser_three_wan.tga');
  150. MatLib.AddTextureMaterial('secunda',
  151. dirTextures + 'tx_secunda_three_wan.tga');
  152. MatLib.AddTextureMaterial('sun', dirTextures + 'tx_sun.tga');
  153. with MatLib.Materials.Add do
  154. begin
  155. Name := 'moon_masser';
  156. Material.BlendingMode := bmTransparency;
  157. Shader := CgMasser;
  158. end;
  159. with MatLib.Materials.Add do
  160. begin
  161. Name := 'moon_secunda';
  162. Material.BlendingMode := bmTransparency;
  163. Shader := CgSecunda;
  164. end;
  165. with MatLib.Materials.Add do
  166. begin
  167. Name := 'moon_sun';
  168. Material.BlendingMode := bmTransparency;
  169. Shader := CgSun;
  170. end;
  171. end;
  172. // ---------------------------AssignMaterials---------------
  173. procedure TMainForm.AssignMaterials;
  174. begin
  175. with SbBackground do
  176. begin
  177. MaterialLibrary := MatLib;
  178. MatNameTop := 'background';
  179. MatNameRight := 'background';
  180. MatNameFront := 'background';
  181. MatNameLeft := 'background';
  182. MatNameBack := 'background';
  183. MatNameBottom := 'background';
  184. end;
  185. with SbClouds do
  186. begin
  187. MaterialLibrary := MatLib;
  188. MatNameClouds := 'clouds';
  189. end;
  190. with sprMasser.Material do
  191. begin
  192. MaterialLibrary := MatLib;
  193. LibMaterialName := 'moon_masser';
  194. end;
  195. with sprSecunda.Material do
  196. begin
  197. MaterialLibrary := MatLib;
  198. LibMaterialName := 'moon_secunda';
  199. end;
  200. with sprSun.Material do
  201. begin
  202. MaterialLibrary := MatLib;
  203. LibMaterialName := 'moon_sun';
  204. end;
  205. end;
  206. // ---------------------------GLSVMouseDown-----------------
  207. procedure TMainForm.GLSVMouseDown(Sender: TObject; Button: TMouseButton;
  208. Shift: TShiftState; X, Y: Integer);
  209. begin
  210. mx := X;
  211. my := Y;
  212. end;
  213. // ---------------------------GLSVMouseMove-----------------
  214. procedure TMainForm.GLSVMouseMove(Sender: TObject; Shift: TShiftState;
  215. X, Y: Integer);
  216. begin
  217. if Shift = [ssRight] then
  218. cam.MoveAroundTarget(my - Y, mx - X);
  219. mx := X;
  220. my := Y;
  221. end;
  222. // ---------------------------FormMouseWheel----------------
  223. procedure TMainForm.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  224. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  225. begin
  226. cam.AdjustDistanceToTarget(Power(1.1, WheelDelta / 100));
  227. end;
  228. // ---------------------------TimerTimer--------------------
  229. procedure TMainForm.TimerTimer(Sender: TObject);
  230. begin
  231. PanelFPS.Caption := GLSV.FramesPerSecondText(2);
  232. GLSV.ResetPerformanceMonitor;
  233. end;
  234. // ---------------------------CadencerProgress--------------
  235. procedure TMainForm.CadencerProgress(Sender: TObject;
  236. const deltaTime, newTime: Double);
  237. begin
  238. HandleKeys;
  239. case DayMode of
  240. 1: // day
  241. begin
  242. bg_w1 := bg_w1 + deltaTime * Coeff;
  243. if bg_w1 > 1 then
  244. bg_w1 := 1;
  245. bg_w2 := bg_w2 - deltaTime * Coeff;
  246. if bg_w2 < 0 then
  247. bg_w2 := 0;
  248. m_w := m_w - deltaTime * Coeff;
  249. if m_w < 0 then
  250. m_w := 0;
  251. end;
  252. 2: // night
  253. begin
  254. bg_w1 := bg_w1 - deltaTime * Coeff;
  255. if bg_w1 < 0 then
  256. bg_w1 := 0;
  257. bg_w2 := bg_w2 + deltaTime * Coeff;
  258. if bg_w2 > 1 then
  259. bg_w2 := 1;
  260. m_w := m_w + deltaTime * Coeff;
  261. if m_w > 1 then
  262. m_w := 1;
  263. if bg_w2 > 0.3 then
  264. a_w := a_w - deltaTime * Coeff
  265. else
  266. a_w := a_w + deltaTime * Coeff;
  267. if a_w < 0 then
  268. a_w := 0.01;
  269. end;
  270. end;
  271. case WeatherMode of
  272. 1:
  273. begin
  274. c_w1 := c_w1 - deltaTime * Coeff;
  275. if c_w1 < 0 then
  276. c_w1 := 0;
  277. c_w2 := c_w2 + deltaTime * Coeff;
  278. if c_w2 > 1 then
  279. c_w2 := 1;
  280. end;
  281. 0:
  282. begin
  283. c_w1 := c_w1 + deltaTime * Coeff;
  284. if c_w1 > 1 then
  285. c_w1 := 1;
  286. c_w2 := c_w2 - deltaTime * Coeff;
  287. if c_w2 < 0 then
  288. c_w2 := 0;
  289. end;
  290. end;
  291. GLSV.Invalidate;
  292. end;
  293. // ---------------------------HandleKeys--------------------
  294. procedure TMainForm.HandleKeys;
  295. begin
  296. if IsKeyDown('c') then // weather1
  297. WeatherMode := 0
  298. else if IsKeyDown('s') then // weather2
  299. WeatherMode := 1
  300. else if IsKeyDown('n') then // night
  301. DayMode := 2
  302. else if IsKeyDown('d') then // day
  303. DayMode := 1
  304. else
  305. end;
  306. // ---------------------------CgShaderApplyFP---------------
  307. procedure TMainForm.CgBackgroundApplyFP(CgProgram: TCgProgram; Sender: TObject);
  308. var
  309. w1, w2: single;
  310. begin
  311. with CgProgram.ParamByName('channel1') do
  312. begin
  313. SetAsTexture2d(MatLib.LibMaterialByName('day').Material.Texture.Handle);
  314. EnableTexture;
  315. end;
  316. with CgProgram.ParamByName('channel2') do
  317. begin
  318. SetAsTexture2d(MatLib.LibMaterialByName('night')
  319. .Material.Texture.Handle);
  320. EnableTexture;
  321. end;
  322. CgProgram.ParamByName('w1').SetAsScalar(bg_w1);
  323. CgProgram.ParamByName('w2').SetAsScalar(bg_w2);
  324. end;
  325. // ---------------------------CgShaderUnApplyFP-------------
  326. procedure TMainForm.CgBackgroundUnApplyFP(CgProgram: TCgProgram);
  327. begin
  328. CgProgram.ParamByName('channel1').DisableTexture;
  329. CgProgram.ParamByName('channel2').DisableTexture;
  330. end;
  331. // ---------------------------CgShaderCloudsApplyFP---------
  332. procedure TMainForm.CgCloudsApplyFP(CgProgram: TCgProgram; Sender: TObject);
  333. begin
  334. with CgProgram.ParamByName('channel1') do
  335. begin
  336. SetAsTexture2d(MatLib.LibMaterialByName('clouds_clear')
  337. .Material.Texture.Handle);
  338. EnableTexture;
  339. end;
  340. with CgProgram.ParamByName('channel2') do
  341. begin
  342. SetAsTexture2d(MatLib.LibMaterialByName('clouds_cloudy')
  343. .Material.Texture.Handle);
  344. EnableTexture;
  345. end;
  346. // if a_w < 0.1 then
  347. // a:= 0.5;
  348. CgProgram.ParamByName('w1').SetAsScalar(c_w1);
  349. CgProgram.ParamByName('w2').SetAsScalar(c_w2 - bg_w2 / 2);
  350. if a_w > 0 then
  351. begin
  352. CgProgram.ParamByName('redoffset1').SetAsScalar(a_w);
  353. CgProgram.ParamByName('redoffset2').SetAsScalar(a_w);
  354. end;
  355. end;
  356. // ---------------------------CgCloudsApplyVP---------------
  357. procedure TMainForm.CgCloudsApplyVP(CgProgram: TCgProgram; Sender: TObject);
  358. begin
  359. //
  360. end;
  361. // ---------------------------CgShaderCloudsUnApplyFP-------
  362. procedure TMainForm.CgCloudsUnApplyFP(CgProgram: TCgProgram);
  363. begin
  364. CgProgram.ParamByName('channel1').DisableTexture;
  365. CgProgram.ParamByName('channel2').DisableTexture;
  366. end;
  367. // ---------------------------CgMoonApplyFP-----------------
  368. procedure TMainForm.CgMasserApplyFP(CgProgram: TCgProgram; Sender: TObject);
  369. begin
  370. with CgProgram.ParamByName('channel1') do
  371. begin
  372. SetAsTexture2d(MatLib.LibMaterialByName('masser').Material.Texture.Handle);
  373. EnableTexture;
  374. end;
  375. CgProgram.ParamByName('w').SetAsScalar(m_w);
  376. end;
  377. // ---------------------------CgMoonUnApplyFP---------------
  378. procedure TMainForm.CgMasserUnApplyFP(CgProgram: TCgProgram);
  379. begin
  380. CgProgram.ParamByName('channel1').DisableTexture;
  381. end;
  382. // ---------------------------CgSecundaApplyFP--------------
  383. procedure TMainForm.CgSecundaApplyFP(CgProgram: TCgProgram; Sender: TObject);
  384. begin
  385. with CgProgram.ParamByName('channel1') do
  386. begin
  387. SetAsTexture2d(MatLib.LibMaterialByName('secunda').Material.Texture.Handle);
  388. EnableTexture;
  389. end;
  390. CgProgram.ParamByName('w').SetAsScalar(m_w);
  391. end;
  392. // ---------------------------CgSecundaUnApplyFP------------
  393. procedure TMainForm.CgSecundaUnApplyFP(CgProgram: TCgProgram);
  394. begin
  395. CgProgram.ParamByName('channel1').DisableTexture;
  396. end;
  397. // ---------------------------CgSunApplyFP------------------
  398. procedure TMainForm.CgSunApplyFP(CgProgram: TCgProgram; Sender: TObject);
  399. begin
  400. with CgProgram.ParamByName('channel1') do
  401. begin
  402. SetAsTexture2d(MatLib.LibMaterialByName('sun').Material.Texture.Handle);
  403. EnableTexture;
  404. end;
  405. CgProgram.ParamByName('w').SetAsScalar(1.2 * (1 - m_w));
  406. end;
  407. // ---------------------------CgSunUnApplyFP----------------
  408. procedure TMainForm.CgSunUnApplyFP(CgProgram: TCgProgram);
  409. begin
  410. CgProgram.ParamByName('channel1').DisableTexture;
  411. end;
  412. end.