FMxInfo.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. //
  2. // The graphics platform GLArena https://github.com/glscene
  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. GLX.OpenGL,
  27. GLX.Scene,
  28. GLX.Context,
  29. Scena.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. procedure ButtonCloseClick(Sender: TObject);
  109. procedure WebSiteLblClick(Sender: TObject);
  110. procedure FormShow(Sender: TObject);
  111. procedure FormCreate(Sender: TObject);
  112. procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
  113. Shift: TShiftState);
  114. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  115. procedure ListBoxExtensionsDblClick(Sender: TObject);
  116. procedure TextInfoClick(Sender: TObject);
  117. protected
  118. function GetSceneVersion: string;
  119. public
  120. procedure GetInfoFrom(aSceneBuffer: TgxSceneBuffer);
  121. end;
  122. var
  123. InfoForm: TInfoForm;
  124. //=======================================================================
  125. implementation
  126. //=======================================================================
  127. {$R *.fmx}
  128. procedure ShowInfoForm(aSceneBuffer: TgxSceneBuffer; Modal: boolean);
  129. var
  130. infoForm: TInfoForm;
  131. begin
  132. infoForm := TInfoForm.Create(nil);
  133. try
  134. infoForm.GetInfoFrom(aSceneBuffer);
  135. with infoForm do
  136. if Modal then
  137. ShowModal
  138. else
  139. Show;
  140. except
  141. infoForm.Free;
  142. raise;
  143. end;
  144. end;
  145. //---------------------------------------
  146. // TInfoForm }
  147. //---------------------------------------
  148. procedure TInfoForm.FormCreate(Sender: TObject);
  149. begin
  150. TabControl.ActiveTab := TabItemScene;
  151. end;
  152. procedure TInfoForm.FormShow(Sender: TObject);
  153. begin
  154. TabControl.ActiveTab := TabItemScene;
  155. end;
  156. procedure TInfoForm.GetInfoFrom(aSceneBuffer: TgxSceneBuffer);
  157. { TODO -cIncompatibility : Need to replace TPixelFormatDescriptor and HDC }
  158. ///const
  159. ///DRIVER_MASK = PFD_GENERIC_FORMAT or PFD_GENERIC_ACCELERATED;
  160. var
  161. ///pfd: TPixelFormatDescriptor;
  162. pixelFormat: Integer;
  163. ///dc: HDC; /// HDC - in Winapi.Windows should be replaced with...
  164. i: Integer;
  165. ExtStr: String;
  166. procedure IntLimitToLabel(const aLabel: TLabel; const aLimit: TLimitType);
  167. begin
  168. aLabel.Text := IntToStr(aSceneBuffer.LimitOf[aLimit]);
  169. end;
  170. begin
  171. Caption := Caption + ' (current context in ' +
  172. (aSceneBuffer.Owner as TComponent).Name + ')';
  173. aSceneBuffer.RenderingContext.Activate;
  174. try
  175. with aSceneBuffer do
  176. begin
  177. // common properties
  178. VendorLabel.Text := String(glGetString(GL_VENDOR));
  179. RendererLabel.Text := String(glGetString(GL_RENDERER));
  180. (*
  181. dc := wglGetCurrentDC();
  182. pixelFormat := GetPixelFormat(dc);
  183. DescribePixelFormat(dc, pixelFormat, SizeOf(pfd), pfd);
  184. // figure out the driver type
  185. if (DRIVER_MASK and pfd.dwFlags) = 0 then
  186. AccLabel.Text := 'Installable Client Driver'
  187. else if (DRIVER_MASK and pfd.dwFlags) = DRIVER_MASK then
  188. AccLabel.Text := 'Mini-Client Driver'
  189. else if (DRIVER_MASK and pfd.dwFlags) = PFD_GENERIC_FORMAT then
  190. AccLabel.Text := 'Generic Software Driver';
  191. *)
  192. VersionLabel.Text := String(glGetString(GL_VERSION));
  193. ExtStr := String(glGetString(GL_EXTENSIONS));
  194. ListBoxExtensions.Clear;
  195. while Length(ExtStr) > 0 do
  196. begin
  197. i := Pos(' ', ExtStr);
  198. if i = 0 then
  199. i := 255;
  200. ListBoxExtensions.Items.Add(Copy(ExtStr, 1, i - 1));
  201. Delete(ExtStr, 1, i);
  202. end;
  203. if LimitOf[limDoubleBuffer] = GL_TRUE then
  204. DoubleLabel.Text := 'yes'
  205. else
  206. DoubleLabel.Text := 'no';
  207. if LimitOf[limStereo] = GL_TRUE then
  208. StereoLabel.Text := 'yes'
  209. else
  210. StereoLabel.Text := 'no';
  211. // Include WGL extensions
  212. (*
  213. if WGL_ARB_extensions_string then
  214. begin
  215. ExtStr := String(wglGetExtensionsStringARB(dc));
  216. while Length(ExtStr) > 0 do
  217. begin
  218. i := Pos(' ', ExtStr);
  219. if i = 0 then
  220. i := 255;
  221. ListBoxExtensions.Items.Add(Copy(ExtStr, 1, i - 1));
  222. Delete(ExtStr, 1, i);
  223. end;
  224. end;
  225. // Some extra info about the double buffer mode
  226. if (pfd.dwFlags and PFD_DOUBLEBUFFER) = PFD_DOUBLEBUFFER then
  227. begin
  228. CopyLabel.Text := '';
  229. if (pfd.dwFlags and PFD_SWAP_EXCHANGE) > 0 then
  230. CopyLabel.Text := 'exchange';
  231. if (pfd.dwFlags and PFD_SWAP_COPY) > 0 then
  232. begin
  233. if Length(CopyLabel.Text) > 0 then
  234. CopyLabel.Text := CopyLabel.Text + ', ';
  235. CopyLabel.Text := CopyLabel.Text + 'copy';
  236. end;
  237. if Length(CopyLabel.Text) = 0 then
  238. CopyLabel.Text := 'no info available';
  239. end
  240. else
  241. begin
  242. CopyLabel.Text := 'n/a';
  243. end;
  244. // buffer and pixel depths
  245. ColorLabel.Text :=
  246. Format('red: %d, green: %d, blue: %d, alpha: %d bits',
  247. [LimitOf[limRedBits], LimitOf[limGreenBits], LimitOf[limBlueBits],
  248. LimitOf[limAlphaBits]]);
  249. DepthLabel.Text := Format('%d bits', [LimitOf[limDepthBits]]);
  250. StencilLabel.Text := Format('%d bits', [LimitOf[limStencilBits]]);
  251. AccumLabel.Text :=
  252. Format('red: %d, green: %d, blue: %d, alpha: %d bits',
  253. [LimitOf[limAccumRedBits], LimitOf[limAccumGreenBits],
  254. LimitOf[limAccumBlueBits], LimitOf[limAccumAlphaBits]]);
  255. IntLimitToLabel(AuxLabel, limAuxBuffers);
  256. IntLimitToLabel(SubLabel, limSubpixelBits);
  257. OverlayLabel.Text := IntToStr(pfd.bReserved and 7);
  258. UnderlayLabel.Text := IntToStr(pfd.bReserved shr 3);
  259. *)
  260. // Maximum values
  261. IntLimitToLabel(ClipLabel, limClipPlanes);
  262. IntLimitToLabel(EvalLabel, limEvalOrder);
  263. IntLimitToLabel(LightLabel, limLights);
  264. IntLimitToLabel(ListLabel, limListNesting);
  265. IntLimitToLabel(ModelLabel, limModelViewStack);
  266. IntLimitToLabel(ViewLabel, limViewportDims);
  267. IntLimitToLabel(NameLabel, limNameStack);
  268. IntLimitToLabel(PixelLabel, limPixelMapTable);
  269. IntLimitToLabel(ProjLabel, limProjectionStack);
  270. IntLimitToLabel(TexSizeLabel, limTextureSize);
  271. IntLimitToLabel(TexStackLabel, limTextureStack);
  272. IntLimitToLabel(TexUnitsLabel, limNbTextureUnits);
  273. end;
  274. VersionLabel.Text := GetSceneVersion;
  275. finally
  276. aSceneBuffer.RenderingContext.Deactivate;
  277. end;
  278. end;
  279. procedure TInfoForm.ButtonCloseClick(Sender: TObject);
  280. begin
  281. Close;
  282. end;
  283. procedure TInfoForm.FormKeyDown(Sender: TObject; var Key: Word;
  284. var KeyChar: Char; Shift: TShiftState);
  285. begin
  286. /// if Key = #27 then
  287. Close;
  288. end;
  289. procedure TInfoForm.FormClose(Sender: TObject; var Action: TCloseAction);
  290. begin
  291. Release;
  292. end;
  293. // -------------------------------------------------------------------
  294. procedure TInfoForm.ListBoxExtensionsDblClick(Sender: TObject);
  295. var
  296. p: Integer;
  297. url, buf: String;
  298. begin
  299. with ListBoxExtensions do
  300. begin
  301. if ItemIndex < 0 then
  302. Exit;
  303. url := Items[ItemIndex];
  304. end;
  305. p := Pos('_', url);
  306. buf := Copy(url, 1, p - 1);
  307. url := Copy(url, p + 1, 255);
  308. if (buf <> 'GL') and (buf <> 'WGL') and (buf <> 'GLX') then
  309. Exit;
  310. p := Pos('_', url);
  311. buf := Copy(url, 1, p - 1);
  312. url := 'http://www.opengl.org/registry/specs/' + buf + '/' +
  313. Copy(url, p + 1, 255) + '.txt';
  314. { TODO -cIncompatibility : Find substitution to ShellExecute(0, 'open', PChar(Url), nil, nil, SW_SHOW); }
  315. ///ShowHTMLUrl(url);
  316. end;
  317. // -------------------------------------------------------------------
  318. procedure TInfoForm.TextInfoClick(Sender: TObject);
  319. begin
  320. end;
  321. // -------------------------------------------------------------------
  322. function TInfoForm.GetSceneVersion: string;
  323. var
  324. FExePath, FgxSceneRevision: string;
  325. begin
  326. FgxSceneRevision := Copy('Scene_REVISION', 12, 4);
  327. FExePath := ExtractFilePath(ParamStr(0));
  328. if FileExists(FExePath + 'SceneRevision') then
  329. try
  330. with TStringList.Create do
  331. try
  332. LoadFromFile(FExePath + 'SceneRevision');
  333. if (Count >= 1) and (trim(Strings[0]) <> '') then
  334. FgxSceneRevision:= trim(Strings[0]);
  335. finally
  336. Free;
  337. end;
  338. except
  339. end;
  340. Result := Format('GLXcene_VERSION', [FGXSceneRevision]);
  341. end;
  342. // -------------------------------------------------------------------
  343. procedure TInfoForm.WebSiteLblClick(Sender: TObject);
  344. begin
  345. /// ShellExecute(0, 'open', PChar(Url), nil, nil, SW_SHOW);
  346. /// ShowHTMLUrl(WebSiteLbl.Text);
  347. end;
  348. // ------------------------------------------------------------------------------
  349. initialization
  350. // ------------------------------------------------------------------------------
  351. RegisterInfoForm(ShowInfoForm);
  352. end.