fGLSViewer.pas 33 KB

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