fdCloudSky.pas 11 KB

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