fGLSViewer.pas 37 KB

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