fGLSViewer.pas 37 KB

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