FMxInfo.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. //
  2. // The graphics engine GLXEngine. The unit of GXScene for Delphi
  3. //
  4. unit FMxInfo;
  5. interface
  6. uses
  7. System.SysUtils,
  8. System.Types,
  9. System.UITypes,
  10. System.Classes,
  11. System.Variants,
  12. FMX.Types,
  13. FMX.Controls,
  14. FMX.Forms,
  15. FMX.Graphics,
  16. FMX.Dialogs,
  17. FMX.StdCtrls,
  18. FMX.TabControl,
  19. FMX.Layouts,
  20. FMX.ListBox,
  21. FMX.Memo,
  22. FMX.ScrollBox,
  23. FMX.Controls.Presentation,
  24. FMX.Objects,
  25. FMX.Memo.Types,
  26. Stage.OpenGL4,
  27. GXS.Scene,
  28. GXS.Context,
  29. Stage.Strings;
  30. type
  31. TInfoForm = class(TForm)
  32. TabControl: TTabControl;
  33. TabItemScene: TTabItem;
  34. TabItemInformation: TTabItem;
  35. TabItemExtensions: TTabItem;
  36. TabItemContributors: TTabItem;
  37. TabItemAbout: TTabItem;
  38. ButtonClose: TButton;
  39. ImageControl1: TImageControl;
  40. ScrollBoxInfo: TScrollBox;
  41. LabelCommon: TLabel;
  42. Label1: TLabel;
  43. Label2: TLabel;
  44. Label3: TLabel;
  45. Label4: TLabel;
  46. Label5: TLabel;
  47. Label6: TLabel;
  48. Label7: TLabel;
  49. CopyLabel: TLabel;
  50. AccLabel: TLabel;
  51. StereoLabel: TLabel;
  52. DoubleLabel: TLabel;
  53. VersionLabel: TLabel;
  54. RendererLabel: TLabel;
  55. VendorLabel: TLabel;
  56. LabelDepths: TLabel;
  57. Label9: TLabel;
  58. ColorLabel: TLabel;
  59. Label11: TLabel;
  60. DepthLabel: TLabel;
  61. Label13: TLabel;
  62. StencilLabel: TLabel;
  63. Label15: TLabel;
  64. AccumLabel: TLabel;
  65. Label17: TLabel;
  66. AuxLabel: TLabel;
  67. Label19: TLabel;
  68. SubLabel: TLabel;
  69. Label21: TLabel;
  70. OverlayLabel: TLabel;
  71. ListBoxExtensions: TListBox;
  72. Label23: TLabel;
  73. UnderlayLabel: TLabel;
  74. LabelMaxValues: TLabel;
  75. Label8: TLabel;
  76. ViewLabel: TLabel;
  77. Label26: TLabel;
  78. ModelLabel: TLabel;
  79. Label28: TLabel;
  80. ListLabel: TLabel;
  81. LightLabel: TLabel;
  82. Label31: TLabel;
  83. EvalLabel: TLabel;
  84. Label33: TLabel;
  85. ClipLabel: TLabel;
  86. Label35: TLabel;
  87. Label36: TLabel;
  88. Label37: TLabel;
  89. NameLabel: TLabel;
  90. Label39: TLabel;
  91. PixelLabel: TLabel;
  92. ProjLabel: TLabel;
  93. TexSizeLabel: TLabel;
  94. Label43: TLabel;
  95. TexStackLabel: TLabel;
  96. Label45: TLabel;
  97. TexUnitsLabel: TLabel;
  98. Label47: TLabel;
  99. MemoContributors: TMemo;
  100. MemoAbout: TMemo;
  101. LabelOfficial: TLabel;
  102. WebSiteLbl: TLabel;
  103. LabelDevelopment: TLabel;
  104. DevSiteLbl: TLabel;
  105. Label10: TLabel;
  106. TextInfo: TText;
  107. Label12: TLabel;
  108. Label14: TLabel;
  109. procedure ButtonCloseClick(Sender: TObject);
  110. procedure WebSiteLblClick(Sender: TObject);
  111. procedure FormShow(Sender: TObject);
  112. procedure FormCreate(Sender: TObject);
  113. procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
  114. Shift: TShiftState);
  115. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  116. procedure ListBoxExtensionsDblClick(Sender: TObject);
  117. procedure TextInfoClick(Sender: TObject);
  118. protected
  119. function GetSceneVersion: string;
  120. public
  121. procedure GetInfoFrom(aSceneBuffer: TgxSceneBuffer);
  122. end;
  123. var
  124. InfoForm: TInfoForm;
  125. //=======================================================================
  126. implementation
  127. //=======================================================================
  128. {$R *.fmx}
  129. procedure ShowInfoForm(aSceneBuffer: TgxSceneBuffer; Modal: boolean);
  130. var
  131. infoForm: TInfoForm;
  132. begin
  133. infoForm := TInfoForm.Create(nil);
  134. try
  135. infoForm.GetInfoFrom(aSceneBuffer);
  136. with infoForm do
  137. if Modal then
  138. ShowModal
  139. else
  140. Show;
  141. except
  142. infoForm.Free;
  143. raise;
  144. end;
  145. end;
  146. //---------------------------------------
  147. // TInfoForm }
  148. //---------------------------------------
  149. procedure TInfoForm.FormCreate(Sender: TObject);
  150. begin
  151. TabControl.ActiveTab := TabItemScene;
  152. end;
  153. procedure TInfoForm.FormShow(Sender: TObject);
  154. begin
  155. TabControl.ActiveTab := TabItemScene;
  156. end;
  157. procedure TInfoForm.GetInfoFrom(aSceneBuffer: TgxSceneBuffer);
  158. { TODO -cIncompatibility : Need to replace TPixelFormatDescriptor and HDC }
  159. ///const
  160. ///DRIVER_MASK = PFD_GENERIC_FORMAT or PFD_GENERIC_ACCELERATED;
  161. var
  162. ///pfd: TPixelFormatDescriptor;
  163. pixelFormat: Integer;
  164. ///dc: HDC; /// HDC - in Winapi.Windows should be replaced with...
  165. i: Integer;
  166. ExtStr: String;
  167. procedure IntLimitToLabel(const aLabel: TLabel; const aLimit: TgxLimitType);
  168. begin
  169. aLabel.Text := IntToStr(aSceneBuffer.LimitOf[aLimit]);
  170. end;
  171. begin
  172. Caption := Caption + ' (current context in ' +
  173. (aSceneBuffer.Owner as TComponent).Name + ')';
  174. aSceneBuffer.RenderingContext.Activate;
  175. try
  176. with aSceneBuffer do
  177. begin
  178. // common properties
  179. VendorLabel.Text := String(glGetString(GL_VENDOR));
  180. RendererLabel.Text := String(glGetString(GL_RENDERER));
  181. (*
  182. dc := wglGetCurrentDC();
  183. pixelFormat := GetPixelFormat(dc);
  184. DescribePixelFormat(dc, pixelFormat, SizeOf(pfd), pfd);
  185. // figure out the driver type
  186. if (DRIVER_MASK and pfd.dwFlags) = 0 then
  187. AccLabel.Text := 'Installable Client Driver'
  188. else if (DRIVER_MASK and pfd.dwFlags) = DRIVER_MASK then
  189. AccLabel.Text := 'Mini-Client Driver'
  190. else if (DRIVER_MASK and pfd.dwFlags) = PFD_GENERIC_FORMAT then
  191. AccLabel.Text := 'Generic Software Driver';
  192. *)
  193. VersionLabel.Text := String(glGetString(GL_VERSION));
  194. ExtStr := String(glGetString(GL_EXTENSIONS));
  195. ListBoxExtensions.Clear;
  196. while Length(ExtStr) > 0 do
  197. begin
  198. i := Pos(' ', ExtStr);
  199. if i = 0 then
  200. i := 255;
  201. ListBoxExtensions.Items.Add(Copy(ExtStr, 1, i - 1));
  202. Delete(ExtStr, 1, i);
  203. end;
  204. if LimitOf[limDoubleBuffer] = GL_TRUE then
  205. DoubleLabel.Text := 'yes'
  206. else
  207. DoubleLabel.Text := 'no';
  208. if LimitOf[limStereo] = GL_TRUE then
  209. StereoLabel.Text := 'yes'
  210. else
  211. StereoLabel.Text := 'no';
  212. // Include WGL extensions
  213. (*
  214. if WGL_ARB_extensions_string then
  215. begin
  216. ExtStr := String(wglGetExtensionsStringARB(dc));
  217. while Length(ExtStr) > 0 do
  218. begin
  219. i := Pos(' ', ExtStr);
  220. if i = 0 then
  221. i := 255;
  222. ListBoxExtensions.Items.Add(Copy(ExtStr, 1, i - 1));
  223. Delete(ExtStr, 1, i);
  224. end;
  225. end;
  226. // Some extra info about the double buffer mode
  227. if (pfd.dwFlags and PFD_DOUBLEBUFFER) = PFD_DOUBLEBUFFER then
  228. begin
  229. CopyLabel.Text := '';
  230. if (pfd.dwFlags and PFD_SWAP_EXCHANGE) > 0 then
  231. CopyLabel.Text := 'exchange';
  232. if (pfd.dwFlags and PFD_SWAP_COPY) > 0 then
  233. begin
  234. if Length(CopyLabel.Text) > 0 then
  235. CopyLabel.Text := CopyLabel.Text + ', ';
  236. CopyLabel.Text := CopyLabel.Text + 'copy';
  237. end;
  238. if Length(CopyLabel.Text) = 0 then
  239. CopyLabel.Text := 'no info available';
  240. end
  241. else
  242. begin
  243. CopyLabel.Text := 'n/a';
  244. end;
  245. // buffer and pixel depths
  246. ColorLabel.Text :=
  247. Format('red: %d, green: %d, blue: %d, alpha: %d bits',
  248. [LimitOf[limRedBits], LimitOf[limGreenBits], LimitOf[limBlueBits],
  249. LimitOf[limAlphaBits]]);
  250. DepthLabel.Text := Format('%d bits', [LimitOf[limDepthBits]]);
  251. StencilLabel.Text := Format('%d bits', [LimitOf[limStencilBits]]);
  252. AccumLabel.Text :=
  253. Format('red: %d, green: %d, blue: %d, alpha: %d bits',
  254. [LimitOf[limAccumRedBits], LimitOf[limAccumGreenBits],
  255. LimitOf[limAccumBlueBits], LimitOf[limAccumAlphaBits]]);
  256. IntLimitToLabel(AuxLabel, limAuxBuffers);
  257. IntLimitToLabel(SubLabel, limSubpixelBits);
  258. OverlayLabel.Text := IntToStr(pfd.bReserved and 7);
  259. UnderlayLabel.Text := IntToStr(pfd.bReserved shr 3);
  260. *)
  261. // Maximum values
  262. IntLimitToLabel(ClipLabel, limClipPlanes);
  263. IntLimitToLabel(EvalLabel, limEvalOrder);
  264. IntLimitToLabel(LightLabel, limLights);
  265. IntLimitToLabel(ListLabel, limListNesting);
  266. IntLimitToLabel(ModelLabel, limModelViewStack);
  267. IntLimitToLabel(ViewLabel, limViewportDims);
  268. IntLimitToLabel(NameLabel, limNameStack);
  269. IntLimitToLabel(PixelLabel, limPixelMapTable);
  270. IntLimitToLabel(ProjLabel, limProjectionStack);
  271. IntLimitToLabel(TexSizeLabel, limTextureSize);
  272. IntLimitToLabel(TexStackLabel, limTextureStack);
  273. IntLimitToLabel(TexUnitsLabel, limNbTextureUnits);
  274. end;
  275. VersionLabel.Text := GetSceneVersion;
  276. finally
  277. aSceneBuffer.RenderingContext.Deactivate;
  278. end;
  279. end;
  280. procedure TInfoForm.ButtonCloseClick(Sender: TObject);
  281. begin
  282. Close;
  283. end;
  284. procedure TInfoForm.FormKeyDown(Sender: TObject; var Key: Word;
  285. var KeyChar: Char; Shift: TShiftState);
  286. begin
  287. /// if Key = #27 then
  288. Close;
  289. end;
  290. procedure TInfoForm.FormClose(Sender: TObject; var Action: TCloseAction);
  291. begin
  292. Release;
  293. end;
  294. // -------------------------------------------------------------------
  295. procedure TInfoForm.ListBoxExtensionsDblClick(Sender: TObject);
  296. var
  297. p: Integer;
  298. url, buf: String;
  299. begin
  300. with ListBoxExtensions do
  301. begin
  302. if ItemIndex < 0 then
  303. Exit;
  304. url := Items[ItemIndex];
  305. end;
  306. p := Pos('_', url);
  307. buf := Copy(url, 1, p - 1);
  308. url := Copy(url, p + 1, 255);
  309. if (buf <> 'GL') and (buf <> 'WGL') and (buf <> 'GLX') then
  310. Exit;
  311. p := Pos('_', url);
  312. buf := Copy(url, 1, p - 1);
  313. url := 'http://www.opengl.org/registry/specs/' + buf + '/' +
  314. Copy(url, p + 1, 255) + '.txt';
  315. { TODO -cIncompatibility : Find substitution to ShellExecute(0, 'open', PChar(Url), nil, nil, SW_SHOW); }
  316. ///ShowHTMLUrl(url);
  317. end;
  318. // -------------------------------------------------------------------
  319. procedure TInfoForm.TextInfoClick(Sender: TObject);
  320. begin
  321. end;
  322. // -------------------------------------------------------------------
  323. function TInfoForm.GetSceneVersion: string;
  324. var
  325. FExePath, FgxSceneRevision: string;
  326. begin
  327. FgxSceneRevision := Copy('Scene_REVISION', 12, 4);
  328. FExePath := ExtractFilePath(ParamStr(0));
  329. if FileExists(FExePath + 'SceneRevision') then
  330. try
  331. with TStringList.Create do
  332. try
  333. LoadFromFile(FExePath + 'SceneRevision');
  334. if (Count >= 1) and (trim(Strings[0]) <> '') then
  335. FgxSceneRevision:= trim(Strings[0]);
  336. finally
  337. Free;
  338. end;
  339. except
  340. end;
  341. Result := Format('GLXcene_VERSION', [FGXSceneRevision]);
  342. end;
  343. // -------------------------------------------------------------------
  344. procedure TInfoForm.WebSiteLblClick(Sender: TObject);
  345. begin
  346. /// ShellExecute(0, 'open', PChar(Url), nil, nil, SW_SHOW);
  347. /// ShowHTMLUrl(WebSiteLbl.Text);
  348. end;
  349. // ------------------------------------------------------------------------------
  350. initialization
  351. // ------------------------------------------------------------------------------
  352. RegisterInfoForm(ShowInfoForm);
  353. end.