fGLSViewer.pas 37 KB

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