fGLSViewer.pas 37 KB

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