fGLSViewer.pas 35 KB

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