fGLSViewer.pas 37 KB

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