2
0

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. Vcl.PlatformDefaultStyleActnCtrls,
  37. Stage.VectorTypes,
  38. Stage.Keyboard,
  39. Stage.VectorGeometry,
  40. GLS.VectorLists,
  41. GLS.Coordinates,
  42. GLS.BaseClasses,
  43. GLS.PersistentClasses,
  44. Stage.TextureFormat,
  45. GLS.XCollection,
  46. GLS.Material,
  47. GLS.Scene,
  48. GLS.SceneViewer,
  49. GLS.VectorFileObjects,
  50. GLS.Objects,
  51. GLS.Texture,
  52. GLS.Context,
  53. GLS.Cadencer,
  54. GLS.State,
  55. GLS.RenderContextInfo,
  56. GLS.Color,
  57. GLS.Graphics,
  58. GLS.MeshUtils,
  59. GLS.AsyncTimer,
  60. GLS.Graph,
  61. GLS.MeshBuilder,
  62. GLS.Navigator,
  63. Stage.Utils,
  64. GLS.GeomObjects,
  65. GLS.SimpleNavigation,
  66. GLS.Extrusion,
  67. GLS.MultiPolygon,
  68. GLS.FileTGA,
  69. GLS.Tree,
  70. GLS.SkyDome,
  71. fGLForm,
  72. fGLDialog,
  73. fGLAbout,
  74. fGLOptions,
  75. dImages,
  76. dDialogs;
  77. type
  78. TfrmGLSViewer = 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. frmGLSViewer: TfrmGLSViewer;
  275. NaviCube: TGLNaviCube;
  276. implementation //-------------------------------------------------------------
  277. {$R *.dfm}
  278. uses
  279. GLS.FileOBJ,
  280. GLS.FileSTL,
  281. GLS.FileLWO,
  282. GLS.FileQ3BSP,
  283. GLS.FileOCT,
  284. GLS.FileMS3D,
  285. GLS.FileNMF,
  286. GLS.FileMD3,
  287. GLS.File3DS,
  288. GLS.FileMD2,
  289. GLS.FileSMD,
  290. GLS.FilePLY,
  291. GLS.FileGTS,
  292. GLS.FileVRML,
  293. GLS.FileMD5,
  294. GLS.FileTIN,
  295. GLS.FileDXF,
  296. GLS.FileGRD,
  297. GLS.FileX,
  298. GLS.FileGLTF;
  299. type
  300. // Hidden line shader (specific implem for the viewer, *not* generic)
  301. THiddenLineShader = class(TGLShader)
  302. private
  303. LinesColor: TGLColorVector;
  304. BackgroundColor: TGLColorVector;
  305. PassCount: Integer;
  306. public
  307. procedure DoApply(var rci: TGLRenderContextInfo; Sender: TObject); override;
  308. function DoUnApply(var rci: TGLRenderContextInfo): Boolean; override;
  309. end;
  310. //---------------------------------------------------------------------------
  311. procedure THiddenLineShader.DoApply(var rci: TGLRenderContextInfo;
  312. Sender: TObject);
  313. begin
  314. PassCount := 1;
  315. with rci.GLStates do
  316. begin
  317. PolygonMode := pmFill;
  318. gl.Color3fv(@BackgroundColor);
  319. ActiveTextureEnabled[ttTexture2D] := False;
  320. Enable(stPolygonOffsetFill);
  321. PolygonOffsetFactor := 1;
  322. PolygonOffsetUnits := 2;
  323. end;
  324. end;
  325. function THiddenLineShader.DoUnApply(var rci: TGLRenderContextInfo): Boolean;
  326. begin
  327. case PassCount of
  328. 1:
  329. with rci.GLStates do
  330. begin
  331. PassCount := 2;
  332. PolygonMode := pmLines;
  333. glColor3fv(@LinesColor);
  334. Disable(stLighting);
  335. Result := True;
  336. end;
  337. 2:
  338. begin
  339. rci.GLStates.Disable(stPolygonOffsetFill);
  340. Result := False;
  341. end;
  342. else
  343. 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. //------------------------- tvSceneClick -------------------------------------
  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 todo
  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; // also lnaAxes; lnaCube;
  1097. Lines.AddNode(pos1);
  1098. Lines.AddNode(pos2);
  1099. Lines.LineColor.RandomColor;
  1100. end;
  1101. 6: //Plane
  1102. begin
  1103. Plane := TGLPlane.CreateAsChild(dcObject);
  1104. Plane.Direction.SetVector(0, 1, 0); // vertical - (0, 0, 1); slope - (0.3, 1, 0.1);
  1105. Plane.Material.FrontProperties.Diffuse.RandomColor();
  1106. end;
  1107. 7: //Polygon
  1108. begin
  1109. Polygon := TGLPolygon.CreateAsChild(dcObject);
  1110. Polygon.Material.FrontProperties.Diffuse.RandomColor();
  1111. end;
  1112. 8: // Cube
  1113. begin
  1114. Cube := TGLCube.CreateAsChild(dcObject);
  1115. // Cube.Position.SetPoint(0, 0, Random(3));
  1116. Cube.Material.FrontProperties.Diffuse.RandomColor();
  1117. end;
  1118. 9: // Frustrum
  1119. begin
  1120. Frustrum := TGLFrustrum.CreateAsChild(dcObject);
  1121. Frustrum.Material.FrontProperties.Diffuse.RandomColor();
  1122. //;
  1123. end;
  1124. 10: // Sphere
  1125. begin
  1126. Sphere := TGLSphere.CreateAsChild(dcObject);
  1127. // Sphere.Material.FrontProperties.Diffuse.Color := clrBlue;
  1128. Sphere.Material.FrontProperties.Diffuse.RandomColor();
  1129. end;
  1130. 11: // Disk;
  1131. begin
  1132. Disk := TGLDisk.CreateAsChild(dcObject);
  1133. Disk.Material.FrontProperties.Diffuse.RandomColor();
  1134. end;
  1135. 12: // Cone
  1136. begin
  1137. Cone := TGLCone.CreateAsChild(dcObject);
  1138. Cone.Material.FrontProperties.Diffuse.RandomColor();
  1139. end;
  1140. 13: // Cylinder
  1141. begin
  1142. Cylinder := TGLCylinder.CreateAsChild(dcObject);
  1143. Cylinder.Material.FrontProperties.Diffuse.RandomColor();
  1144. end;
  1145. 14: // Capsule
  1146. begin
  1147. Capsule := TGLCapsule.CreateAsChild(dcObject);
  1148. Capsule.Material.FrontProperties.Diffuse.RandomColor();
  1149. end;
  1150. 15: // Dodecahedron
  1151. begin
  1152. Dodecahedron := TGLDodecahedron.CreateAsChild(dcObject);
  1153. Dodecahedron.Material.FrontProperties.Diffuse.RandomColor();
  1154. end;
  1155. 16: // Icosahedron
  1156. begin
  1157. Icosahedron := TGLIcosahedron.CreateAsChild(dcObject);
  1158. Icosahedron.Material.FrontProperties.Diffuse.RandomColor();
  1159. end;
  1160. 17: // Hexahedron
  1161. begin
  1162. Hexahedron := TGLHexahedron.CreateAsChild(dcObject);
  1163. Hexahedron.Material.FrontProperties.Diffuse.RandomColor();
  1164. Hexahedron.Scale.SetVector(0.5,0.5,0.5);
  1165. end;
  1166. 18: // Octahedron
  1167. begin
  1168. Octahedron := TGLOctahedron.CreateAsChild(dcObject);
  1169. Octahedron.Material.BackProperties.Diffuse.Color := clrRed;
  1170. Octahedron.Scale.SetVector(0.5,0.5,0.5);
  1171. end;
  1172. 19: // Tetrahedron
  1173. begin
  1174. Tetrahedron := TGLTetrahedron.CreateAsChild(dcObject);
  1175. Tetrahedron.Material.BackProperties.Diffuse.RandomColor();
  1176. end;
  1177. 20: // SuperEllipsoid
  1178. begin
  1179. SuperEllipsoid := TGLSuperEllipsoid.CreateAsChild(dcObject);
  1180. SuperEllipsoid.Material.FrontProperties.Diffuse.Color := clrTeal;
  1181. end;
  1182. 21: //Animated sprite todo
  1183. begin
  1184. //
  1185. end;
  1186. 22: // ArrowLine
  1187. begin
  1188. ArrowLine := TGLArrowLine.CreateAsChild(dcObject);
  1189. ArrowLine.Material.FrontProperties.Diffuse.RandomColor();
  1190. end;
  1191. 23: // ArrowArc
  1192. begin
  1193. ArrowArc := TGLArrowArc.CreateAsChild(dcObject);
  1194. ArrowArc.Material.FrontProperties.Diffuse.RandomColor();
  1195. end;
  1196. 24: // Annulus
  1197. begin
  1198. Annulus := TGLAnnulus.CreateAsChild(dcObject);
  1199. Annulus.Material.FrontProperties.Diffuse.RandomColor();
  1200. end;
  1201. 25: // ExtrusionSolid
  1202. begin
  1203. ExtrusionSolid := TGLExtrusionSolid.CreateAsChild(dcObject);
  1204. ExtrusionSolid.Material.FrontProperties.Diffuse.RandomColor();
  1205. end;
  1206. 26: // MultiPolygon
  1207. begin
  1208. MultiPolygon := TGLMultiPolygon.CreateAsChild(dcObject);
  1209. MultiPolygon.Material.FrontProperties.Diffuse.RandomColor();
  1210. end;
  1211. 27: // Pipe in dcWorld
  1212. begin
  1213. Pipe.Visible := True;
  1214. Pipe.Material.FrontProperties.Diffuse.RandomColor();
  1215. end;
  1216. 28: // RevolutionSolid
  1217. begin
  1218. RevolutionSolid := TGLRevolutionSolid.CreateAsChild(dcObject);
  1219. RevolutionSolid.Material.FrontProperties.Diffuse.RandomColor();
  1220. end;
  1221. 29: // Torus exists in dcWorld
  1222. begin
  1223. Torus.Visible := True;
  1224. Torus.Material.FrontProperties.Diffuse.RandomColor();
  1225. end;
  1226. 30: //Actor
  1227. begin
  1228. Actor := TGLActor.CreateAsChild(dcObject);
  1229. SetCurrentDir(AssetPath + '\modelext');
  1230. Actor.LoadFromFile('waste.md2');
  1231. Actor.Material.Texture.Disabled := False;
  1232. Actor.Material.Texture.Image.LoadFromFile('Waste.jpg');
  1233. Actor.Roll(90);
  1234. Actor.Pitch(90);
  1235. Actor.Turn(90);
  1236. Actor.Scale.Scale(0.05);
  1237. end;
  1238. 31: //FreeForm todo
  1239. begin
  1240. //
  1241. end;
  1242. 32: //Mesh todo
  1243. begin
  1244. //
  1245. end;
  1246. 33: //TilePlane todo
  1247. begin
  1248. //
  1249. end;
  1250. 34: //Portal todo
  1251. begin
  1252. //
  1253. end;
  1254. 35: //TerrainRenderer todo
  1255. begin
  1256. //
  1257. end;
  1258. 41: //Atmosphere todo
  1259. begin
  1260. //
  1261. end;
  1262. 42: //SkyBox todo
  1263. begin
  1264. //
  1265. end;
  1266. 43: //SkyDome todo
  1267. begin
  1268. //
  1269. end;
  1270. 44: //EarthSkyDome todo
  1271. begin
  1272. //
  1273. end;
  1274. 79: // Teapot in dcWorld
  1275. begin
  1276. Teapot.Visible := True;
  1277. Teapot.Material.FrontProperties.Diffuse.RandomColor();
  1278. Teapot.Scale.SetVector(1.5,1.5,1.5);
  1279. end;
  1280. 80: // Tree in dcWorld
  1281. begin
  1282. Tree.Visible := True;
  1283. Tree.Scale.SetVector(0.5,0.5,0.5);
  1284. dmImages.MLTree.AddTextureMaterial('TreeBark', 'zbark_016.jpg').Material.Texture.TextureMode := tmModulate;
  1285. dmImages.MLTree.AddTextureMaterial('LeafTexture', 'leaf.tga').Material.Texture.TextureMode := tmModulate;
  1286. dmImages.MLTree.AddTextureMaterial('FrutTexture', 'maple_multi.tga').Material.Texture.TextureMode := tmModulate;
  1287. end;
  1288. end;
  1289. end;
  1290. procedure TfrmGLSViewer.ReadIniFile;
  1291. begin
  1292. inherited;
  1293. IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  1294. try
  1295. Top := IniFile.ReadInteger(Name, 'Top', 100);
  1296. Left := IniFile.ReadInteger(Name, 'Left', 200);
  1297. finally
  1298. IniFile.Free;
  1299. end;
  1300. end;
  1301. procedure TfrmGLSViewer.WriteIniFile;
  1302. begin
  1303. IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  1304. with IniFile do
  1305. try
  1306. WriteInteger(Name, 'Top', Top);
  1307. WriteInteger(Name, 'Left', Left);
  1308. // WriteBool(Name, 'InitMax', WindowState = wsMaximized);
  1309. finally
  1310. IniFile.Free;
  1311. end;
  1312. inherited;
  1313. end;
  1314. initialization //--------------------------------------------------------------
  1315. FormatSettings.DecimalSeparator := '.';
  1316. end.