fGLSViewer.pas 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272
  1. unit fGLSViewer;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.Messages,
  6. Winapi.OpenGL,
  7. Winapi.ShellAPI,
  8. System.SysUtils,
  9. System.Classes,
  10. System.IniFiles,
  11. System.Win.Registry,
  12. System.ImageList,
  13. System.Math,
  14. System.Actions,
  15. System.Types,
  16. Vcl.Graphics,
  17. Vcl.Controls,
  18. Vcl.Forms,
  19. Vcl.Dialogs,
  20. Vcl.ActnList,
  21. Vcl.Menus,
  22. Vcl.ImgList,
  23. Vcl.ToolWin,
  24. Vcl.ComCtrls,
  25. Vcl.ExtDlgs,
  26. Vcl.ExtCtrls,
  27. Vcl.ActnMan,
  28. Vcl.ActnCtrls,
  29. Vcl.ActnMenus,
  30. Vcl.StdActns,
  31. Vcl.BandActn,
  32. Vcl.StdStyleActnCtrls,
  33. Vcl.VirtualImageList,
  34. Vcl.BaseImageCollection,
  35. Vcl.ImageCollection,
  36. GLS.Material,
  37. GLS.Scene,
  38. GLS.SceneViewer,
  39. GLS.VectorFileObjects,
  40. GLS.Objects,
  41. GLS.VectorGeometry,
  42. GLS.Texture,
  43. GLS.Context,
  44. GLS.VectorLists,
  45. GLS.Cadencer,
  46. GLS.Coordinates,
  47. GLS.BaseClasses,
  48. GLS.State,
  49. GLS.RenderContextInfo,
  50. GLS.TextureFormat,
  51. GLS.Color,
  52. GLS.Keyboard,
  53. GLS.Graphics,
  54. GLS.PersistentClasses,
  55. GLS.MeshUtils,
  56. GLS.VectorTypes,
  57. GnuGettext,
  58. GLS.AsyncTimer,
  59. GLS.Graph,
  60. GLS.MeshBuilder,
  61. GLS.Navigator,
  62. GLS.Utils,
  63. GLS.SimpleNavigation,
  64. fGLForm,
  65. fGLAbout,
  66. fGLOptions,
  67. fGLDialog,
  68. dImages,
  69. dDialogs, GLS.GeomObjects;
  70. type
  71. TFormGLSViewer = class(TGLForm)
  72. StatusBar: TStatusBar;
  73. Scene: TGLScene;
  74. ffObject: TGLFreeForm;
  75. LightSource: TGLLightSource;
  76. MaterialLib: TGLMaterialLibrary;
  77. CubeLines: TGLCube;
  78. dcObject: TGLDummyCube;
  79. Camera: TGLCamera;
  80. dcAxis: TGLDummyCube;
  81. Cadencer: TGLCadencer;
  82. Timer: TTimer;
  83. snViewer: TGLSceneViewer;
  84. ActionManager: TActionManager;
  85. acOptimizeMesh: TAction;
  86. acProcessInvertNormals: TAction;
  87. acReverseRendering: TAction;
  88. acConvertToTriangles: TAction;
  89. acProcessStripify: TAction;
  90. acToolsOptions: TAction;
  91. acToolsFaceCulling: TAction;
  92. acToolsTexturing: TAction;
  93. acToolsLighting: TAction;
  94. acToolsCustomize: TCustomizeActionBars;
  95. acToolsShowFPS: TAction;
  96. acViewSmoothShading: TAction;
  97. acViewFlatShading: TAction;
  98. acViewFlatLines: TAction;
  99. acViewHiddenLines: TAction;
  100. acViewWireFrame: TAction;
  101. acViewZoomIn: TAction;
  102. acViewZoomOut: TAction;
  103. acViewReset: TAction;
  104. acFileOpen: TAction;
  105. acFilePick: TAction;
  106. acFileOpenTexLib: TAction;
  107. acFileSaveAs: TAction;
  108. acFileSaveTextures: TAction;
  109. acFileExit: TAction;
  110. acHelpContents: THelpContents;
  111. acHelpTopicSearch: THelpTopicSearch;
  112. acHelpGLSHomePage: TAction;
  113. acHelpAbout: TAction;
  114. acAADefault: TAction;
  115. acAA2X: TAction;
  116. acAA4X: TAction;
  117. acEditUndo: TEditUndo;
  118. acEditCut: TEditCut;
  119. acEditCopy: TEditCopy;
  120. acEditPaste: TEditPaste;
  121. acEditSelectAll: TEditSelectAll;
  122. acEditDelete: TEditDelete;
  123. ImageListMenu: TImageList;
  124. ControlBar: TControlBar;
  125. amMenuBar: TActionMainMenuBar;
  126. acAA8X: TAction;
  127. acAA16X: TAction;
  128. acCSA8X: TAction;
  129. acCSA16X: TAction;
  130. atbTools: TActionToolBar;
  131. atbView: TActionToolBar;
  132. atbFile: TActionToolBar;
  133. acPoints: TAction;
  134. AsyncTimer: TGLAsyncTimer;
  135. dcWorld: TGLDummyCube;
  136. XYZGrid: TGLXYZGrid;
  137. acToolsNaviCube: TAction;
  138. GLPoints: TGLPoints;
  139. acToolsInfo: TAction;
  140. GLSimpleNavigation: TGLSimpleNavigation;
  141. acSpheres: TAction;
  142. PanelLeft: TPanel;
  143. tvScene: TTreeView;
  144. ImageListObjects: TImageList;
  145. acSaveTreeView: TAction;
  146. acLoadTreeView: TAction;
  147. OpenDialog: TOpenDialog;
  148. SaveDialog: TSaveDialog;
  149. procedure AsyncTimerTimer(Sender: TObject);
  150. procedure FormCreate(Sender: TObject);
  151. procedure snViewerMouseDown(Sender: TObject; Button: TMouseButton;
  152. Shift: TShiftState; X, Y: Integer);
  153. procedure snViewerMouseMove(Sender: TObject; Shift: TShiftState;
  154. X, Y: Integer);
  155. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  156. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  157. procedure snViewerMouseUp(Sender: TObject; Button: TMouseButton;
  158. Shift: TShiftState; X, Y: Integer);
  159. procedure snViewerBeforeRender(Sender: TObject);
  160. procedure snViewerAfterRender(Sender: TObject);
  161. procedure FormShow(Sender: TObject);
  162. procedure MaterialLibTextureNeeded(Sender: TObject;
  163. var textureFileName: String);
  164. procedure acInvertNormalsExecute(Sender: TObject);
  165. procedure acSaveAsUpdate(Sender: TObject);
  166. procedure acReverseRenderingOrderExecute(Sender: TObject);
  167. procedure acConvertToIndexedTrianglesExecute(Sender: TObject);
  168. procedure CadencerProgress(Sender: TObject;
  169. const deltaTime, newTime: Double);
  170. procedure TimerTimer(Sender: TObject);
  171. procedure acOptimizeExecute(Sender: TObject);
  172. procedure acStripifyExecute(Sender: TObject);
  173. procedure acHelpAboutExecute(Sender: TObject);
  174. procedure acFilePickExecute(Sender: TObject);
  175. procedure acFileOpenTexLibExecute(Sender: TObject);
  176. procedure acFileOpenExecute(Sender: TObject);
  177. procedure acFileSaveAsExecute(Sender: TObject);
  178. procedure acFileSaveTexturesExecute(Sender: TObject);
  179. procedure acFileExitExecute(Sender: TObject);
  180. procedure acToolsOptionsExecute(Sender: TObject);
  181. procedure acToolsTexturingExecute(Sender: TObject);
  182. procedure acToolsFaceCullingExecute(Sender: TObject);
  183. procedure acToolsLightingExecute(Sender: TObject);
  184. procedure acToolsShowFPSExecute(Sender: TObject);
  185. procedure acAADefaultExecute(Sender: TObject);
  186. procedure acViewSmoothShadingExecute(Sender: TObject);
  187. procedure acViewFlatShadingExecute(Sender: TObject);
  188. procedure acViewFlatLinesExecute(Sender: TObject);
  189. procedure acViewHiddenLinesExecute(Sender: TObject);
  190. procedure acViewWireFrameExecute(Sender: TObject);
  191. procedure acViewResetExecute(Sender: TObject);
  192. procedure acViewZoomOutExecute(Sender: TObject);
  193. procedure acViewZoomInExecute(Sender: TObject);
  194. procedure acPointsExecute(Sender: TObject);
  195. procedure acToolsNaviCubeExecute(Sender: TObject);
  196. procedure acToolsInfoExecute(Sender: TObject);
  197. procedure snViewerMouseLeave(Sender: TObject);
  198. procedure tvSceneCheckStateChanged(Sender: TCustomTreeView; Node: TTreeNode;
  199. CheckState: TNodeCheckState);
  200. procedure acHelpGLSHomePageExecute(Sender: TObject);
  201. procedure acHelpContentsExecute(Sender: TObject);
  202. procedure acHelpTopicSearchExecute(Sender: TObject);
  203. procedure acSaveTreeViewExecute(Sender: TObject);
  204. procedure acLoadTreeViewExecute(Sender: TObject);
  205. procedure tvSceneClick(Sender: TObject);
  206. procedure acSpheresExecute(Sender: TObject);
  207. private
  208. AssetPath: TFileName;
  209. Lines: TGLLines;
  210. Plane: TGLPlane;
  211. Polygon: TGLPolygon;
  212. Cube: TGLCube;
  213. Frustrum: TGLFrustrum;
  214. Sphere: TGLSphere;
  215. Disk: TGLDisk;
  216. Cone: TGLCone;
  217. Cylinder: TGLCylinder;
  218. Capsule: TGLCapsule;
  219. Dodecahedron: TGLDodecahedron;
  220. Icosahedron: TGLIcosahedron;
  221. Hexahedron: TGLHexahedron;
  222. Octahedron: TGLOctahedron;
  223. Tetrahedron: TGLTetrahedron;
  224. SuperEllipsoid: TGLSuperEllipsoid;
  225. procedure DoResetCamera;
  226. procedure SetupFreeFormShading;
  227. procedure ApplyShadeModeToMaterial(aMaterial: TGLMaterial);
  228. procedure ApplyShadeMode;
  229. procedure ApplyFSAA;
  230. procedure ApplyFaceCull;
  231. procedure ApplyTexturing;
  232. procedure ApplyFPS;
  233. procedure DoOpen(const FileName: String);
  234. public
  235. md, nthShow: Boolean;
  236. mx, my: Integer;
  237. hlShader: TGLShader;
  238. lastFileName: String;
  239. lastLoadWithTextures: Boolean;
  240. Points: TGLPoints;
  241. procedure ApplyBgColor;
  242. procedure ReadIniFile; override;
  243. procedure WriteIniFile; override;
  244. end;
  245. var
  246. FormGLSViewer: TFormGLSViewer;
  247. NaviCube: TGLNaviCube;
  248. //=======================================================================
  249. implementation
  250. //=======================================================================
  251. {$R *.dfm}
  252. uses
  253. GLS.FileOBJ,
  254. GLS.FileSTL,
  255. GLS.FileLWO,
  256. GLS.FileQ3BSP,
  257. GLS.FileOCT,
  258. GLS.FileMS3D,
  259. GLS.FileNMF,
  260. GLS.FileMD3,
  261. GLS.File3DS,
  262. GLS.FileMD2,
  263. GLS.FileSMD,
  264. GLS.FilePLY,
  265. GLS.FileGTS,
  266. GLS.FileVRML,
  267. GLS.FileMD5,
  268. GLS.FileTIN,
  269. GLS.FileDXF,
  270. GLS.FileGRD,
  271. GLS.FileX,
  272. GLS.FileGLTF;
  273. type
  274. // Hidden line shader (specific implem for the viewer, *not* generic)
  275. THiddenLineShader = class(TGLShader)
  276. private
  277. LinesColor: TGLColorVector;
  278. BackgroundColor: TGLColorVector;
  279. PassCount: Integer;
  280. public
  281. procedure DoApply(var rci: TGLRenderContextInfo; Sender: TObject); override;
  282. function DoUnApply(var rci: TGLRenderContextInfo): Boolean; override;
  283. end;
  284. //---------------------------------------------------------------------------
  285. procedure THiddenLineShader.DoApply(var rci: TGLRenderContextInfo;
  286. Sender: TObject);
  287. begin
  288. PassCount := 1;
  289. with rci.GLStates do
  290. begin
  291. PolygonMode := pmFill;
  292. gl.Color3fv(@BackgroundColor);
  293. ActiveTextureEnabled[ttTexture2D] := False;
  294. Enable(stPolygonOffsetFill);
  295. PolygonOffsetFactor := 1;
  296. PolygonOffsetUnits := 2;
  297. end;
  298. end;
  299. function THiddenLineShader.DoUnApply(var rci: TGLRenderContextInfo): Boolean;
  300. begin
  301. case PassCount of
  302. 1:
  303. with rci.GLStates do
  304. begin
  305. PassCount := 2;
  306. PolygonMode := pmLines;
  307. glColor3fv(@LinesColor);
  308. Disable(stLighting);
  309. Result := True;
  310. end;
  311. 2:
  312. begin
  313. rci.GLStates.Disable(stPolygonOffsetFill);
  314. Result := False;
  315. end;
  316. else
  317. // doesn't hurt to be cautious
  318. Assert(False);
  319. Result := False;
  320. end;
  321. end;
  322. //---------------------------------------------------------------------------
  323. procedure TFormGLSViewer.FormCreate(Sender: TObject);
  324. begin
  325. inherited;
  326. AssetPath := GetCurrentAssetPath();
  327. NaviCube := TGLNaviCube.CreateAsChild(Scene.Objects);
  328. NaviCube.SceneViewer := snViewer;
  329. NaviCube.FPS := 30;
  330. // instantiate our specific hidden-lines shader
  331. hlShader := THiddenLineShader.Create(Self);
  332. ffObject.IgnoreMissingTextures := True;
  333. tvScene.FullExpand;
  334. tvScene.Select(tvScene.Items[9]); // goto to Cube
  335. tvSceneClick(Self);
  336. end;
  337. procedure TFormGLSViewer.FormShow(Sender: TObject);
  338. begin
  339. if not nthShow then
  340. begin
  341. // using formats supported by gls
  342. dmDialogs.OpenDialog.InitialDir := AssetPath + '\model';;
  343. dmDialogs.OpenDialog.Filter := VectorFileFormatsFilter;
  344. dmDialogs.SaveDialog.Filter := VectorFileFormatsSaveFilter;
  345. ApplyFSAA;
  346. ApplyFaceCull;
  347. ApplyFPS;
  348. if ParamCount > 0 then
  349. DoOpen(ParamStr(0));
  350. nthShow := True;
  351. end;
  352. end;
  353. //---------------------------------------------------------------------------
  354. // OpenDialog
  355. //---------------------------------------------------------------------------
  356. procedure TFormGLSViewer.acFileOpenExecute(Sender: TObject);
  357. begin
  358. NaviCube.ActiveMouse := False;
  359. if dmDialogs.OpenDialog.Execute then
  360. DoOpen(dmDialogs.OpenDialog.FileName);
  361. end;
  362. procedure TFormGLSViewer.acFileOpenTexLibExecute(Sender: TObject);
  363. var
  364. I: Integer;
  365. begin
  366. dmDialogs.ODTextures.InitialDir := AssetPath + '\texture';;
  367. if dmDialogs.ODTextures.Execute then
  368. with MaterialLib do
  369. begin
  370. LoadFromFile(dmDialogs.ODTextures.FileName);
  371. for I := 0 to Materials.Count - 1 do
  372. with Materials[I].Material do
  373. BackProperties.Assign(FrontProperties);
  374. ApplyShadeMode;
  375. ApplyTexturing;
  376. end;
  377. end;
  378. procedure TFormGLSViewer.acFilePickExecute(Sender: TObject);
  379. begin
  380. dmDialogs.ODTextures.InitialDir := AssetPath + '\texture';;
  381. if dmDialogs.opDialog.Execute then
  382. begin
  383. with MaterialLib.Materials do
  384. begin
  385. with Items[Count - 1] do
  386. begin
  387. Tag := 1;
  388. Material.Texture.Image.LoadFromFile(dmDialogs.opDialog.FileName);
  389. Material.Texture.Enabled := True;
  390. end;
  391. end;
  392. ApplyTexturing;
  393. end;
  394. end;
  395. procedure TFormGLSViewer.acFileSaveAsExecute(Sender: TObject);
  396. var
  397. ext: String;
  398. begin
  399. if dmDialogs.SaveDialog.Execute then
  400. begin
  401. ext := ExtractFileExt(dmDialogs.SaveDialog.FileName);
  402. if ext = '' then
  403. dmDialogs.SaveDialog.FileName :=
  404. ChangeFileExt(dmDialogs.SaveDialog.FileName,
  405. '.' + GetVectorFileFormats.FindExtByIndex
  406. (dmDialogs.SaveDialog.FilterIndex, False, True));
  407. if GetVectorFileFormats.FindFromFileName(dmDialogs.SaveDialog.FileName) = nil
  408. then
  409. ShowMessage(_('Unsupported or unspecified file extension.'))
  410. else
  411. ffObject.SaveToFile(dmDialogs.SaveDialog.FileName);
  412. end;
  413. end;
  414. procedure TFormGLSViewer.acFileSaveTexturesExecute(Sender: TObject);
  415. begin
  416. if dmDialogs.SDTextures.Execute then
  417. MaterialLib.SaveToFile(dmDialogs.SDTextures.FileName);
  418. end;
  419. procedure TFormGLSViewer.snViewerBeforeRender(Sender: TObject);
  420. begin
  421. THiddenLineShader(hlShader).LinesColor := VectorMake(107 / 256, 123 / 256,
  422. 173 / 256, 1);
  423. THiddenLineShader(hlShader).BackgroundColor :=
  424. ConvertWinColor(snViewer.Buffer.BackgroundColor);
  425. if not gl.ARB_multisample then
  426. begin
  427. acAADefault.Checked := True;
  428. acAA2X.Enabled := False;
  429. acAA4X.Enabled := False;
  430. acAA8X.Enabled := False;
  431. acAA16X.Enabled := False;
  432. acCSA8X.Enabled := False;
  433. acCSA16X.Enabled := False;
  434. end;
  435. end;
  436. procedure TFormGLSViewer.snViewerAfterRender(Sender: TObject);
  437. begin
  438. ApplyFSAA;
  439. Screen.Cursor := crDefault;
  440. end;
  441. procedure TFormGLSViewer.DoResetCamera;
  442. var
  443. objSize: Single;
  444. begin
  445. dcObject.Position.AsVector := NullHmgPoint;
  446. Camera.Position.SetPoint(0, 4, 5);
  447. ffObject.Position.AsVector := NullHmgPoint;
  448. ffObject.Up.Assign(dcAxis.Up);
  449. ffObject.Direction.Assign(dcAxis.Direction);
  450. objSize := ffObject.BoundingSphereRadius;
  451. if objSize > 0 then
  452. begin
  453. if objSize < 1 then
  454. begin
  455. Camera.SceneScale := 1 / objSize;
  456. objSize := 1;
  457. end
  458. else
  459. Camera.SceneScale := 1;
  460. Camera.AdjustDistanceToTarget(objSize * 0.27);
  461. Camera.DepthOfView := 1.5 * Camera.DistanceToTarget + 2 * objSize;
  462. end;
  463. end;
  464. procedure TFormGLSViewer.ApplyShadeModeToMaterial(aMaterial: TGLMaterial);
  465. begin
  466. if acViewSmoothShading.Checked then
  467. begin
  468. snViewer.Buffer.Lighting := True;
  469. snViewer.Buffer.ShadeModel := smSmooth;
  470. aMaterial.PolygonMode := pmFill;
  471. end
  472. else if acViewFlatShading.Checked then
  473. begin
  474. snViewer.Buffer.Lighting := True;
  475. snViewer.Buffer.ShadeModel := smFlat;
  476. aMaterial.PolygonMode := pmFill;
  477. end
  478. else if acViewFlatLines.Checked then
  479. begin
  480. snViewer.Buffer.Lighting := True;
  481. snViewer.Buffer.ShadeModel := smFlat;
  482. aMaterial.PolygonMode := pmLines;
  483. end
  484. else if acViewHiddenLines.Checked then
  485. begin
  486. snViewer.Buffer.Lighting := False;
  487. snViewer.Buffer.ShadeModel := smSmooth;
  488. aMaterial.PolygonMode := pmLines;
  489. end
  490. else if acViewWireFrame.Checked then
  491. begin
  492. snViewer.Buffer.Lighting := False;
  493. snViewer.Buffer.ShadeModel := smSmooth;
  494. aMaterial.PolygonMode := pmLines;
  495. end;
  496. end;
  497. procedure TFormGLSViewer.ApplyShadeMode;
  498. var
  499. I: Integer;
  500. begin
  501. with MaterialLib.Materials do
  502. for I := 0 to Count - 1 do
  503. begin
  504. ApplyShadeModeToMaterial(Items[I].Material);
  505. if (acViewHiddenLines.Checked) or (acViewFlatLines.Checked) then
  506. Items[I].Shader := hlShader
  507. else
  508. Items[I].Shader := nil;
  509. end;
  510. snViewer.Buffer.Lighting := acToolsLighting.Checked;
  511. ffObject.StructureChanged;
  512. end;
  513. procedure TFormGLSViewer.ApplyFSAA;
  514. begin
  515. with snViewer.Buffer do
  516. begin
  517. if acAADefault.Checked then
  518. AntiAliasing := aaDefault
  519. else if acAA2X.Checked then
  520. AntiAliasing := aa2x
  521. else if acAA4X.Checked then
  522. AntiAliasing := aa4x
  523. else if acAA8X.Checked then
  524. AntiAliasing := aa8x
  525. else if acAA16X.Checked then
  526. AntiAliasing := aa16x
  527. else if acCSA8X.Checked then
  528. AntiAliasing := csa8x
  529. else if acCSA16X.Checked then
  530. AntiAliasing := csa16x;
  531. end;
  532. end;
  533. procedure TFormGLSViewer.ApplyFaceCull;
  534. begin
  535. with snViewer.Buffer do
  536. begin
  537. if acToolsFaceCulling.Checked then
  538. begin
  539. FaceCulling := True;
  540. ContextOptions := ContextOptions - [roTwoSideLighting];
  541. end
  542. else
  543. begin
  544. FaceCulling := False;
  545. ContextOptions := ContextOptions + [roTwoSideLighting];
  546. end;
  547. end;
  548. end;
  549. procedure TFormGLSViewer.ApplyBgColor;
  550. var
  551. bmp: TBitmap;
  552. col: TColor;
  553. begin
  554. bmp := TBitmap.Create;
  555. try
  556. bmp.Width := 16;
  557. bmp.Height := 16;
  558. col := ColorToRGB(dmDialogs.ColorDialog.Color);
  559. snViewer.Buffer.BackgroundColor := col;
  560. bmp.Canvas.Pen.Color := col xor $FFFFFF;
  561. bmp.Canvas.Rectangle(0, 0, 16, 16);
  562. bmp.Canvas.Brush.Color := col;
  563. finally
  564. bmp.Free;
  565. end;
  566. end;
  567. procedure TFormGLSViewer.ApplyTexturing;
  568. var
  569. I: Integer;
  570. begin
  571. with MaterialLib.Materials do
  572. for I := 0 to Count - 1 do
  573. begin
  574. with Items[I].Material.Texture do
  575. begin
  576. if Enabled then
  577. Items[I].Tag := Integer(True);
  578. Enabled := Boolean(Items[I].Tag) and acToolsTexturing.Checked;
  579. end;
  580. end;
  581. ffObject.StructureChanged;
  582. end;
  583. //--------------------------------------------------------------------------
  584. procedure TFormGLSViewer.AsyncTimerTimer(Sender: TObject);
  585. begin
  586. snViewer.ResetPerformanceMonitor;
  587. end;
  588. procedure TFormGLSViewer.ApplyFPS;
  589. begin
  590. if acToolsShowFPS.Checked then
  591. begin
  592. Timer.Enabled := True;
  593. Cadencer.Enabled := True;
  594. end
  595. else
  596. begin
  597. Timer.Enabled := False;
  598. Cadencer.Enabled := False;
  599. // StatusBar.Panels[3].Text := ' FPS';
  600. end;
  601. end;
  602. procedure TFormGLSViewer.SetupFreeFormShading;
  603. var
  604. I: Integer;
  605. LibMat: TGLLibMaterial;
  606. begin
  607. if MaterialLib.Materials.Count = 0 then
  608. begin
  609. ffObject.Material.MaterialLibrary := MaterialLib;
  610. LibMat := MaterialLib.Materials.Add;
  611. ffObject.Material.LibMaterialName := LibMat.Name;
  612. LibMat.Material.FrontProperties.Diffuse.Red := 0;
  613. end;
  614. for I := 0 to MaterialLib.Materials.Count - 1 do
  615. with MaterialLib.Materials[I].Material do
  616. BackProperties.Assign(FrontProperties);
  617. ApplyShadeMode;
  618. ApplyTexturing;
  619. ApplyFPS;
  620. end;
  621. procedure TFormGLSViewer.DoOpen(const FileName: String);
  622. var
  623. min, max: TAffineVector;
  624. Name: TFileName;
  625. begin
  626. if not FileExists(FileName) then
  627. Exit;
  628. Screen.Cursor := crHourGlass;
  629. FormGLSViewer.Caption := 'GLSViewer - ' + FileName;
  630. MaterialLib.Materials.Clear;
  631. ffObject.MeshObjects.Clear;
  632. ffObject.LoadFromFile(FileName);
  633. SetupFreeFormShading;
  634. acFileSaveTextures.Enabled := (MaterialLib.Materials.Count > 0);
  635. acFileOpenTexLib.Enabled := (MaterialLib.Materials.Count > 0);
  636. lastFileName := FileName;
  637. lastLoadWithTextures := acToolsTexturing.Enabled;
  638. ffObject.GetExtents(min, max);
  639. CubeLines.CubeWidth := max.X - min.X;
  640. CubeLines.CubeHeight := max.Y - min.Y;
  641. CubeLines.CubeDepth := max.Z - min.Z;
  642. CubeLines.Position.AsAffineVector := VectorLerp(min, max, 0.5);
  643. StatusBar.Panels[0].Text := 'X: ' + ' ';
  644. StatusBar.Panels[1].Text := 'Y: ' + ' ';
  645. StatusBar.Panels[2].Text := 'Z: ' + ' ';
  646. Name := ExtractFileName(FileName);
  647. StatusBar.Panels[3].Text := Name;
  648. DoResetCamera;
  649. end;
  650. procedure TFormGLSViewer.snViewerMouseDown(Sender: TObject; Button: TMouseButton;
  651. Shift: TShiftState; X, Y: Integer);
  652. begin
  653. mx := X;
  654. my := Y;
  655. md := True;
  656. end;
  657. procedure TFormGLSViewer.snViewerMouseLeave(Sender: TObject);
  658. begin
  659. Cadencer.Enabled := False;
  660. end;
  661. procedure TFormGLSViewer.snViewerMouseMove(Sender: TObject; Shift: TShiftState;
  662. X, Y: Integer);
  663. var
  664. d: Single;
  665. begin
  666. if md and (Shift <> []) then
  667. begin
  668. if ssLeft in Shift then
  669. if ssShift in Shift then
  670. Camera.MoveAroundTarget((my - Y) * 0.1, (mx - X) * 0.1)
  671. else
  672. Camera.MoveAroundTarget(my - Y, mx - X)
  673. else if ssRight in Shift then
  674. begin
  675. d := Camera.DistanceToTarget * 0.01 * (X - mx + Y - my);
  676. if IsKeyDown('x') then
  677. ffObject.Translate(d, 0, 0)
  678. else if IsKeyDown('y') then
  679. ffObject.Translate(0, d, 0)
  680. else if IsKeyDown('z') then
  681. ffObject.Translate(0, 0, d)
  682. else
  683. begin
  684. if ssShift in Shift then
  685. Camera.RotateObject(ffObject, (my - Y) * 0.1, (mx - X) * 0.1)
  686. else
  687. Camera.RotateObject(ffObject, my - Y, mx - X);
  688. end;
  689. end;
  690. mx := X;
  691. my := Y;
  692. end;
  693. end;
  694. procedure TFormGLSViewer.snViewerMouseUp(Sender: TObject; Button: TMouseButton;
  695. Shift: TShiftState; X, Y: Integer);
  696. begin
  697. md := False;
  698. end;
  699. procedure TFormGLSViewer.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  700. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  701. begin
  702. if ffObject.MeshObjects.Count > 0 then
  703. begin
  704. Camera.AdjustDistanceToTarget(Power(1.05, WheelDelta / 120));
  705. Camera.DepthOfView := 2 * Camera.DistanceToTarget + 2 *
  706. ffObject.BoundingSphereRadius;
  707. end;
  708. Handled := True;
  709. end;
  710. procedure TFormGLSViewer.MaterialLibTextureNeeded(Sender: TObject;
  711. var textureFileName: String);
  712. begin
  713. if not acToolsTexturing.Enabled then
  714. textureFileName := '';
  715. end;
  716. procedure TFormGLSViewer.acInvertNormalsExecute(Sender: TObject);
  717. var
  718. I: Integer;
  719. begin
  720. with ffObject.MeshObjects do
  721. for I := 0 to Count - 1 do
  722. Items[I].Normals.Scale(-1);
  723. ffObject.StructureChanged;
  724. end;
  725. procedure TFormGLSViewer.acReverseRenderingOrderExecute(Sender: TObject);
  726. var
  727. I, j, n: Integer;
  728. fg: TGLFaceGroup;
  729. begin
  730. with ffObject.MeshObjects do
  731. begin
  732. // invert meshobjects order
  733. for I := 0 to (Count div 2) do
  734. Exchange(I, Count - 1 - I);
  735. // for each mesh object
  736. for I := 0 to Count - 1 do
  737. with Items[I] do
  738. begin
  739. // invert facegroups order
  740. n := FaceGroups.Count;
  741. for j := 0 to (n div 2) do
  742. Exchange(j, n - 1 - j);
  743. // for each facegroup
  744. for j := 0 to n - 1 do
  745. begin
  746. fg := FaceGroups[j];
  747. fg.Reverse;
  748. end;
  749. end;
  750. end;
  751. ffObject.StructureChanged;
  752. end;
  753. procedure TFormGLSViewer.acSaveAsUpdate(Sender: TObject);
  754. begin
  755. acFileSaveAs.Enabled := (ffObject.MeshObjects.Count > 0);
  756. end;
  757. procedure TFormGLSViewer.acHelpAboutExecute(Sender: TObject);
  758. begin
  759. with TGLAbout.Create(Self) do
  760. try
  761. ShowModal;
  762. finally
  763. Free;
  764. end;
  765. end;
  766. procedure TFormGLSViewer.acHelpContentsExecute(Sender: TObject);
  767. begin
  768. inherited;
  769. ShellExecute(0, 'open', 'https://en.wikipedia.org/wiki/GLScene', '', '', SW_SHOW);
  770. end;
  771. procedure TFormGLSViewer.acHelpTopicSearchExecute(Sender: TObject);
  772. begin
  773. inherited;
  774. ShellExecute(0, 'open', 'https://glscene.org', '', '', SW_SHOW);
  775. end;
  776. procedure TFormGLSViewer.acHelpGLSHomePageExecute(Sender: TObject);
  777. begin
  778. inherited;
  779. ShellExecute(0, 'open','https://github.com/glscene', '', '', SW_SHOW);
  780. end;
  781. procedure TFormGLSViewer.acAADefaultExecute(Sender: TObject);
  782. begin
  783. (Sender as TAction).Checked := True;
  784. ApplyFSAA;
  785. end;
  786. procedure TFormGLSViewer.acConvertToIndexedTrianglesExecute(Sender: TObject);
  787. var
  788. v: TGLAffineVectorList;
  789. I: TGLIntegerList;
  790. m: TGLMeshObject;
  791. fg: TFGVertexIndexList;
  792. begin
  793. v := ffObject.MeshObjects.ExtractTriangles;
  794. try
  795. I := BuildVectorCountOptimizedIndices(v);
  796. try
  797. RemapAndCleanupReferences(v, I);
  798. IncreaseCoherency(I, 12);
  799. I.Capacity := I.Count;
  800. ffObject.MeshObjects.Clean;
  801. m := TGLMeshObject.CreateOwned(ffObject.MeshObjects);
  802. m.Vertices := v;
  803. m.BuildNormals(I, momTriangles);
  804. m.Mode := momFaceGroups;
  805. fg := TFGVertexIndexList.CreateOwned(m.FaceGroups);
  806. fg.VertexIndices := I;
  807. fg.Mode := fgmmTriangles;
  808. ffObject.StructureChanged;
  809. finally
  810. I.Free;
  811. end;
  812. finally
  813. v.Free;
  814. end;
  815. MaterialLib.Materials.Clear;
  816. SetupFreeFormShading;
  817. end;
  818. procedure TFormGLSViewer.acStripifyExecute(Sender: TObject);
  819. var
  820. I: Integer;
  821. mo: TGLMeshObject;
  822. fg: TFGVertexIndexList;
  823. strips: TGLPersistentObjectList;
  824. begin
  825. acConvertToTriangles.Execute;
  826. mo := ffObject.MeshObjects[0];
  827. fg := (mo.FaceGroups[0] as TFGVertexIndexList);
  828. strips := StripifyMesh(fg.VertexIndices, mo.Vertices.Count, True);
  829. try
  830. fg.Free;
  831. for I := 0 to strips.Count - 1 do
  832. begin
  833. fg := TFGVertexIndexList.CreateOwned(mo.FaceGroups);
  834. fg.VertexIndices := (strips[I] as TGLIntegerList);
  835. if I = 0 then
  836. fg.Mode := fgmmTriangles
  837. else
  838. fg.Mode := fgmmTriangleStrip;
  839. end;
  840. finally
  841. strips.Free;
  842. end;
  843. end;
  844. procedure TFormGLSViewer.acSaveTreeViewExecute(Sender: TObject);
  845. begin
  846. if SaveDialog.Execute then
  847. begin
  848. tvScene.SaveToFile(SaveDialog.FileName);
  849. // CurrentStar := GetCurrentDir();
  850. end;
  851. end;
  852. procedure TFormGLSViewer.acSpheresExecute(Sender: TObject);
  853. begin
  854. inherited;
  855. // random spheres
  856. end;
  857. procedure TFormGLSViewer.acLoadTreeViewExecute(Sender: TObject);
  858. begin
  859. inherited;
  860. //
  861. end;
  862. procedure TFormGLSViewer.acViewFlatShadingExecute(Sender: TObject);
  863. begin
  864. ApplyShadeMode;
  865. end;
  866. procedure TFormGLSViewer.acViewHiddenLinesExecute(Sender: TObject);
  867. begin
  868. ApplyShadeMode;
  869. end;
  870. procedure TFormGLSViewer.acViewResetExecute(Sender: TObject);
  871. begin
  872. DoResetCamera;
  873. end;
  874. procedure TFormGLSViewer.acViewFlatLinesExecute(Sender: TObject);
  875. begin
  876. ApplyShadeMode;
  877. end;
  878. procedure TFormGLSViewer.acViewSmoothShadingExecute(Sender: TObject);
  879. begin
  880. ApplyShadeMode;
  881. end;
  882. procedure TFormGLSViewer.acViewWireFrameExecute(Sender: TObject);
  883. begin
  884. ApplyShadeMode;
  885. end;
  886. procedure TFormGLSViewer.acViewZoomInExecute(Sender: TObject);
  887. var
  888. h: Boolean;
  889. begin
  890. FormMouseWheel(Self, [], -120 * 4, Point(0, 0), h);
  891. end;
  892. procedure TFormGLSViewer.acViewZoomOutExecute(Sender: TObject);
  893. var
  894. h: Boolean;
  895. begin
  896. FormMouseWheel(Self, [], 120 * 4, Point(0, 0), h);
  897. end;
  898. procedure TFormGLSViewer.acOptimizeExecute(Sender: TObject);
  899. begin
  900. OptimizeMesh(ffObject.MeshObjects, [mooVertexCache, mooSortByMaterials]);
  901. ffObject.StructureChanged;
  902. SetupFreeFormShading;
  903. end;
  904. procedure TFormGLSViewer.acToolsOptionsExecute(Sender: TObject);
  905. begin
  906. with TGLOptions.Create(Self) do
  907. try
  908. ShowModal;
  909. finally
  910. Free;
  911. end;
  912. end;
  913. procedure TFormGLSViewer.acToolsFaceCullingExecute(Sender: TObject);
  914. begin
  915. acToolsFaceCulling.Checked := not acToolsFaceCulling.Checked;
  916. ApplyFaceCull;
  917. end;
  918. procedure TFormGLSViewer.acToolsInfoExecute(Sender: TObject);
  919. begin
  920. with TGLDialog.Create(Self) do
  921. try
  922. Memo.Lines[0] := 'Triangles: ' +
  923. IntToStr(ffObject.MeshObjects.TriangleCount);
  924. Memo.Lines[1] := 'Area: ' + FloatToStr(ffObject.MeshObjects.Area);
  925. Memo.Lines[2] := 'Volume: ' + FloatToStr(ffObject.MeshObjects.Volume);
  926. ShowModal;
  927. finally
  928. Free;
  929. end;
  930. end;
  931. procedure TFormGLSViewer.acToolsLightingExecute(Sender: TObject);
  932. begin
  933. acToolsLighting.Checked := not acToolsLighting.Checked;
  934. // TBLighting
  935. ApplyShadeMode;
  936. end;
  937. procedure TFormGLSViewer.acToolsShowFPSExecute(Sender: TObject);
  938. begin
  939. acToolsShowFPS.Checked := not acToolsShowFPS.Checked;
  940. ApplyFPS;
  941. end;
  942. procedure TFormGLSViewer.acToolsTexturingExecute(Sender: TObject);
  943. begin
  944. acToolsTexturing.Checked := not acToolsTexturing.Checked;
  945. if acToolsTexturing.Checked then
  946. if lastLoadWithTextures then
  947. ApplyTexturing
  948. else
  949. begin
  950. DoOpen(lastFileName);
  951. end
  952. else
  953. ApplyTexturing;
  954. end;
  955. procedure TFormGLSViewer.acToolsNaviCubeExecute(Sender: TObject);
  956. begin
  957. acToolsNaviCube.Checked := not acToolsNaviCube.Checked;
  958. if acToolsNaviCube.Checked = True then
  959. begin
  960. NaviCube.Visible := True;
  961. Cadencer.Enabled := True;
  962. end
  963. else
  964. begin
  965. NaviCube.Visible := False;
  966. Cadencer.Enabled := False;
  967. end;
  968. snViewer.Invalidate;
  969. end;
  970. // Show Base and Additional Objects
  971. procedure TFormGLSViewer.acPointsExecute(Sender: TObject);
  972. var
  973. I: Integer;
  974. Color: TVector3f;
  975. NumPoints: Integer;
  976. X, Y, Z: Single;
  977. begin
  978. NumPoints := 10000;
  979. GLPoints := TGLPoints(dcWorld.AddNewChild(TGLPoints));
  980. GLPoints.Size := 5.0;
  981. GLPoints.Style := psSmooth;
  982. for I := 0 to NumPoints - 1 do
  983. begin
  984. Color.X := Random();
  985. Color.Y := Random();
  986. Color.Z := Random();
  987. X := Random(10) - 5;
  988. Y := Random(10) - 5;
  989. Z := Random(10) - 5;
  990. GLPoints.Positions.Add(X * 0.05, Y * 0.05, Z * 0.05);
  991. // Fill array of GLPoints
  992. GLPoints.Colors.AddPoint(Color);
  993. end;
  994. // dcWorld.Remove(GLPoints, False);
  995. // GLPoints := TGLPoints(dcWorld.AddNewChild(TGLPoints));
  996. end;
  997. (*
  998. procedure TMainForm.acDeletePoints(Sender: TObject);
  999. var
  1000. I: Integer;
  1001. Color: TVector3f;
  1002. NumPoints: Integer;
  1003. X, Y, Z: Single;
  1004. begin
  1005. NumPoints := 10000;
  1006. GLPoints := TGLPoints(dcWorld.AddNewChild(TGLPoints));
  1007. for I := 0 to NumPoints - 1 do
  1008. begin
  1009. Color.X := Random();
  1010. Color.Y := Random();
  1011. Color.Z := Random();
  1012. X := Random(100) - 50;
  1013. Y := Random(100) - 50;
  1014. Z := Random(100) - 50;
  1015. GLPoints.Positions.Add(X * 0.05, Y * 0.05, Z * 0.05);
  1016. // Fill array of GLPoints
  1017. end;
  1018. end;
  1019. *)
  1020. procedure TFormGLSViewer.acFileExitExecute(Sender: TObject);
  1021. begin
  1022. Close;
  1023. end;
  1024. procedure TFormGLSViewer.CadencerProgress(Sender: TObject;
  1025. const deltaTime, newTime: Double);
  1026. begin
  1027. if NaviCube.InactiveTime > 5 then
  1028. begin
  1029. if NaviCube.InactiveTime < 8 then
  1030. Camera.TurnAngle := Camera.TurnAngle + (NaviCube.InactiveTime - 5) *
  1031. deltaTime * 2
  1032. else
  1033. Camera.TurnAngle := Camera.TurnAngle + deltaTime * 6;
  1034. end;
  1035. snViewer.Refresh;
  1036. if Self.Focused then
  1037. snViewer.Invalidate;
  1038. end;
  1039. procedure TFormGLSViewer.TimerTimer(Sender: TObject);
  1040. begin
  1041. // StatusBar.Panels[3].Text := Format('%.1f FPS', [snViewer.FramesPerSecond]);
  1042. snViewer.ResetPerformanceMonitor;
  1043. end;
  1044. //---------------------------------------------------------------------------
  1045. procedure TFormGLSViewer.tvSceneCheckStateChanged(Sender: TCustomTreeView;
  1046. Node: TTreeNode; CheckState: TNodeCheckState);
  1047. begin
  1048. inherited;
  1049. // Add or removed scene's objects
  1050. end;
  1051. //---------------------------------------------------------------------------
  1052. procedure TFormGLSViewer.tvSceneClick(Sender: TObject);
  1053. var
  1054. ObjectName: String;
  1055. begin
  1056. dcObject.DeleteChildren;
  1057. ObjectName := tvScene.Selected.Text;
  1058. case tvScene.Selected.SelectedIndex of
  1059. 4: //Points
  1060. begin
  1061. acPointsExecute(Sender);
  1062. end;
  1063. 5: //Lines
  1064. begin
  1065. Lines := TGLLines.CreateAsChild(dcObject);
  1066. Lines.Material.FrontProperties.Diffuse.RandomColor();
  1067. end;
  1068. 6: //Plane
  1069. begin
  1070. Plane := TGLPlane.CreateAsChild(dcObject);
  1071. Plane.Direction.SetVector(0, 1, 0); // vertical - (0, 0, 1); slope - (0.3, 1, 0.1);
  1072. Plane.Material.FrontProperties.Diffuse.RandomColor();
  1073. end;
  1074. 7: //Polygon
  1075. begin
  1076. Polygon := TGLPolygon.CreateAsChild(dcObject);
  1077. Polygon.Material.FrontProperties.Diffuse.RandomColor();
  1078. end;
  1079. 8: // GLCube
  1080. begin
  1081. Cube := TGLCube.CreateAsChild(dcObject);
  1082. // Cube.Position.SetPoint(0, 0, 0);
  1083. Cube.Material.FrontProperties.Diffuse.RandomColor();
  1084. end;
  1085. 9: // Frustrum
  1086. begin
  1087. Frustrum := TGLFrustrum.CreateAsChild(dcObject);
  1088. // Frustrum.Position.SetPoint(0, 0, 0);
  1089. // Frustrum.Material.FrontProperties.Diffuse.Color := clrBlue;
  1090. Frustrum.Material.FrontProperties.Diffuse.RandomColor();
  1091. //;
  1092. end;
  1093. 10: // Sphere
  1094. begin
  1095. Sphere := TGLSphere.CreateAsChild(dcObject);
  1096. // Sphere.Position.SetPoint(0, 0, 0);
  1097. // Sphere.Material.FrontProperties.Diffuse.Color := clrBlue;
  1098. Sphere.Material.FrontProperties.Diffuse.RandomColor();
  1099. end;
  1100. 11: // Disk;
  1101. begin
  1102. Disk := TGLDisk.CreateAsChild(dcObject);
  1103. Disk.Material.FrontProperties.Diffuse.RandomColor();
  1104. end;
  1105. 12: // Cone
  1106. begin
  1107. Cone := TGLCone.CreateAsChild(dcObject);
  1108. Cone.Material.FrontProperties.Diffuse.RandomColor();
  1109. end;
  1110. 13: // Cylinder
  1111. begin
  1112. Cylinder := TGLCylinder.CreateAsChild(dcObject);
  1113. Cylinder.Material.FrontProperties.Diffuse.RandomColor();
  1114. end;
  1115. 14: // Capsule
  1116. begin
  1117. Capsule := TGLCapsule.CreateAsChild(dcObject);
  1118. Capsule.Material.FrontProperties.Diffuse.RandomColor();
  1119. end;
  1120. 15: // Dodecahedron
  1121. begin
  1122. Dodecahedron := TGLDodecahedron.CreateAsChild(dcObject);
  1123. Dodecahedron.Material.FrontProperties.Diffuse.RandomColor();
  1124. end;
  1125. 16: // Icosahedron
  1126. begin
  1127. Icosahedron := TGLIcosahedron.CreateAsChild(dcObject);
  1128. Icosahedron.Material.FrontProperties.Diffuse.RandomColor();
  1129. end;
  1130. 17: // Hexahedron
  1131. begin
  1132. Hexahedron := TGLHexahedron.CreateAsChild(dcObject);
  1133. Hexahedron.Material.FrontProperties.Diffuse.RandomColor();
  1134. end;
  1135. 18: // Octahedron
  1136. begin
  1137. Octahedron := TGLOctahedron.CreateAsChild(dcObject);
  1138. Octahedron.Material.FrontProperties.Diffuse.Color := clrRed;
  1139. end;
  1140. 19: // Tetrahedron
  1141. begin
  1142. Tetrahedron := TGLTetrahedron.CreateAsChild(dcObject);
  1143. Tetrahedron.Material.FrontProperties.Diffuse.Color := clrGreen;
  1144. end;
  1145. 20: // SuperEllipsoid
  1146. begin
  1147. SuperEllipsoid := TGLSuperEllipsoid.CreateAsChild(dcObject);
  1148. SuperEllipsoid.Material.FrontProperties.Diffuse.Color := clrTeal;
  1149. end;
  1150. //21...
  1151. end;
  1152. // and so on
  1153. // end;
  1154. end;
  1155. procedure TFormGLSViewer.ReadIniFile;
  1156. begin
  1157. inherited;
  1158. IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  1159. try
  1160. Top := IniFile.ReadInteger(Name, 'Top', 100);
  1161. Left := IniFile.ReadInteger(Name, 'Left', 200);
  1162. finally
  1163. IniFile.Free;
  1164. end;
  1165. end;
  1166. procedure TFormGLSViewer.WriteIniFile;
  1167. begin
  1168. IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  1169. with IniFile do
  1170. try
  1171. WriteInteger(Name, 'Top', Top);
  1172. WriteInteger(Name, 'Left', Left);
  1173. // WriteBool(Name, 'InitMax', WindowState = wsMaximized);
  1174. finally
  1175. IniFile.Free;
  1176. end;
  1177. inherited;
  1178. end;
  1179. end.