fMainD.pas 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. unit fMainD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. System.SysUtils,
  6. System.Classes,
  7. System.StrUtils,
  8. System.ImageList,
  9. Vcl.Graphics,
  10. Vcl.Controls,
  11. Vcl.Forms,
  12. Vcl.Dialogs,
  13. Vcl.Menus,
  14. Vcl.ImgList,
  15. Vcl.ExtCtrls,
  16. Vcl.ComCtrls,
  17. Vcl.Imaging.Jpeg,
  18. GLS.ArchiveManager,
  19. GLS.SceneViewer,
  20. GLS.BaseClasses,
  21. GLScene.VectorTypes,
  22. GLS.Scene,
  23. GLScene.VectorGeometry,
  24. GLS.SimpleNavigation,
  25. GLS.Material,
  26. GLS.VectorFileObjects,
  27. GLS.Objects,
  28. GLS.Coordinates,
  29. GLS.Graphics,
  30. GLS.State,
  31. GLS.CompositeImage,
  32. GLS.FileJPEG,
  33. GLS.PAKArchive,
  34. GLS.FileZLIB,
  35. GLS.FileMS3D,
  36. GLS.File3DS,
  37. GLS.FileMD2,
  38. GLS.FileMD3,
  39. GLS.FileLMTS,
  40. GLS.FileOBJ,
  41. GLS.FileSMD,
  42. GLS.FileTGA,
  43. GLS.FilePNG,
  44. GLS.FileDDS,
  45. GLScene.Utils;
  46. type
  47. TForm1 = class(TForm)
  48. MainMenu1: TMainMenu;
  49. OpenDialog1: TOpenDialog;
  50. SaveDialog1: TSaveDialog;
  51. ImageList1: TImageList;
  52. ListView: TListView;
  53. File1: TMenuItem;
  54. New1: TMenuItem;
  55. Open1: TMenuItem;
  56. N1: TMenuItem;
  57. Exit1: TMenuItem;
  58. Bevel1: TBevel;
  59. Edit1: TMenuItem;
  60. Createfolder1: TMenuItem;
  61. Addfiles1: TMenuItem;
  62. Deleteselectedfile1: TMenuItem;
  63. Deleteselectedfolder1: TMenuItem;
  64. N2: TMenuItem;
  65. Extractselectedfiles1: TMenuItem;
  66. N3: TMenuItem;
  67. N4: TMenuItem;
  68. Compression1: TMenuItem;
  69. Max1: TMenuItem;
  70. None1: TMenuItem;
  71. Fast1: TMenuItem;
  72. Default1: TMenuItem;
  73. GLScene1: TGLScene;
  74. GLCamera1: TGLCamera;
  75. GLLightSource1: TGLLightSource;
  76. GLSprite1: TGLSprite;
  77. GLFreeForm1: TGLFreeForm;
  78. GLMaterialLibrary1: TGLMaterialLibrary;
  79. GLSimpleNavigation1: TGLSimpleNavigation;
  80. GLSArchiveManager1: TGLSArchiveManager;
  81. GLCube1: TGLCube;
  82. PanelTree: TPanel;
  83. TreeView: TTreeView;
  84. GLSceneViewer1: TGLSceneViewer;
  85. procedure FormCreate(Sender: TObject);
  86. procedure TreeViewRefresh;
  87. procedure FileListRefresh;
  88. procedure AddNode(text: string; node: TTreeNode);
  89. function TreeIndexOf(s: string; node: TTreeNode): integer;
  90. function ListIndexOf(s: string): integer;
  91. procedure TreeViewCollapsing(Sender: TObject; node: TTreeNode;
  92. var AllowCollapse: Boolean);
  93. procedure ListViewClick(Sender: TObject);
  94. procedure ListViewDblClick(Sender: TObject);
  95. procedure TreeViewChange(Sender: TObject; node: TTreeNode);
  96. procedure ListViewKeyDown(Sender: TObject; var Key: Word;
  97. Shift: TShiftState);
  98. procedure ListViewChange(Sender: TObject; Item: TListItem;
  99. Change: TItemChange);
  100. procedure New1Click(Sender: TObject);
  101. procedure Open1Click(Sender: TObject);
  102. procedure Createfolder1Click(Sender: TObject);
  103. procedure Addfiles1Click(Sender: TObject);
  104. procedure Deleteselectedfile1Click(Sender: TObject);
  105. procedure Deleteselectedfolder1Click(Sender: TObject);
  106. procedure TreeViewKeyDown(Sender: TObject; var Key: Word;
  107. Shift: TShiftState);
  108. procedure Extractselectedfiles1Click(Sender: TObject);
  109. procedure Exit1Click(Sender: TObject);
  110. procedure FormDestroy(Sender: TObject);
  111. procedure None1Click(Sender: TObject);
  112. private
  113. public
  114. end;
  115. var
  116. Form1: TForm1;
  117. CurPath, Selection: string;
  118. ArchiveManager: TGLSArchiveManager;
  119. Archive: TGLLibArchive;
  120. vMenu: TMenuItem;
  121. //-------------------------------------
  122. implementation
  123. //-------------------------------------
  124. uses
  125. fFolderDlg,
  126. FolderSelect;
  127. {$R *.dfm}
  128. {$R icons.res}
  129. procedure TForm1.FormCreate(Sender: TObject);
  130. var
  131. Bmp: TBitmap;
  132. begin
  133. var Path: TFileName := GetCurrentAssetPath();
  134. SetCurrentDir(Path + '\modelext');
  135. Bmp := TBitmap.Create;
  136. // Bmp.LoadFromResourceName(HInstance, 'icons');
  137. ImageList1.AddMasked(Bmp, clWhite);
  138. Bmp.Free;
  139. ArchiveManager := TGLSArchiveManager.Create(Self);
  140. Archive := ArchiveManager.Archives.Add;
  141. vMenu := None1;
  142. end;
  143. procedure TForm1.AddNode(text: string; node: TTreeNode);
  144. var
  145. s: string;
  146. c: integer;
  147. begin
  148. c := Pos('/', text);
  149. if c = 0 then
  150. exit;
  151. s := Copy(text, 1, c - 1);
  152. Delete(text, 1, c);
  153. if TreeIndexOf(s, node) = -1 then
  154. AddNode(text, TreeView.Items.AddChild(node, s))
  155. else
  156. AddNode(text, node[TreeIndexOf(s, node)]);
  157. end;
  158. function TForm1.TreeIndexOf(s: string; node: TTreeNode): integer;
  159. var
  160. i: integer;
  161. begin
  162. Result := -1;
  163. for i := 0 to node.Count - 1 do
  164. if node[i].text = s then
  165. Result := i;
  166. end;
  167. function TForm1.ListIndexOf(s: string): integer;
  168. var
  169. i: integer;
  170. begin
  171. Result := -1;
  172. for i := 0 to ListView.Items.Count - 1 do
  173. if ListView.Items[i].Caption = s then
  174. Result := i;
  175. end;
  176. procedure TForm1.TreeViewRefresh;
  177. var
  178. i: integer;
  179. begin
  180. with TreeView do
  181. begin
  182. Items.Clear;
  183. Items.AddChild(Items.GetFirstNode, ExtractFileName(Archive.FileName));
  184. for i := 0 to Archive.ContentList.Count - 1 do
  185. AddNode(Archive.ContentList[i], Items.GetFirstNode);
  186. Items[0].Expanded := True;
  187. Items[0].SelectedIndex := 1;
  188. Items[0].ImageIndex := 1;
  189. end;
  190. TreeView.Selected := TreeView.Items.GetFirstNode;
  191. end;
  192. function MakeMemSize(size: integer): string;
  193. const
  194. kb = 1024;
  195. mb = kb * kb;
  196. gb = mb * kb;
  197. begin
  198. case size of
  199. 0 .. kb - 1:
  200. Result := IntToStr(size) + ' B';
  201. kb .. mb - 1:
  202. Result := Format('%.2f KB', [size / kb]);
  203. mb .. gb - 1:
  204. Result := Format('%.2f MB', [size / mb]);
  205. else
  206. Result := Format('%.2f GB', [size / gb]);
  207. end;
  208. end;
  209. procedure TForm1.FileListRefresh;
  210. var
  211. i, j: integer;
  212. s, name: string;
  213. n: TTreeNode;
  214. dir: Boolean;
  215. begin
  216. n := TreeView.Selected;
  217. s := n.text;
  218. if s = ExtractFileName(Archive.FileName) then
  219. s := '';
  220. while Assigned(n.parent) do
  221. begin
  222. n := n.parent;
  223. if n.AbsoluteIndex <> 0 then
  224. s := n.text + '/' + s;
  225. end;
  226. if s <> '' then
  227. s := s + '/';
  228. CurPath := s;
  229. ListView.Clear;
  230. for i := 0 to Archive.ContentList.Count - 1 do
  231. if Copy(Archive.ContentList[i], 1, Length(s)) = s then
  232. begin
  233. name := RightStr(Archive.ContentList[i], Length(Archive.ContentList[i]) -
  234. Length(s));
  235. j := Pos('/', name);
  236. if j = 0 then
  237. dir := False
  238. else
  239. dir := True;
  240. if dir = True then
  241. name := Copy(name, 1, j - 1);
  242. if ListIndexOf(name) = -1 then
  243. with ListView.Items.Add do
  244. begin
  245. Caption := Name;
  246. if dir = True then
  247. begin
  248. SubItems.Add('-');
  249. SubItems.Add('-')
  250. end
  251. else
  252. begin
  253. SubItems.Add(MakeMemSize(Archive.GetContentSize(i)));
  254. SubItems.Add(MakeMemSize(Archive.GetContentSize(i)))
  255. end;
  256. if dir = True then
  257. ImageIndex := 0
  258. else
  259. ImageIndex := 2;
  260. end;
  261. end;
  262. end;
  263. procedure TForm1.TreeViewCollapsing(Sender: TObject; node: TTreeNode;
  264. var AllowCollapse: Boolean);
  265. begin
  266. if node.AbsoluteIndex = 0 then
  267. AllowCollapse := False
  268. else
  269. AllowCollapse := True;
  270. end;
  271. procedure TForm1.ListViewClick(Sender: TObject);
  272. var
  273. s: string;
  274. len, x: Byte;
  275. strm: TStream;
  276. img: TGLCompositeImage;
  277. objSize: Single;
  278. begin
  279. if not Assigned(ListView.Selected) then
  280. exit;
  281. s := ListView.Selected.Caption;
  282. Selection := CurPath + s;
  283. if ListView.Selected.ImageIndex = 2 then
  284. begin
  285. len := Length(s);
  286. s := LowerCase(s);
  287. if (Copy(s, len - 3, 5) = 'ms3d') or (Copy(s, len - 2, 5) = '3ds') or
  288. (Copy(s, len - 2, 5) = 'md2') or (Copy(s, len - 2, 5) = 'md3') or
  289. (Copy(s, len - 2, 5) = 'obj') or (Copy(s, len - 3, 5) = 'lmts') or
  290. (Copy(s, len - 2, 5) = 'smd') then
  291. begin
  292. GLFreeForm1.LoadFromStream(Selection, Archive.GetContent(Selection));
  293. GLCube1.Visible := False;
  294. GLFreeForm1.Visible := True;
  295. GLCamera1.Position.SetPoint(30, 40, 50);
  296. objSize := GLFreeForm1.BoundingSphereRadius;
  297. if objSize > 0 then
  298. begin
  299. if objSize < 1 then
  300. begin
  301. GLCamera1.SceneScale := 1 / objSize;
  302. objSize := 1;
  303. end
  304. else
  305. GLCamera1.SceneScale := 1;
  306. GLCamera1.AdjustDistanceToTarget(objSize * 0.12);
  307. GLCamera1.DepthOfView := 1.5 * GLCamera1.DistanceToTarget + 1 * objSize;
  308. end;
  309. end;
  310. if (Copy(s, len - 2, 5) = 'jpg') or (Copy(s, len - 2, 5) = 'dds')
  311. { or (Copy(s,len-2,5)='tga') } or (Copy(s, len - 2, 5) = 'png') then
  312. begin
  313. strm := Archive.GetContent(Selection);
  314. img := GLMaterialLibrary1.TextureByName('image')
  315. .Image as TGLCompositeImage;
  316. img.LoadFromStream(strm);
  317. GLCube1.Material.LibMaterialName := 'image';
  318. GLCube1.Visible := True;
  319. GLFreeForm1.Visible := False;
  320. GLCamera1.Position.SetPoint(3, 4, 5);
  321. end;
  322. end;
  323. end;
  324. procedure TForm1.ListViewDblClick(Sender: TObject);
  325. var
  326. s: string;
  327. n: TTreeNode;
  328. begin
  329. if not Assigned(ListView.Selected) then
  330. exit;
  331. if ListView.Selected.ImageIndex = 2 then
  332. exit;
  333. s := ListView.Selected.Caption;
  334. n := TreeView.Selected;
  335. TreeView.Selected := n[TreeIndexOf(s, n)];
  336. end;
  337. procedure TForm1.TreeViewChange(Sender: TObject; node: TTreeNode);
  338. begin
  339. FileListRefresh;
  340. end;
  341. procedure TForm1.ListViewKeyDown(Sender: TObject; var Key: Word;
  342. Shift: TShiftState);
  343. begin
  344. if ListView.Enabled = False then
  345. exit;
  346. ListViewClick(Sender);
  347. if Key = VK_RETURN then
  348. ListViewDblClick(Sender);
  349. if Key = VK_DELETE then
  350. Deleteselectedfile1Click(Self);
  351. end;
  352. procedure TForm1.ListViewChange(Sender: TObject; Item: TListItem;
  353. Change: TItemChange);
  354. begin
  355. ListViewClick(Sender);
  356. end;
  357. procedure TForm1.New1Click(Sender: TObject);
  358. begin
  359. if SaveDialog1.Execute then
  360. begin
  361. Archive.Clear;
  362. Archive.CreateArchive(SaveDialog1.FileName, True);
  363. Archive.LoadFromFile(SaveDialog1.FileName);
  364. TreeViewRefresh;
  365. ListView.Enabled := True;
  366. end;
  367. end;
  368. procedure TForm1.Open1Click(Sender: TObject);
  369. begin
  370. OpenDialog1.DefaultExt := SaveDialog1.DefaultExt;
  371. OpenDialog1.Filter := SaveDialog1.Filter;
  372. OpenDialog1.Options := OpenDialog1.Options - [ofAllowMultiSelect];
  373. OpenDialog1.InitialDir := GetCurrentDir();
  374. if OpenDialog1.Execute then
  375. begin
  376. Archive.Clear;
  377. Archive.LoadFromFile(OpenDialog1.FileName);
  378. TreeViewRefresh;
  379. ListView.Enabled := True;
  380. end;
  381. end;
  382. procedure TForm1.Createfolder1Click(Sender: TObject);
  383. var
  384. F: TMemoryStream;
  385. begin
  386. if not Assigned(Archive) then
  387. exit;
  388. if FDialog.ShowModal = mrOk then
  389. begin
  390. F := TMemoryStream.Create;
  391. try
  392. Archive.AddFromStream('temp.tmp', CurPath + FDialog.Edit1.text + '/', F);
  393. finally
  394. F.Free;
  395. end;
  396. TreeViewRefresh;
  397. end;
  398. end;
  399. procedure TForm1.Addfiles1Click(Sender: TObject);
  400. var
  401. i: integer;
  402. begin
  403. if not Assigned(Archive) then
  404. exit;
  405. OpenDialog1.DefaultExt := '';
  406. OpenDialog1.Filter := 'All Files|*.*';
  407. OpenDialog1.Options := OpenDialog1.Options + [ofAllowMultiSelect];
  408. OpenDialog1.InitialDir := GetCurrentDir();
  409. if OpenDialog1.Execute then
  410. begin
  411. for i := 0 to OpenDialog1.Files.Count - 1 do
  412. if ExtractFileName(OpenDialog1.Files[i]) <> '' then
  413. Archive.AddFromFile(OpenDialog1.Files[i], CurPath);
  414. TreeViewRefresh;
  415. end;
  416. end;
  417. procedure TForm1.Deleteselectedfile1Click(Sender: TObject);
  418. var
  419. i: integer;
  420. s: TStrings;
  421. begin
  422. if ListView.SelCount = 0 then
  423. exit;
  424. s := TStringList.Create;
  425. for i := 0 to ListView.Items.Count - 1 do
  426. if ListView.Items[i].Selected then
  427. s.Add(CurPath + ListView.Items[i].Caption);
  428. for i := 0 to s.Count - 1 do
  429. Archive.RemoveContent(s[i]);
  430. s.Free;
  431. FileListRefresh;
  432. if ListView.Items.Count = 0 then
  433. TreeViewRefresh;
  434. end;
  435. procedure TForm1.Deleteselectedfolder1Click(Sender: TObject);
  436. var
  437. i, l: integer;
  438. s: TStrings;
  439. begin
  440. s := TStringList.Create;
  441. s.AddStrings(Archive.ContentList);
  442. l := Length(CurPath);
  443. for i := 0 to s.Count - 1 do
  444. if Copy(s[i], 1, l) = CurPath then
  445. Archive.RemoveContent(s[i]);
  446. s.Free;
  447. TreeViewRefresh;
  448. end;
  449. procedure TForm1.TreeViewKeyDown(Sender: TObject; var Key: Word;
  450. Shift: TShiftState);
  451. begin
  452. if ListView.Enabled = False then
  453. exit;
  454. if Key = VK_DELETE then
  455. Deleteselectedfolder1Click(Self);
  456. end;
  457. procedure TForm1.Extractselectedfiles1Click(Sender: TObject);
  458. var
  459. i: integer;
  460. begin
  461. if ListView.SelCount = 0 then
  462. exit;
  463. if FolderSel.ShowModal = mrOk then
  464. begin
  465. for i := 0 to ListView.Items.Count - 1 do
  466. if ListView.Items[i].Selected then
  467. Archive.Extract(CurPath + ListView.Items[i].Caption,
  468. FolderSel.ShellView.Path + '\'
  469. + ListView.Items[i].Caption);
  470. end;
  471. end;
  472. procedure TForm1.Exit1Click(Sender: TObject);
  473. begin
  474. Application.Terminate;
  475. end;
  476. procedure TForm1.FormDestroy(Sender: TObject);
  477. begin
  478. ArchiveManager.Free;
  479. end;
  480. procedure TForm1.None1Click(Sender: TObject);
  481. begin
  482. vMenu.Checked := False;
  483. vMenu := (Sender As TMenuItem);
  484. case vMenu.Tag of
  485. 0: Archive.CompressionLevel := clNone;
  486. 1: Archive.CompressionLevel := clFastest;
  487. 2: Archive.CompressionLevel := clDefault;
  488. 3: Archive.CompressionLevel := clMax;
  489. end;
  490. vMenu.Checked := True;
  491. end;
  492. end.