Main.pas 13 KB

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