Compare commits

...

319 Commits

Author SHA1 Message Date
b80a11093a Merge pull request 'feature/test' (#9) from feature/test into main
Reviewed-on: #9
2025-09-07 12:35:21 -04:00
njohnson
d129c7ba62 Sorry ut A lotta stuff. 2025-09-05 18:35:17 -04:00
RedLine AI Agent
46606f529d Updated libs/xassets/xwindowdef.h 2025-09-05 21:36:01 +00:00
RedLine AI Agent
034234a134 Updated libs/xassets/xwindowdef.cpp 2025-09-05 21:36:00 +00:00
RedLine AI Agent
c197edaee6 Updated libs/xassets/xweaponenums.h 2025-09-05 21:35:59 +00:00
RedLine AI Agent
32991d0273 Updated libs/xassets/xtexturedesc.h 2025-09-05 21:35:57 +00:00
RedLine AI Agent
c4826bf1f3 Updated libs/xassets/xtexturedesc.cpp 2025-09-05 21:35:55 +00:00
RedLine AI Agent
1afbe28cc9 Updated libs/xassets/xsunflare.h 2025-09-05 21:35:54 +00:00
RedLine AI Agent
d28aba759f Updated libs/xassets/xsunflare.cpp 2025-09-05 21:35:52 +00:00
RedLine AI Agent
80c0fb2f23 Updated libs/xassets/xstatement.h 2025-09-05 21:35:51 +00:00
RedLine AI Agent
99c2b0ab3b Updated libs/xassets/xstatement.cpp 2025-09-05 21:35:50 +00:00
RedLine AI Agent
9f46d1ea9c Updated libs/xassets/xsrftriangles.h 2025-09-05 21:35:49 +00:00
RedLine AI Agent
d4c36cab72 Updated libs/xassets/xsrftriangles.cpp 2025-09-05 21:35:47 +00:00
RedLine AI Agent
5ec26d101c Updated libs/xassets/xsentienthandle.h 2025-09-05 21:35:46 +00:00
RedLine AI Agent
c5732b0899 Updated libs/xassets/xsentienthandle.cpp 2025-09-05 21:35:45 +00:00
RedLine AI Agent
fb442b39fa Updated libs/xassets/xrectdef.h 2025-09-05 21:35:43 +00:00
RedLine AI Agent
afb0430f30 Updated libs/xassets/xrectdef.cpp 2025-09-05 21:35:42 +00:00
RedLine AI Agent
7bb6d0ab89 Updated libs/xassets/xplatform.h 2025-09-05 21:35:41 +00:00
RedLine AI Agent
9d85b77ef0 Updated libs/xassets/xoperandinternaldataunion.h 2025-09-05 21:35:39 +00:00
RedLine AI Agent
2b55752eb3 Updated libs/xassets/xoperandinternaldataunion.cpp 2025-09-05 21:35:38 +00:00
RedLine AI Agent
c45df3444c Updated libs/xassets/xoperand.h 2025-09-05 21:35:37 +00:00
RedLine AI Agent
cc30cda7cc Updated libs/xassets/xoperand.cpp 2025-09-05 21:35:35 +00:00
RedLine AI Agent
de0ee2e438 Updated libs/xassets/xmultidef.h 2025-09-05 21:35:34 +00:00
RedLine AI Agent
1000b0cafa Updated libs/xassets/xmultidef.cpp 2025-09-05 21:35:33 +00:00
RedLine AI Agent
9a10f4a9e7 Updated libs/xassets/xmodelpieces.h 2025-09-05 21:35:32 +00:00
RedLine AI Agent
6cb52df017 Updated libs/xassets/xmodelpieces.cpp 2025-09-05 21:35:30 +00:00
RedLine AI Agent
e1f8897150 Updated libs/xassets/xmodelpiece.h 2025-09-05 21:35:29 +00:00
RedLine AI Agent
aa8a6d18ae Updated libs/xassets/xmodelpiece.cpp 2025-09-05 21:35:28 +00:00
RedLine AI Agent
d70b54480d Updated libs/xassets/xmodeldrawinfo.h 2025-09-05 21:35:26 +00:00
RedLine AI Agent
d2eb7b9795 Updated libs/xassets/xmodeldrawinfo.cpp 2025-09-05 21:35:25 +00:00
RedLine AI Agent
e7aca45a9f Updated libs/xassets/xmenuenums.h 2025-09-05 21:35:24 +00:00
RedLine AI Agent
7752d3ada5 Updated libs/xassets/xmaterialtechniqueset.h 2025-09-05 21:35:23 +00:00
RedLine AI Agent
4cfd3da983 Updated libs/xassets/xmaterialtechniqueset.cpp 2025-09-05 21:35:21 +00:00
RedLine AI Agent
1ea1ae3199 Updated libs/xassets/xmaterialmemory.h 2025-09-05 21:35:20 +00:00
RedLine AI Agent
2b29b121e0 Updated libs/xassets/xmaterialmemory.cpp 2025-09-05 21:35:19 +00:00
RedLine AI Agent
5c9868c435 Updated libs/xassets/xlistboxdef.h 2025-09-05 21:35:17 +00:00
RedLine AI Agent
6c0a111c09 Updated libs/xassets/xlistboxdef.cpp 2025-09-05 21:35:16 +00:00
RedLine AI Agent
4cbf8ca553 Updated libs/xassets/xitemkeyhandler.h 2025-09-05 21:35:15 +00:00
RedLine AI Agent
5aefd3e4e1 Updated libs/xassets/xitemkeyhandler.cpp 2025-09-05 21:35:14 +00:00
RedLine AI Agent
8bb5287605 Updated libs/xassets/xitemdefdata.h 2025-09-05 21:35:12 +00:00
RedLine AI Agent
0c2478cc70 Updated libs/xassets/xitemdefdata.cpp 2025-09-05 21:35:10 +00:00
RedLine AI Agent
06cda8303d Updated libs/xassets/xitemdef.h 2025-09-05 21:35:09 +00:00
RedLine AI Agent
3c45b639cb Updated libs/xassets/xitemdef.cpp 2025-09-05 21:35:08 +00:00
RedLine AI Agent
aa77115da8 Updated libs/xassets/xglyph.h 2025-09-05 21:35:07 +00:00
RedLine AI Agent
5c42895bb2 Updated libs/xassets/xglyph.cpp 2025-09-05 21:35:05 +00:00
RedLine AI Agent
67668ccc27 Updated libs/xassets/xgfxworldvertexlayerdata.h 2025-09-05 21:35:04 +00:00
RedLine AI Agent
cdf01bb966 Updated libs/xassets/xgfxworldvertexlayerdata.cpp 2025-09-05 21:35:03 +00:00
RedLine AI Agent
178665610c Updated libs/xassets/xgfxworlddpvsstatic.h 2025-09-05 21:35:01 +00:00
RedLine AI Agent
13a7b65f6d Updated libs/xassets/xgfxworlddpvsstatic.cpp 2025-09-05 21:35:00 +00:00
RedLine AI Agent
26ba52bcd2 Updated libs/xassets/xgfxworlddpvsplanes.h 2025-09-05 21:34:59 +00:00
RedLine AI Agent
9e4d14f686 Updated libs/xassets/xgfxworlddpvsplanes.cpp 2025-09-05 21:34:57 +00:00
RedLine AI Agent
5ecabfee07 Updated libs/xassets/xgfxworlddpvsdynamic.h 2025-09-05 21:34:56 +00:00
RedLine AI Agent
caa9fe276e Updated libs/xassets/xgfxworlddpvsdynamic.cpp 2025-09-05 21:34:54 +00:00
RedLine AI Agent
80f1a65a71 Updated libs/xassets/xgfxsurface.h 2025-09-05 21:34:53 +00:00
RedLine AI Agent
2adf0cc1e8 Updated libs/xassets/xgfxsurface.cpp 2025-09-05 21:34:52 +00:00
RedLine AI Agent
1ca6766402 Updated libs/xassets/xgfxstaticmodelinst.h 2025-09-05 21:34:50 +00:00
RedLine AI Agent
08b6e1d6d9 Updated libs/xassets/xgfxstaticmodelinst.cpp 2025-09-05 21:34:49 +00:00
RedLine AI Agent
efd06290d8 Updated libs/xassets/xgfxstaticmodeldrawinst.h 2025-09-05 21:34:48 +00:00
RedLine AI Agent
2f4bc7bb05 Updated libs/xassets/xgfxstaticmodeldrawinst.cpp 2025-09-05 21:34:46 +00:00
RedLine AI Agent
147e4bb079 Updated libs/xassets/xgfxshadowgeometry.h 2025-09-05 21:34:45 +00:00
RedLine AI Agent
749084539e Updated libs/xassets/xgfxshadowgeometry.cpp 2025-09-05 21:34:43 +00:00
RedLine AI Agent
87add0fa93 Updated libs/xassets/xgfxscenedynmodel.h 2025-09-05 21:34:42 +00:00
RedLine AI Agent
98039b533f Updated libs/xassets/xgfxscenedynmodel.cpp 2025-09-05 21:34:41 +00:00
RedLine AI Agent
1d2d68ed54 Updated libs/xassets/xgfxscenedynbrush.h 2025-09-05 21:34:39 +00:00
RedLine AI Agent
18c9457948 Updated libs/xassets/xgfxscenedynbrush.cpp 2025-09-05 21:34:38 +00:00
RedLine AI Agent
bb3683d8fb Updated libs/xassets/xgfxportalwritable.h 2025-09-05 21:34:37 +00:00
RedLine AI Agent
6dd8a4a24c Updated libs/xassets/xgfxportalwritable.cpp 2025-09-05 21:34:36 +00:00
RedLine AI Agent
a2acf1dd90 Updated libs/xassets/xgfxportal.h 2025-09-05 21:34:34 +00:00
RedLine AI Agent
b34959ba1d Updated libs/xassets/xgfxportal.cpp 2025-09-05 21:34:33 +00:00
RedLine AI Agent
2b40623f83 Updated libs/xassets/xgfxplacement.h 2025-09-05 21:34:32 +00:00
RedLine AI Agent
faa73b7697 Updated libs/xassets/xgfxplacement.cpp 2025-09-05 21:34:31 +00:00
RedLine AI Agent
d40b2326f7 Updated libs/xassets/xgfxpackedplacement.h 2025-09-05 21:34:30 +00:00
RedLine AI Agent
57c6c18d8b Updated libs/xassets/xgfxpackedplacement.cpp 2025-09-05 21:34:28 +00:00
RedLine AI Agent
f4b2aaf84e Updated libs/xassets/xgfxlightregionhull.h 2025-09-05 21:34:27 +00:00
RedLine AI Agent
f253b75a45 Updated libs/xassets/xgfxlightregionhull.cpp 2025-09-05 21:34:26 +00:00
RedLine AI Agent
b15886e089 Updated libs/xassets/xgfxlightregionaxis.h 2025-09-05 21:34:24 +00:00
RedLine AI Agent
e78778e82c Updated libs/xassets/xgfxlightregionaxis.cpp 2025-09-05 21:34:23 +00:00
RedLine AI Agent
d957774436 Updated libs/xassets/xgfxlightregion.h 2025-09-05 21:34:22 +00:00
RedLine AI Agent
1722cbf067 Updated libs/xassets/xgfxlightregion.cpp 2025-09-05 21:34:20 +00:00
RedLine AI Agent
c394b38c76 Updated libs/xassets/xgfxlightmaparray.h 2025-09-05 21:34:19 +00:00
RedLine AI Agent
baafe8b4e5 Updated libs/xassets/xgfxlightmaparray.cpp 2025-09-05 21:34:06 +00:00
RedLine AI Agent
78247fafab Updated libs/xassets/xgfxlightgridentry.h 2025-09-05 21:33:54 +00:00
RedLine AI Agent
f7055fbc10 Updated libs/xassets/xgfxlightgridcolors.h 2025-09-05 21:33:44 +00:00
RedLine AI Agent
54a46e8a3e Updated libs/xassets/xgfxlightgrid.h 2025-09-05 21:33:32 +00:00
RedLine AI Agent
3ffcec4a71 Updated libs/xassets/xgfxlightgrid.cpp 2025-09-05 21:33:20 +00:00
RedLine AI Agent
3af6532904 Updated libs/xassets/xgfxcullgroup.h 2025-09-05 21:33:06 +00:00
RedLine AI Agent
f879005e76 Updated libs/xassets/xgfxcullgroup.cpp 2025-09-05 21:32:52 +00:00
RedLine AI Agent
af3f28752a Updated libs/xassets/xgfxcell.h 2025-09-05 21:32:48 +00:00
RedLine AI Agent
240a643111 Updated libs/xassets/xgfxcell.cpp 2025-09-05 21:32:39 +00:00
RedLine AI Agent
bf951db63c Updated libs/xassets/xgfxbrushmodelwritable.h 2025-09-05 21:32:37 +00:00
RedLine AI Agent
54b54a2367 Updated libs/xassets/xgfxbrushmodelwritable.cpp 2025-09-05 21:32:36 +00:00
RedLine AI Agent
5a9855a9f6 Updated libs/xassets/xgfxbrushmodel.h 2025-09-05 21:32:35 +00:00
RedLine AI Agent
3e3553b2ce Updated libs/xassets/xgfxbrushmodel.cpp 2025-09-05 21:32:26 +00:00
RedLine AI Agent
e90788e232 Updated libs/xassets/xgfxaabbtree.h 2025-09-05 21:32:16 +00:00
RedLine AI Agent
c7ed43cf8d Updated libs/xassets/xgfxaabbtree.cpp 2025-09-05 21:32:02 +00:00
RedLine AI Agent
a8ca882e07 Updated libs/xassets/xgame.h 2025-09-05 21:31:49 +00:00
RedLine AI Agent
0e48faf7a3 Updated libs/xassets/xfxspawndefoneshot.h 2025-09-05 21:31:45 +00:00
RedLine AI Agent
51e12e9683 Updated libs/xassets/xfxspawndefoneshot.cpp 2025-09-05 21:31:33 +00:00
RedLine AI Agent
0ec4548a6b Updated libs/xassets/xfxspawndeflooping.h 2025-09-05 21:31:20 +00:00
RedLine AI Agent
c72d51ad1e Updated libs/xassets/xfxspawndeflooping.cpp 2025-09-05 21:31:06 +00:00
RedLine AI Agent
1747f8f8be Updated libs/xassets/xfxspawndef.h 2025-09-05 21:30:52 +00:00
RedLine AI Agent
6fbd17291a Updated libs/xassets/xfxspawndef.cpp 2025-09-05 21:30:51 +00:00
RedLine AI Agent
e1ec4b8878 Updated libs/xassets/xfxintrange.h 2025-09-05 21:30:49 +00:00
RedLine AI Agent
1d08ae6af6 Updated libs/xassets/xfxintrange.cpp 2025-09-05 21:30:48 +00:00
njohnson
c596b3a828 Remove retained copies. 2025-09-05 17:27:56 -04:00
RedLine AI Agent
846c689088 Updated libs/xassets/xfximpacttable.h 2025-09-05 21:27:31 +00:00
RedLine AI Agent
84dc8358a7 Updated libs/xassets/xfximpacttable.cpp 2025-09-05 21:27:30 +00:00
RedLine AI Agent
86092b18a2 Updated libs/xassets/xfxfloatrange.h 2025-09-05 21:27:28 +00:00
RedLine AI Agent
c968117ed1 Updated libs/xassets/xfxfloatrange.cpp 2025-09-05 21:27:27 +00:00
RedLine AI Agent
ef884f4be7 Updated libs/xassets/xfxelematlas.h 2025-09-05 21:27:26 +00:00
RedLine AI Agent
5bf97fcf1a Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:27:24 +00:00
RedLine AI Agent
c0967ce23e Updated libs/xassets/xfxelematlas.h 2025-09-05 21:27:23 +00:00
RedLine AI Agent
de0e4c5aae Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:27:22 +00:00
RedLine AI Agent
01094b8d9e Updated libs/xassets/xfxelematlas.h 2025-09-05 21:27:20 +00:00
RedLine AI Agent
7af197ad80 Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:27:17 +00:00
RedLine AI Agent
136a49801e Updated libs/xassets/xfxelematlas.h 2025-09-05 21:27:05 +00:00
RedLine AI Agent
d603742172 Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:26:58 +00:00
RedLine AI Agent
cdf8ac1ffc Updated libs/xassets/xfxelematlas.h 2025-09-05 21:26:45 +00:00
RedLine AI Agent
8d5c2c7ea1 Updated libs/xassets/xfxelematlas.cpp 2025-09-05 21:26:32 +00:00
RedLine AI Agent
d075ad4c24 Updated libs/xassets/xfxeffectdef.h 2025-09-05 21:26:19 +00:00
RedLine AI Agent
4e1c18fff2 Updated libs/xassets/xfxeffectdef.cpp 2025-09-05 21:26:14 +00:00
RedLine AI Agent
a2e9683ba3 Updated libs/xassets/xfont.h 2025-09-05 21:26:13 +00:00
RedLine AI Agent
f7444171e3 Updated libs/xassets/xfont.cpp 2025-09-05 21:26:12 +00:00
RedLine AI Agent
fdea13bf84 Updated libs/xassets/xexpressionentry.h 2025-09-05 21:26:11 +00:00
RedLine AI Agent
a06df405fc Updated libs/xassets/xexpressionentry.cpp 2025-09-05 21:26:09 +00:00
RedLine AI Agent
70515d28d4 Updated libs/xassets/xentryinternaldata.h 2025-09-05 21:26:08 +00:00
RedLine AI Agent
37c25d3baf Updated libs/xassets/xentryinternaldata.cpp 2025-09-05 21:26:07 +00:00
RedLine AI Agent
75802ffa8e Updated libs/xassets/xdynentitypose.h 2025-09-05 21:26:06 +00:00
RedLine AI Agent
5a35d4f4d8 [No changes] 2025-09-05 21:25:17 +00:00
RedLine AI Agent
9958f33b60 [No changes] 2025-09-05 21:25:15 +00:00
RedLine AI Agent
c1e9b308a1 [No changes] 2025-09-05 21:25:12 +00:00
RedLine AI Agent
6ef4fe82da [No changes] 2025-09-05 21:25:10 +00:00
RedLine AI Agent
8f287ceeec [No changes] 2025-09-05 21:25:09 +00:00
RedLine AI Agent
12b4a77f1f [No changes] 2025-09-05 21:24:58 +00:00
RedLine AI Agent
38dd74b188 [No changes] 2025-09-05 21:24:57 +00:00
RedLine AI Agent
e3db1e11cc [No changes] 2025-09-05 21:24:56 +00:00
RedLine AI Agent
0d9d2fccfb [No changes] 2025-09-05 21:24:56 +00:00
RedLine AI Agent
c84463e3c2 [No changes] 2025-09-05 21:24:55 +00:00
RedLine AI Agent
619cfad47c [No changes] 2025-09-05 21:24:54 +00:00
RedLine AI Agent
17408d5d4e [No changes] 2025-09-05 21:24:54 +00:00
RedLine AI Agent
04daaeaf7f [No changes] 2025-09-05 21:24:53 +00:00
RedLine AI Agent
92456f1da6 [No changes] 2025-09-05 21:24:52 +00:00
RedLine AI Agent
38909a69a6 [No changes] 2025-09-05 21:24:51 +00:00
RedLine AI Agent
26a1629dee [No changes] 2025-09-05 21:24:51 +00:00
RedLine AI Agent
cc5c1854e2 [No changes] 2025-09-05 21:24:50 +00:00
RedLine AI Agent
fccad08fb0 [No changes] 2025-09-05 21:24:46 +00:00
RedLine AI Agent
0d156994b4 [No changes] 2025-09-05 21:24:44 +00:00
RedLine AI Agent
dd1eb94beb [No changes] 2025-09-05 21:24:37 +00:00
RedLine AI Agent
b53f169a4f [No changes] 2025-09-05 21:24:29 +00:00
RedLine AI Agent
ce9bcefb88 No changes. 2025-09-05 21:24:21 +00:00
RedLine AI Agent
ab60c56e88 [No changes] 2025-09-05 21:24:14 +00:00
njohnson
32e4815cbe Update .gitignore 2025-09-05 17:22:49 -04:00
RedLine AI Agent
a8ee358150 Add: libs/*/release/*
Add: libs/*/debug/*
2025-09-05 21:05:49 +00:00
RedLine AI Agent
302350fe2c Add: data/obj/* 2025-09-05 21:02:46 +00:00
RedLine AI Agent
2f323046d3 Add: *.XMODEL_EXPORT 2025-09-05 21:01:00 +00:00
RedLine AI Agent
3dad8bfb5c Update: data/Data.qrc 2025-09-05 20:59:08 +00:00
RedLine AI Agent
f8624c8997 Update: app/zonefileviewer.ui 2025-09-05 20:59:06 +00:00
RedLine AI Agent
9d8e214ae3 Update: app/zonefileviewer.h 2025-09-05 20:59:03 +00:00
RedLine AI Agent
15bbbec1db Update: app/zonefileviewer.cpp 2025-09-05 20:54:46 +00:00
RedLine AI Agent
00a3dfb958 Update: app/xtreewidgetitem.h 2025-09-05 20:54:42 +00:00
RedLine AI Agent
12c9e79bf2 Update: app/xtreewidgetitem.cpp 2025-09-05 20:54:30 +00:00
RedLine AI Agent
39cd33efd4 Update: app/xtreewidget.h 2025-09-05 20:54:06 +00:00
RedLine AI Agent
ce5c98b78d Update: app/soundviewer.ui 2025-09-05 20:53:15 +00:00
RedLine AI Agent
053c440415 Update app/techsetviewer.ui 2025-09-05 20:47:55 +00:00
RedLine AI Agent
d477865e9a Update app/techsetviewer.h 2025-09-05 20:47:19 +00:00
RedLine AI Agent
a7e0859b8d Update app/techsetviewer.cpp 2025-09-05 20:47:17 +00:00
RedLine AI Agent
ed593d3ae1 Update app/stringtableviewer.ui 2025-09-05 20:47:15 +00:00
RedLine AI Agent
d973d2bee5 Update app/stringtableviewer.h 2025-09-05 20:47:03 +00:00
RedLine AI Agent
90c3d3bef3 Update app/stringtableviewer.cpp 2025-09-05 20:46:50 +00:00
RedLine AI Agent
d583b9ce08 Update app/soundviewer.ui 2025-09-05 20:46:36 +00:00
RedLine AI Agent
46792b3dc6 Update app/soundviewer.h 2025-09-05 20:45:06 +00:00
RedLine AI Agent
1739a4686e Update app/soundviewer.cpp 2025-09-05 20:45:03 +00:00
RedLine AI Agent
28257af738 Update app/rumblegraphviewer.ui 2025-09-05 20:45:00 +00:00
RedLine AI Agent
50fb3d2557 Update app/rumblegraphviewer.h 2025-09-05 20:44:57 +00:00
RedLine AI Agent
3f0d4641b1 Update app/rumblegraphviewer.cpp 2025-09-05 20:44:54 +00:00
RedLine AI Agent
b2fcdd1762 Update app/rumblefileviewer.ui 2025-09-05 20:44:51 +00:00
RedLine AI Agent
99706b868b Update app/rumblefileviewer.h 2025-09-05 20:44:48 +00:00
RedLine AI Agent
dfe3311323 Update app/rumblefileviewer.cpp 2025-09-05 20:44:47 +00:00
RedLine AI Agent
6a04ed7431 Update app/reportissuedialog.ui 2025-09-05 20:44:45 +00:00
RedLine AI Agent
32ab5c7451 Update app/reportissuedialog.h 2025-09-05 20:44:40 +00:00
RedLine AI Agent
b6403208f1 Update app/reportissuedialog.cpp 2025-09-05 20:44:38 +00:00
RedLine AI Agent
fcaa1eacaf Update app/preferenceeditor.ui 2025-09-05 20:44:36 +00:00
RedLine AI Agent
97c4fbddde Update app/preferenceeditor.h 2025-09-05 20:44:33 +00:00
RedLine AI Agent
ed9e7ee558 Update app/preferenceeditor.cpp 2025-09-05 20:44:31 +00:00
RedLine AI Agent
618c304a87 Update app/modelviewer.ui 2025-09-05 20:44:29 +00:00
RedLine AI Agent
cc311c2a1a Update app/modelviewer.h 2025-09-05 20:44:24 +00:00
RedLine AI Agent
fda7f55231 Update app/modelviewer.cpp 2025-09-05 20:44:12 +00:00
RedLine AI Agent
fe5724ef82 Update app/materialviewer.ui 2025-09-05 20:43:12 +00:00
RedLine AI Agent
1a0ba48b51 Update app/materialviewer.h 2025-09-05 20:42:01 +00:00
RedLine AI Agent
713d55b4eb Update app/materialviewer.cpp 2025-09-05 20:41:21 +00:00
RedLine AI Agent
59d6d6907a Refactor mainwindow.ui: replace the entire UI definition with a cleaned‑up, consistent layout and action structure. 2025-09-05 19:59:40 +00:00
RedLine AI Agent
020178f780 Update app/mainwindow.h 2025-09-05 19:57:04 +00:00
RedLine AI Agent
a2242fe018 Update app/mainwindow.cpp 2025-09-05 19:54:14 +00:00
RedLine AI Agent
ef6d1007e6 Update app/main.cpp 2025-09-05 19:54:09 +00:00
RedLine AI Agent
9971facf90 Update app/localstringviewer.ui 2025-09-05 19:54:03 +00:00
RedLine AI Agent
3a0070612a Update app/localstringviewer.h 2025-09-05 19:53:52 +00:00
RedLine AI Agent
8f415d4fe6 Update app/localstringviewer.cpp 2025-09-05 19:53:47 +00:00
RedLine AI Agent
f438e6c063 Update app/iwiviewer.ui 2025-09-05 19:53:26 +00:00
RedLine AI Agent
1e086cf00a Update app/iwiviewer.h 2025-09-05 19:53:11 +00:00
RedLine AI Agent
d166e3329a Update app/ddsviewer.h 2025-09-05 19:51:20 +00:00
RedLine AI Agent
4db49c0896 Update app/imagewidget.ui 2025-09-05 19:48:54 +00:00
RedLine AI Agent
12806268d4 Update app/imagewidget.h 2025-09-05 19:48:43 +00:00
RedLine AI Agent
39d37640cc Update app/imagewidget.cpp 2025-09-05 19:48:15 +00:00
RedLine AI Agent
d771df9b09 Update app/fastfileviewer.ui 2025-09-05 19:47:52 +00:00
RedLine AI Agent
44af7bf03c Update app/fastfileviewer.h 2025-09-05 19:47:15 +00:00
RedLine AI Agent
07e473bad0 Update app/fastfileviewer.cpp 2025-09-05 19:46:47 +00:00
RedLine AI Agent
19d417e84b Update app/ddsviewer.ui 2025-09-05 19:46:04 +00:00
RedLine AI Agent
c898f62d69 Update app/ddsviewer.h 2025-09-05 19:45:44 +00:00
RedLine AI Agent
d69f6eef40 Update app/ddsviewer.cpp 2025-09-05 19:44:32 +00:00
RedLine AI Agent
affd9fe889 Update app/d3dbsp_structs.h 2025-09-05 19:44:25 +00:00
RedLine AI Agent
90ebbd86ee Update app/app.pro 2025-09-05 19:43:49 +00:00
RedLine AI Agent
50a1aa3bbc Update app/aboutdialog.ui 2025-09-05 19:43:41 +00:00
RedLine AI Agent
270dacf1e5 Update app/aboutdialog.cpp 2025-09-05 19:43:31 +00:00
RedLine AI Agent
4a4df3c2a4 Update app/aboutdialog.cpp 2025-09-05 19:42:32 +00:00
Nicholas Johnson
4d7598e805 Update app/LICENSE: normalize line endings 2025-09-05 13:59:36 -04:00
Nicholas Johnson
94d407ffb7 Update XPlor.pro: fix formatting and line endings 2025-09-05 13:54:40 -04:00
Nicholas Johnson
3291e52cc6 Update .gitignore: remove leading hyphens and standardize patterns 2025-09-05 13:53:56 -04:00
Nicholas Johnson
f576af8f11 Remove temp autosave file. 2025-09-03 13:40:02 -04:00
Nicholas Johnson
eee7231737 Add autosave files. 2025-09-03 13:39:42 -04:00
Nicholas Johnson
e7455256a7 Add xwaterwritable structures 2025-09-03 13:28:24 -04:00
Nicholas Johnson
2a026947c4 Add xwater structures 2025-09-03 13:28:13 -04:00
Nicholas Johnson
12795451e6 Add xsurfacevertexinfo structures 2025-09-03 13:28:03 -04:00
Nicholas Johnson
c9802401fb Add xsurfacecollisiontree structures 2025-09-03 13:27:52 -04:00
Nicholas Johnson
5a12e3c967 Add xsurfacecollisionnode structures 2025-09-03 13:26:37 -04:00
Nicholas Johnson
a02e3714d0 Add xsurfacecollisionleaf structures 2025-09-03 13:26:24 -04:00
Nicholas Johnson
84f99dc919 Add xsurfacecollisionaabb structures 2025-09-03 13:26:11 -04:00
Nicholas Johnson
163f46b4cf Add xsurface structures 2025-09-03 13:25:58 -04:00
Nicholas Johnson
7b1d269986 Add xstreamsourceinfo structures 2025-09-03 13:25:47 -04:00
Nicholas Johnson
386d0793aa Add xstreamdelayinfo structures 2025-09-03 13:25:36 -04:00
Nicholas Johnson
dc3360a97d Add xscriptstringlist structures 2025-09-03 13:22:24 -04:00
Nicholas Johnson
6ab9a9b350 Add xrigidvertlist structures 2025-09-03 13:21:14 -04:00
Nicholas Johnson
e3f971f62c Add xphyspreset structures 2025-09-03 13:21:02 -04:00
Nicholas Johnson
3a718acb50 Add xphysmass structures 2025-09-03 13:20:51 -04:00
Nicholas Johnson
2e09f532b9 Add xphysgeomlist structures 2025-09-03 13:20:39 -04:00
Nicholas Johnson
c39185e35c Add xphysgeominfo structures 2025-09-03 13:20:29 -04:00
Nicholas Johnson
eee271278a Add xpackedunitvec structures 2025-09-03 13:20:19 -04:00
Nicholas Johnson
e7077aae63 Add xpackedtexcoords structures 2025-09-03 13:20:07 -04:00
Nicholas Johnson
78a6efd02f Add xmodelstreaminfo structures 2025-09-03 13:19:57 -04:00
Nicholas Johnson
73b3cc9e75 Add xmodellodinfo structures 2025-09-03 13:18:53 -04:00
Nicholas Johnson
ef6f75c8a8 Add xmodelhighmipbounds structures 2025-09-03 13:18:40 -04:00
Nicholas Johnson
3bed978b89 Add xmodelcollsurf structures 2025-09-03 13:18:27 -04:00
Nicholas Johnson
dcab86b1ed Add xmaterialvertexstreamrouting structures 2025-09-03 13:18:16 -04:00
Nicholas Johnson
7cf9ac8d4c Add xmaterialvertexdeclaration structures 2025-09-03 13:18:05 -04:00
Nicholas Johnson
e63cf8554e Add xmaterialvertexshaderprogram structures 2025-09-03 13:17:42 -04:00
Nicholas Johnson
d7e4dfda41 Add xmaterialvertexshader structures 2025-09-03 13:17:32 -04:00
Nicholas Johnson
9c92fcd854 Add xmaterialtexturedefinfo structures 2025-09-03 13:17:22 -04:00
Nicholas Johnson
7768c5f7f5 Add xmaterialtexturedef structures 2025-09-03 13:16:15 -04:00
Nicholas Johnson
58e87e8787 Add xmaterialtechnique structures 2025-09-03 13:16:04 -04:00
Nicholas Johnson
b176bc3d00 Add xmaterialstreamrouting structures 2025-09-03 13:15:52 -04:00
Nicholas Johnson
3c13462618 Add xmaterialshaderargument structures 2025-09-03 13:15:41 -04:00
Nicholas Johnson
68a41d4582 Add xmaterialpixelshaderprogram structures 2025-09-03 13:15:31 -04:00
Nicholas Johnson
60e93e0ab3 Add xmaterialpixelshader structures 2025-09-03 13:15:22 -04:00
Nicholas Johnson
9fb5c62b75 Add xmaterialpass structures 2025-09-03 13:15:13 -04:00
Nicholas Johnson
352e51170d Add xmaterialinfo structures 2025-09-03 13:15:04 -04:00
Nicholas Johnson
fc64762bfe Add xmaterialconstantdef structures 2025-09-03 13:14:06 -04:00
Nicholas Johnson
fe34c63697 Add xmaterialargumentdef structures 2025-09-03 13:13:53 -04:00
Nicholas Johnson
02d96741e8 Add xmaterialargumentcodeconst structures 2025-09-03 13:13:41 -04:00
Nicholas Johnson
d8b27a31d2 Add xmaterial.cpp 2025-09-03 13:13:30 -04:00
Nicholas Johnson
4fcd3a4c60 Add xmaterial structures 2025-09-03 13:12:46 -04:00
Nicholas Johnson
fd1868ed46 Add xmaptype structures 2025-09-03 13:12:39 -04:00
Nicholas Johnson
7250e1f460 Add xgputexturesizestack3d structures 2025-09-03 13:11:38 -04:00
Nicholas Johnson
1e0a490a69 Add xgputexturesizestack2d structures 2025-09-03 13:11:27 -04:00
Nicholas Johnson
bfedb389b8 Add xgputexturesizestack1d structures 2025-09-03 13:11:16 -04:00
Nicholas Johnson
0a2fdd0b74 Add xgputexturesizestack structures 2025-09-03 13:11:05 -04:00
Nicholas Johnson
a2959f9b29 Add xgputexturesize3d structures 2025-09-03 13:10:54 -04:00
Nicholas Johnson
cd99390ba7 Add xgputexturesize2d structures 2025-09-03 13:10:44 -04:00
Nicholas Johnson
388e2dfc52 Add xgputexturesize1d structures 2025-09-03 13:10:35 -04:00
Nicholas Johnson
47e09afa73 Add xgpuvertexrawrequest structures 2025-09-03 13:08:56 -04:00
Nicholas Johnson
cdef686ec4 Add xgpuvertexfetchconstant structures 2025-09-03 13:08:47 -04:00
Nicholas Johnson
be21cf40cb Add xgfxvertexshaderloaddef structures 2025-09-03 13:08:37 -04:00
Nicholas Johnson
4eb817375c Add xgfxstatebits structures 2025-09-03 13:08:03 -04:00
Nicholas Johnson
5a623c18d0 Add xgfxpixelshaderloaddef structures 2025-09-03 13:07:19 -04:00
Nicholas Johnson
63ca1074fc Add xgfxpackedvertex structures 2025-09-03 13:07:08 -04:00
Nicholas Johnson
9a70b774ab Add xgfxdrawsurffields structures 2025-09-03 13:06:58 -04:00
Nicholas Johnson
ea385c2853 Add xgfxdrawsurf structures 2025-09-03 13:06:49 -04:00
Nicholas Johnson
f9604bc858 Add xgfxcolor structures 2025-09-03 13:06:40 -04:00
Nicholas Johnson
65a37363e6 Add xfxtrailvertex structures 2025-09-03 13:06:31 -04:00
Nicholas Johnson
2879a89594 Add xfxtraildef structures 2025-09-03 13:06:22 -04:00
Nicholas Johnson
6bc88394cd Add xfximpactentry structures 2025-09-03 13:06:13 -04:00
Nicholas Johnson
f17d56c603 Add xfxelemvisuals structures 2025-09-03 13:05:35 -04:00
Nicholas Johnson
2253db1abb Add xfxelemvisstatesample structures 2025-09-03 13:05:24 -04:00
Nicholas Johnson
c362953775 Add xfxelemmarkvisuals structures 2025-09-03 13:05:14 -04:00
Nicholas Johnson
6ea2989d69 Add xfxelemdefvisuals structures 2025-09-03 13:05:03 -04:00
Nicholas Johnson
ea90db4fe6 Add xfxelemdef structures 2025-09-03 13:04:54 -04:00
Nicholas Johnson
2b1a18be6a Add xfile structures 2025-09-03 13:04:45 -04:00
Nicholas Johnson
40ad7470aa Add new asset-related structures and files 2025-09-03 13:04:24 -04:00
Nicholas Johnson
89d1d0944a Update zonefile structures and project files 2025-09-03 13:03:14 -04:00
Nicholas Johnson
73e13263fc Update node type and path node transient structures 2025-09-03 13:03:03 -04:00
Nicholas Johnson
60ddd31101 Update model structures 2025-09-03 13:02:54 -04:00
Nicholas Johnson
ee4a680d6d Update GPU texture fetch constant structures 2025-09-03 13:02:39 -04:00
Nicholas Johnson
2f61367fcb Update texture handling structures 2025-09-03 13:02:31 -04:00
Nicholas Johnson
c7b1c97d68 Update lighting and streaming AABB tree structures 2025-09-03 13:02:23 -04:00
Nicholas Johnson
ed30f6b861 Update material and image handling structures 2025-09-03 13:01:39 -04:00
Nicholas Johnson
5ea8c5f09a Update Direct3D texture structures 2025-09-03 13:01:26 -04:00
Nicholas Johnson
d1cf5ecc52 Update collision leaf and brush node structures 2025-09-03 13:01:12 -04:00
Nicholas Johnson
a85abf0ecd Update asset and animation structure definitions 2025-09-03 13:00:58 -04:00
Nicholas Johnson
caca3dd489 Update animation-related files 2025-09-03 13:00:41 -04:00
Nicholas Johnson
39853c77fe Update asset-related core files 2025-09-03 13:00:27 -04:00
Nicholas Johnson
f149b66322 Remove deprecated and unused asset-related files 2025-09-03 13:00:02 -04:00
Nicholas Johnson
0ea4a7ad6f Added a tonnn of new classes. 2025-08-17 13:14:17 -04:00
Nicholas Johnson
729a6bac7c Renamed Assets to XAssets. 2025-08-14 18:50:13 -04:00
Nicholas Johnson
be8aa3691e Hey baby girl 2025-08-14 17:30:25 -04:00
Nicholas Johnson
cfa0638b94 More decompiled translations :(. 2025-07-10 01:07:48 -04:00
=
ff1a25b41f Uh. 2025-07-10 00:11:33 -04:00
=
a0cfb65b56 Add tool changes to project. 2025-07-10 00:11:20 -04:00
=
77428c0515 update tests and project. 2025-07-10 00:11:06 -04:00
=
34d6ae6658 Fastfile and other file changes. 2025-07-10 00:10:49 -04:00
=
f339360fbc Removed/renamed some files. 2025-07-10 00:10:30 -04:00
=
f23c38cc3c Removed/renamed some files. 2025-07-10 00:10:16 -04:00
=
fdf1559f09 Tried making magic asset parser. To be contondered. 2025-07-10 00:09:18 -04:00
=
556e33d56f Added dxd9 sdk, even big libs lol. 2025-07-10 00:08:30 -04:00
=
c980d53543 Tried using the IDA pro exports, didnt work. 2025-07-10 00:07:22 -04:00
=
c8cfc1c5fc Autotest changes. 2025-07-10 00:06:51 -04:00
=
a7904ca74e Compro changes. 2025-07-10 00:06:37 -04:00
=
6cc3d71acf Some bs zentry changes. 2025-07-10 00:06:16 -04:00
=
23827f4ffa Zonefile changes and additions. 2025-07-10 00:05:44 -04:00
=
67050e6a67 Lotta asset changes 2025-07-10 00:04:52 -04:00
=
0943608bd8 Add issue reporter dialog. 2025-07-10 00:02:15 -04:00
=
f1aa61bf3b Add ported code from ida. 2025-06-07 11:20:47 -04:00
980 changed files with 279422 additions and 50903 deletions

37
.gitignore vendored
View File

@ -1,15 +1,22 @@
/build/ /build/
/data/dlls/ /data/dlls/
/data/fastfiles/ /data/fastfiles/
/releases/ /releases/
# Ignore Qt Creator user files # Ignore Qt Creator user files
*.pro.user *.pro.user
*.pro.user.* *.pro.user.*
*.qbs.user *.qbs.user
*.qbs.user.* *.qbs.user.*
*.creator.user *.creator.user
*.creator.user.* *.creator.user.*
*.creator.* *.creator.*
*.ps1 *.ps1
version.txt version.txt
*.autosave
*.XMODEL_EXPORT
data/obj/*
libs/*/release/*
libs/*/debug/*
.git.stash
*Makefile*

23
.qmake.stash Normal file
View File

@ -0,0 +1,23 @@
QMAKE_CXX.QT_COMPILER_STDCXX = 199711L
QMAKE_CXX.QMAKE_MSC_VER = 1943
QMAKE_CXX.QMAKE_MSC_FULL_VER = 194334810
QMAKE_CXX.COMPILER_MACROS = \
QT_COMPILER_STDCXX \
QMAKE_MSC_VER \
QMAKE_MSC_FULL_VER
QMAKE_CXX.INCDIRS = \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\include" \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\ATLMFC\\include" \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\VS\\include" \
"C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.26100.0\\ucrt" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.26100.0\\\\um" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.26100.0\\\\shared" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.26100.0\\\\winrt" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.26100.0\\\\cppwinrt" \
"C:\\Program Files (x86)\\Windows Kits\\NETFXSDK\\4.8\\include\\um"
QMAKE_CXX.LIBDIRS = \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\ATLMFC\\lib\\x64" \
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\lib\\x64" \
"C:\\Program Files (x86)\\Windows Kits\\NETFXSDK\\4.8\\lib\\um\\x64" \
"C:\\Program Files (x86)\\Windows Kits\\10\\lib\\10.0.26100.0\\ucrt\\x64" \
"C:\\Program Files (x86)\\Windows Kits\\10\\\\lib\\10.0.26100.0\\\\um\\x64"

4
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,4 @@
{
"workbench.colorTheme": "Default Dark Modern",
"workbench.startupEditor": "none"
}

View File

@ -1,10 +1,10 @@
TEMPLATE = subdirs TEMPLATE = subdirs
SUBDIRS += libs \ SUBDIRS += libs \
app \ app \
tools \ tools \
tests tests
tests.depends = libs tests.depends = libs
app.depends = libs app.depends = libs
tools.depends = libs tools.depends = libs

View File

@ -1,201 +1,201 @@
Apache License Apache License
Version 2.0, January 2004 Version 2.0, January 2004
http://www.apache.org/licenses/ http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions. 1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, "License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document. and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by "Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License. the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all "Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition, control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the "control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity. outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity "You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License. exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, "Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation including but not limited to software source code, documentation
source, and configuration files. source, and configuration files.
"Object" form shall mean any form resulting from mechanical "Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation, not limited to compiled object code, generated documentation,
and conversions to other media types. and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or "Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work copyright notice that is included in or attached to the work
(an example is provided in the Appendix below). (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object "Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of, separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof. the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including "Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted" the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution." designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity "Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work. subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of 2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual, this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of, copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form. Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of 3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual, this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made, (except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work, use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s) Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate granted to You under this License for that Work shall terminate
as of the date such litigation is filed. as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the 4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You modifications, and in Source or Object form, provided that You
meet the following conditions: meet the following conditions:
(a) You must give any other recipients of the Work or (a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices (b) You must cause any modified files to carry prominent notices
stating that You changed the files; and stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works (c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work, attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of excluding those notices that do not pertain to any part of
the Derivative Works; and the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its (d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or, documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed that such additional attribution notices cannot be construed
as modifying the License. as modifying the License.
You may add Your own copyright statement to Your modifications and You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use, for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License. the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, 5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions. this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions. with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade 6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor, names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file. origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or 7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS, Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License. risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, 8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise, whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill, Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages. has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing 9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer, the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity, and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify, of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability. of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work. APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]" boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier same "printed page" as the copyright notice for easier
identification within third-party archives. identification within third-party archives.
Copyright [yyyy] [name of copyright owner] Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.

View File

@ -1,14 +1,14 @@
#include "aboutdialog.h" #include "aboutdialog.h"
#include "ui_aboutdialog.h" #include "ui_aboutdialog.h"
AboutDialog::AboutDialog(QWidget *parent) AboutDialog::AboutDialog(QWidget *parent)
: QDialog(parent) : QDialog(parent)
, ui(new Ui::AboutDialog) , ui(new Ui::AboutDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
AboutDialog::~AboutDialog() AboutDialog::~AboutDialog()
{ {
delete ui; delete ui;
} }

View File

@ -1,22 +1,22 @@
#ifndef ABOUTDIALOG_H #ifndef ABOUTDIALOG_H
#define ABOUTDIALOG_H #define ABOUTDIALOG_H
#include <QDialog> #include <QDialog>
namespace Ui { namespace Ui {
class AboutDialog; class AboutDialog;
} }
class AboutDialog : public QDialog class AboutDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit AboutDialog(QWidget *parent = nullptr); explicit AboutDialog(QWidget *parent = nullptr);
~AboutDialog(); ~AboutDialog();
private: private:
Ui::AboutDialog *ui; Ui::AboutDialog *ui;
}; };
#endif // ABOUTDIALOG_H #endif // ABOUTDIALOG_H

View File

@ -1,241 +1,241 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>AboutDialog</class> <class>AboutDialog</class>
<widget class="QDialog" name="AboutDialog"> <widget class="QDialog" name="AboutDialog">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>350</width> <width>350</width>
<height>200</height> <height>200</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>350</width> <width>350</width>
<height>200</height> <height>200</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>350</width> <width>350</width>
<height>200</height> <height>200</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>About XPlor</string> <string>About XPlor</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>80</width> <width>80</width>
<height>80</height> <height>80</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>80</width> <width>80</width>
<height>80</height> <height>80</height>
</size> </size>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="pixmap"> <property name="pixmap">
<pixmap resource="Data.qrc">:/images/data/images/XPlor.png</pixmap> <pixmap resource="Data.qrc">:/images/data/images/XPlor.png</pixmap>
</property> </property>
<property name="scaledContents"> <property name="scaledContents">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set> <set>Qt::AlignmentFlag::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>XPlor v1.5</string> <string>XPlor v1.5</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Copyright © 2024 RedLine Solutions LLC</string> <string>Copyright © 2024 RedLine Solutions LLC</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>For more, check out redline.llc</string> <string>For more, check out redline.llc</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_3"> <spacer name="verticalSpacer_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeType"> <property name="sizeType">
<enum>QSizePolicy::Policy::Fixed</enum> <enum>QSizePolicy::Policy::Fixed</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>10</height> <height>10</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>With Help From:</string> <string>With Help From:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>- Paging Red</string> <string>- Paging Red</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_8"> <widget class="QLabel" name="label_8">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>- ISOCheated</string> <string>- ISOCheated</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_7"> <widget class="QLabel" name="label_7">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>- SureShotIan</string> <string>- SureShotIan</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_2"> <spacer name="verticalSpacer_2">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources> <resources>
<include location="Data.qrc"/> <include location="Data.qrc"/>
</resources> </resources>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,118 +1,61 @@
QT += core widgets gui multimedia QT += core widgets gui multimedia
RC_ICONS = app.ico RC_ICONS = app.ico
SUBDIRS += app SUBDIRS += app
CONFIG += c++17 CONFIG += c++17
SOURCES += \ SOURCES += $$files($$PWD/*.cpp)
aboutdialog.cpp \ HEADERS += $$files($$PWD/*.h)
ddsviewer.cpp \ FORMS += $$files($$PWD/*.ui)
fastfileviewer.cpp \
imagewidget.cpp \ RESOURCES += ../data/data.qrc
iwiviewer.cpp \
localstringviewer.cpp \ LIBS += \
main.cpp \ -L$$PWD/../third_party/devil_sdk/lib/ -lDevIL -lILU -lILUT \
mainwindow.cpp \ -L$$PWD/../third_party/zlib/lib/ -lzlib \
materialviewer.cpp \ -L$$PWD/../third_party/xbox_sdk/lib -lxcompress64 \
preferenceeditor.cpp \ -L$$OUT_PWD/../libs/ -lcore \
soundviewer.cpp \ -L$$OUT_PWD/../libs/ -lxassets\
stringtableviewer.cpp \ -L$$OUT_PWD/../libs/ -lcompression \
rumblegraphviewer.cpp \ -L$$OUT_PWD/../libs/ -lencryption \
rumblefileviewer.cpp \ -L$$OUT_PWD/../libs/ -lfastfile \
techsetviewer.cpp \ -L$$OUT_PWD/../libs/ -lddsfile \
xtreewidget.cpp \ -L$$OUT_PWD/../libs/ -lipakfile \
xtreewidgetitem.cpp \ -L$$OUT_PWD/../libs/ -liwifile \
zonefileviewer.cpp -L$$OUT_PWD/../libs/ -lzonefile
HEADERS += \ INCLUDEPATH += \
aboutdialog.h \ $$PWD/../third_party/devil_sdk/include/ \
d3dbsp_structs.h \ $$PWD/../third_party/zlib/include \
ddsviewer.h \ $$PWD/../third_party/xbox_sdk/include \
fastfileviewer.h \ $$PWD/../libs/core \
imagewidget.h \ $$PWD/../libs/compression \
iwiviewer.h \ $$PWD/../libs/encryption \
localstringviewer.h \ $$PWD/../libs/fastfile \
mainwindow.h \ $$PWD/../libs/ddsfile \
materialviewer.h \ $$PWD/../libs/ipakfile \
preferenceeditor.h \ $$PWD/../libs/iwifile \
soundviewer.h \ $$PWD/../libs/xassets \
stringtableviewer.h \ $$PWD/../libs/zonefile
rumblegraphviewer.h \
rumblefileviewer.h \ DEPENDPATH += \
techsetviewer.h \ $$PWD/../third_party/devil_sdk/include/ \
xtreewidget.h \ $$PWD/../third_party/zlib/include \
xtreewidgetitem.h \ $$PWD/../third_party/xbox_sdk/include \
zonefileviewer.h $$PWD/../libs/core \
$$PWD/../libs/compression \
FORMS += \ $$PWD/../libs/encryption \
aboutdialog.ui \ $$PWD/../libs/fastfile \
ddsviewer.ui \ $$PWD/../libs/ddsfile \
fastfileviewer.ui \ $$PWD/../libs/ipakfile \
imagewidget.ui \ $$PWD/../libs/iwifile \
iwiviewer.ui \ $$PWD/../libs/xassets \
localstringviewer.ui \ $$PWD/../libs/zonefile
mainwindow.ui \
materialviewer.ui \
modelviewer.ui \ win32 {
preferenceeditor.ui \ QMAKE_POST_LINK =
soundviewer.ui \ QMAKE_POST_LINK += for /D %%G in (\"$$PWD/../third_party/*/lib\") do copy /Y \"%%~G\*.dll\" \"$$OUT_PWD/$$DESTDIR/\" >NUL $$escape_expand(\\n\\t)
stringtableviewer.ui \ }
rumblegraphviewer.ui \
rumblefileviewer.ui \
techsetviewer.ui \
zonefileviewer.ui
RESOURCES += ../data/data.qrc
LIBS += \
-L$$PWD/../third_party/devil_sdk/lib/ -lDevIL -lILU -lILUT \
-L$$PWD/../third_party/zlib/lib/ -lzlib \
-L$$PWD/../third_party/xbox_sdk/lib -lxcompress64 \
-L$$OUT_PWD/../libs/ -lcore \
-L$$OUT_PWD/../libs/ -lcompression \
-L$$OUT_PWD/../libs/ -lencryption \
-L$$OUT_PWD/../libs/ -lfastfile \
-L$$OUT_PWD/../libs/ -lddsfile \
-L$$OUT_PWD/../libs/ -lipakfile \
-L$$OUT_PWD/../libs/ -liwifile \
-L$$OUT_PWD/../libs/ -lzonefile
INCLUDEPATH += \
$$PWD/../third_party/devil_sdk/include/ \
$$PWD/../third_party/zlib/include \
$$PWD/../third_party/xbox_sdk/include \
$$PWD/../libs/core \
$$PWD/../libs/compression \
$$PWD/../libs/encryption \
$$PWD/../libs/fastfile \
$$PWD/../libs/ddsfile \
$$PWD/../libs/ipakfile \
$$PWD/../libs/iwifile \
$$PWD/../libs/zonefile
DEPENDPATH += \
$$PWD/../third_party/devil_sdk/include/ \
$$PWD/../third_party/zlib/include \
$$PWD/../third_party/xbox_sdk/include \
$$PWD/../libs/core \
$$PWD/../libs/compression \
$$PWD/../libs/encryption \
$$PWD/../libs/fastfile \
$$PWD/../libs/ddsfile \
$$PWD/../libs/ipakfile \
$$PWD/../libs/iwifile \
$$PWD/../libs/zonefile
# Copy DLLs to Debug folder
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/devil_sdk/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/zlib/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/xna/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"$$PWD/../third_party/xbox_sdk/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
# Copy DLLs to Release folder
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/devil_sdk/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/zlib/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/xna/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"$$PWD/../third_party/xbox_sdk/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t)

View File

@ -1,41 +1,41 @@
#ifndef D3DBSP_STRUCTS_H #ifndef D3DBSP_STRUCTS_H
#define D3DBSP_STRUCTS_H #define D3DBSP_STRUCTS_H
#include <QByteArray> #include <QByteArray>
// Define Lump Structure // Define Lump Structure
struct Lump { struct Lump {
QByteArray content; QByteArray content;
quint32 size = 0; quint32 size = 0;
bool isEmpty = true; bool isEmpty = true;
}; };
// Lump Index Entry Structure // Lump Index Entry Structure
struct LumpIndexEntry { struct LumpIndexEntry {
quint32 type; quint32 type;
quint32 length; quint32 length;
}; };
// Bink structure definitions // Bink structure definitions
struct BINKRECT { struct BINKRECT {
int Left; int Left;
int Top; int Top;
int Width; int Width;
int Height; int Height;
}; };
struct BINK { struct BINK {
int Width; int Width;
int Height; int Height;
uint32_t Frames; uint32_t Frames;
uint32_t FrameNum; uint32_t FrameNum;
uint32_t FrameRate; uint32_t FrameRate;
uint32_t FrameRateDiv; uint32_t FrameRateDiv;
uint32_t ReadError; uint32_t ReadError;
uint32_t OpenFlags; uint32_t OpenFlags;
BINKRECT FrameRects; BINKRECT FrameRects;
uint32_t NumRects; uint32_t NumRects;
uint32_t FrameChangePercent; uint32_t FrameChangePercent;
}; };
#endif // D3DBSP_STRUCTS_H #endif // D3DBSP_STRUCTS_H

View File

@ -1,182 +1,182 @@
#include "ddsviewer.h" #include "ddsviewer.h"
#include "enums.h" #include "enums.h"
#include "ui_ddsviewer.h" #include "ui_ddsviewer.h"
DDSViewer::DDSViewer(QWidget *parent) DDSViewer::DDSViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::DDSViewer) , ui(new Ui::DDSViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
mDDSFile = nullptr; mDDSFile = nullptr;
} }
DDSViewer::~DDSViewer() { DDSViewer::~DDSViewer() {
delete ui; delete ui;
} }
void DDSViewer::SetDDSFile(std::shared_ptr<DDSFile> aDDSFile) { void DDSViewer::SetDDSFile(const DDSFile* aDDSFile) {
mDDSFile.swap(aDDSFile); mDDSFile = aDDSFile;
ui->label_Title->setText(mDDSFile->fileStem + ".dds"); ui->label_Title->setText(mDDSFile->fileStem + ".dds");
char magicData[5]; char magicData[5];
magicData[0] = static_cast<char>(mDDSFile->header.magic & 0xFF); magicData[0] = static_cast<char>(mDDSFile->header.magic & 0xFF);
magicData[1] = static_cast<char>((mDDSFile->header.magic >> 8) & 0xFF); magicData[1] = static_cast<char>((mDDSFile->header.magic >> 8) & 0xFF);
magicData[2] = static_cast<char>((mDDSFile->header.magic >> 16) & 0xFF); magicData[2] = static_cast<char>((mDDSFile->header.magic >> 16) & 0xFF);
magicData[3] = static_cast<char>((mDDSFile->header.magic >> 24) & 0xFF); magicData[3] = static_cast<char>((mDDSFile->header.magic >> 24) & 0xFF);
magicData[4] = '\0'; magicData[4] = '\0';
// If youre using Qt and want a QString: // If youre using Qt and want a QString:
QString magicStr = QString::fromLatin1(magicData); QString magicStr = QString::fromLatin1(magicData);
ui->lineEdit_Magic->setText(magicStr); ui->lineEdit_Magic->setText(magicStr);
ui->spinBox_Size->setValue(mDDSFile->header.size); ui->spinBox_Size->setValue(mDDSFile->header.size);
ui->checkBox_CapsValid->setChecked((mDDSFile->header.flags & DDSD_CAPS) != 0); ui->checkBox_CapsValid->setChecked((mDDSFile->header.flags & DDSD_CAPS) != 0);
ui->checkBox_HeightValid->setChecked((mDDSFile->header.flags & DDSD_HEIGHT) != 0); ui->checkBox_HeightValid->setChecked((mDDSFile->header.flags & DDSD_HEIGHT) != 0);
ui->checkBox_WidthValid->setChecked((mDDSFile->header.flags & DDSD_WIDTH) != 0); ui->checkBox_WidthValid->setChecked((mDDSFile->header.flags & DDSD_WIDTH) != 0);
ui->checkBox_PitchValid->setChecked((mDDSFile->header.flags & DDSD_PITCH) != 0); ui->checkBox_PitchValid->setChecked((mDDSFile->header.flags & DDSD_PITCH) != 0);
ui->checkBox_PFValid->setChecked((mDDSFile->header.flags & DDSD_PIXELFORMAT) != 0); ui->checkBox_PFValid->setChecked((mDDSFile->header.flags & DDSD_PIXELFORMAT) != 0);
ui->checkBox_MipmapCountValid->setChecked((mDDSFile->header.flags & DDSD_MIPMAPCOUNT) != 0); ui->checkBox_MipmapCountValid->setChecked((mDDSFile->header.flags & DDSD_MIPMAPCOUNT) != 0);
ui->checkBox_LinearSizeValid->setChecked((mDDSFile->header.flags & DDSD_LINEARSIZE) != 0); ui->checkBox_LinearSizeValid->setChecked((mDDSFile->header.flags & DDSD_LINEARSIZE) != 0);
ui->checkBox_DepthValid->setChecked((mDDSFile->header.flags & DDSD_DEPTH) != 0); ui->checkBox_DepthValid->setChecked((mDDSFile->header.flags & DDSD_DEPTH) != 0);
ui->spinBox_PLSize->setValue(mDDSFile->header.pitchOrLinearSize); ui->spinBox_PLSize->setValue(mDDSFile->header.pitchOrLinearSize);
ui->spinBox_Depth->setValue(mDDSFile->header.depth); ui->spinBox_Depth->setValue(mDDSFile->header.depth);
ui->spinBox_Width->setValue(mDDSFile->header.width); ui->spinBox_Width->setValue(mDDSFile->header.width);
ui->spinBox_Height->setValue(mDDSFile->header.height); ui->spinBox_Height->setValue(mDDSFile->header.height);
ui->spinBox_MipmapCount->setValue(mDDSFile->header.mipMapCount); ui->spinBox_MipmapCount->setValue(mDDSFile->header.mipMapCount);
ui->spinBox_Res1->setValue(mDDSFile->header.reserved1[0]); ui->spinBox_Res1->setValue(mDDSFile->header.reserved1[0]);
ui->spinBox_Res2->setValue(mDDSFile->header.reserved1[1]); ui->spinBox_Res2->setValue(mDDSFile->header.reserved1[1]);
ui->spinBox_Res3->setValue(mDDSFile->header.reserved1[2]); ui->spinBox_Res3->setValue(mDDSFile->header.reserved1[2]);
ui->spinBox_Res4->setValue(mDDSFile->header.reserved1[3]); ui->spinBox_Res4->setValue(mDDSFile->header.reserved1[3]);
ui->spinBox_Res5->setValue(mDDSFile->header.reserved1[4]); ui->spinBox_Res5->setValue(mDDSFile->header.reserved1[4]);
ui->spinBox_Res6->setValue(mDDSFile->header.reserved1[5]); ui->spinBox_Res6->setValue(mDDSFile->header.reserved1[5]);
ui->spinBox_Res7->setValue(mDDSFile->header.reserved1[6]); ui->spinBox_Res7->setValue(mDDSFile->header.reserved1[6]);
ui->spinBox_Res8->setValue(mDDSFile->header.reserved1[7]); ui->spinBox_Res8->setValue(mDDSFile->header.reserved1[7]);
ui->spinBox_Res9->setValue(mDDSFile->header.reserved1[8]); ui->spinBox_Res9->setValue(mDDSFile->header.reserved1[8]);
ui->spinBox_Res10->setValue(mDDSFile->header.reserved1[9]); ui->spinBox_Res10->setValue(mDDSFile->header.reserved1[9]);
ui->spinBox_Res11->setValue(mDDSFile->header.reserved1[10]); ui->spinBox_Res11->setValue(mDDSFile->header.reserved1[10]);
ui->spinBox_Res12->setValue(mDDSFile->header.reserved2); ui->spinBox_Res12->setValue(mDDSFile->header.reserved2);
ui->spinBox_PF_Size->setValue(mDDSFile->header.pixelFormat.size); ui->spinBox_PF_Size->setValue(mDDSFile->header.pixelFormat.size);
ui->checkBox_PF_AlphaPxValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHAPIXELS) != 0); ui->checkBox_PF_AlphaPxValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHAPIXELS) != 0);
ui->checkBox_PF_AlphaOnlyValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHA) != 0); ui->checkBox_PF_AlphaOnlyValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHA) != 0);
ui->checkBox_PF_FormatValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_FOURCC) != 0); ui->checkBox_PF_FormatValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_FOURCC) != 0);
ui->checkBox_PF_RGBValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_RGB) != 0); ui->checkBox_PF_RGBValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_RGB) != 0);
ui->checkBox_PF_YUVValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_YUV) != 0); ui->checkBox_PF_YUVValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_YUV) != 0);
ui->checkBox_PF_LuminanceValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_LUMINANCE) != 0); ui->checkBox_PF_LuminanceValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_LUMINANCE) != 0);
QString formatStr = QString::number(mDDSFile->header.pixelFormat.format); QString formatStr = QString::number(mDDSFile->header.pixelFormat.format);
switch (mDDSFile->header.pixelFormat.format) { switch (mDDSFile->header.pixelFormat.format) {
case IWI_FORMAT_ARGB32: case IWI_FORMAT_ARGB32:
formatStr = "ARGB32"; formatStr = "ARGB32";
break; break;
case IWI_FORMAT_RGB24: case IWI_FORMAT_RGB24:
formatStr = "RGB24"; formatStr = "RGB24";
break; break;
case IWI_FORMAT_GA16: case IWI_FORMAT_GA16:
formatStr = "GA16"; formatStr = "GA16";
break; break;
case IWI_FORMAT_A8: case IWI_FORMAT_A8:
formatStr = "A8"; formatStr = "A8";
break; break;
case IWI_FORMAT_DXT1: case IWI_FORMAT_DXT1:
formatStr = "DXT1"; formatStr = "DXT1";
break; break;
case IWI_FORMAT_DXT3: case IWI_FORMAT_DXT3:
formatStr = "DXT3"; formatStr = "DXT3";
break; break;
case IWI_FORMAT_DXT5: case IWI_FORMAT_DXT5:
formatStr = "DXT5"; formatStr = "DXT5";
break; break;
} }
ui->lineEdit_PF_Format->setText(formatStr); ui->lineEdit_PF_Format->setText(formatStr);
ui->spinBox_PF_RGBBitCount->setValue(mDDSFile->header.pixelFormat.rgbBitCount); ui->spinBox_PF_RGBBitCount->setValue(mDDSFile->header.pixelFormat.rgbBitCount);
ui->spinBox_RedBitCount->setValue(mDDSFile->header.pixelFormat.rBitMask); ui->spinBox_RedBitCount->setValue(mDDSFile->header.pixelFormat.rBitMask);
ui->spinBox_GreenBitCount->setValue(mDDSFile->header.pixelFormat.gBitMask); ui->spinBox_GreenBitCount->setValue(mDDSFile->header.pixelFormat.gBitMask);
ui->spinBox_BlueBitCount->setValue(mDDSFile->header.pixelFormat.bBitMask); ui->spinBox_BlueBitCount->setValue(mDDSFile->header.pixelFormat.bBitMask);
ui->spinBox_AlphaBitMask->setValue(mDDSFile->header.pixelFormat.aBitMask); ui->spinBox_AlphaBitMask->setValue(mDDSFile->header.pixelFormat.aBitMask);
ui->checkBox_Caps1_TextureValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_TEXTURE) != 0); ui->checkBox_Caps1_TextureValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_TEXTURE) != 0);
ui->checkBox_Caps1_ComplexValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_COMPLEX) != 0); ui->checkBox_Caps1_ComplexValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_COMPLEX) != 0);
ui->checkBox_Caps1_MipmapValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_MIPMAP) != 0); ui->checkBox_Caps1_MipmapValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_MIPMAP) != 0);
ui->checkBox_Caps2_CubemapValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP) != 0); ui->checkBox_Caps2_CubemapValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP) != 0);
ui->checkBox_Caps2_CMPXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) != 0); ui->checkBox_Caps2_CMPXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) != 0);
ui->checkBox_Caps2_CMNXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) != 0); ui->checkBox_Caps2_CMNXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) != 0);
ui->checkBox_Caps2_CMPYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) != 0); ui->checkBox_Caps2_CMPYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) != 0);
ui->checkBox_Caps2_CMNYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) != 0); ui->checkBox_Caps2_CMNYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) != 0);
ui->checkBox_Caps2_CMPZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) != 0); ui->checkBox_Caps2_CMPZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) != 0);
ui->checkBox_Caps2_CMNZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) != 0); ui->checkBox_Caps2_CMNZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) != 0);
ui->checkBox_Caps2_VolumeValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_VOLUME) != 0); ui->checkBox_Caps2_VolumeValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_VOLUME) != 0);
ui->spinBox_Caps_DDSX->setValue(mDDSFile->header.caps.dDSX); ui->spinBox_Caps_DDSX->setValue(mDDSFile->header.caps.dDSX);
ui->spinBox_Caps_Res->setValue(mDDSFile->header.caps.reserved); ui->spinBox_Caps_Res->setValue(mDDSFile->header.caps.reserved);
ui->comboBox_Mipmap->clear(); ui->comboBox_Mipmap->clear();
for (auto mipmap : mDDSFile->mipmaps) { for (auto mipmap : mDDSFile->mipmaps) {
ui->comboBox_Mipmap->addItem(QString("%1x%2").arg(mipmap.width).arg(mipmap.height)); ui->comboBox_Mipmap->addItem(QString("%1x%2").arg(mipmap.width).arg(mipmap.height));
} }
connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &DDSViewer::MipmapIndexChanged); connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &DDSViewer::MipmapIndexChanged);
if (!mDDSFile->mipmaps.empty()) { if (!mDDSFile->mipmaps.empty()) {
MipmapIndexChanged(0); MipmapIndexChanged(0);
} }
} }
void DDSViewer::MipmapIndexChanged(int aMipmapIndex) { void DDSViewer::MipmapIndexChanged(int aMipmapIndex) {
if (aMipmapIndex == -1) { return; } if (aMipmapIndex == -1) { return; }
auto mipmaps = mDDSFile->mipmaps; auto mipmaps = mDDSFile->mipmaps;
auto mipmap = mipmaps[aMipmapIndex]; auto mipmap = mipmaps[aMipmapIndex];
ui->spinBox_MipmapSize->setValue(mipmap.size); ui->spinBox_MipmapSize->setValue(mipmap.size);
ui->spinBox_MipmapWidth->setValue(mipmap.width); ui->spinBox_MipmapWidth->setValue(mipmap.width);
ui->spinBox_MipmapHeight->setValue(mipmap.height); ui->spinBox_MipmapHeight->setValue(mipmap.height);
// Validate Data // Validate Data
if (mipmap.size <= 0) { if (mipmap.size <= 0) {
qDebug() << "Error: Mipmap data is empty!"; qDebug() << "Error: Mipmap data is empty!";
return; return;
} }
if (mipmap.width <= 0 || mipmap.height <= 0) { if (mipmap.width <= 0 || mipmap.height <= 0) {
qDebug() << "Error: Invalid mipmap dimensions!"; qDebug() << "Error: Invalid mipmap dimensions!";
return; return;
} }
// Ensure data size matches expected size // Ensure data size matches expected size
int bytesPerPixel = 4; // RGBA8888 int bytesPerPixel = 4; // RGBA8888
quint32 expectedSize = mipmap.width * mipmap.height * bytesPerPixel; quint32 expectedSize = mipmap.width * mipmap.height * bytesPerPixel;
if (mipmap.size < expectedSize) { if (mipmap.size < expectedSize) {
qDebug() << "Error: Mipmap data size mismatch! Expected:" << expectedSize << ", Got:" << mipmap.size; qDebug() << "Error: Mipmap data size mismatch! Expected:" << expectedSize << ", Got:" << mipmap.size;
return; return;
} }
// Create QImage // Create QImage
const unsigned char* imageData = reinterpret_cast<const unsigned char*>(mipmap.data.constData()); const unsigned char* imageData = reinterpret_cast<const unsigned char*>(mipmap.data.constData());
QImage image(reinterpret_cast<const uchar*>(imageData), QImage image(reinterpret_cast<const uchar*>(imageData),
mipmap.width, mipmap.height, mipmap.width, mipmap.height,
mipmap.width * bytesPerPixel, // Stride mipmap.width * bytesPerPixel, // Stride
QImage::Format_RGBA8888); QImage::Format_RGBA8888);
if (image.isNull()) { if (image.isNull()) {
qDebug() << "Error: QImage creation failed!"; qDebug() << "Error: QImage creation failed!";
return; return;
} }
// Convert to QPixmap // Convert to QPixmap
QPixmap pixmap = QPixmap::fromImage(image); QPixmap pixmap = QPixmap::fromImage(image);
if (pixmap.isNull()) { if (pixmap.isNull()) {
qDebug() << "Error: QPixmap conversion failed!"; qDebug() << "Error: QPixmap conversion failed!";
return; return;
} }
// Scale and display // Scale and display
pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label_Image->setPixmap(pixmap); ui->label_Image->setPixmap(pixmap);
} }

View File

@ -1,29 +1,29 @@
#ifndef DDSVIEWER_H #ifndef DDSVIEWER_H
#define DDSVIEWER_H #define DDSVIEWER_H
#include "ddsfile.h" #include "ddsfile.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class DDSViewer; class DDSViewer;
} }
class DDSViewer : public QWidget class DDSViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit DDSViewer(QWidget *parent = nullptr); explicit DDSViewer(QWidget *parent = nullptr);
~DDSViewer(); ~DDSViewer();
void SetDDSFile(std::shared_ptr<DDSFile> aDDSFile); void SetDDSFile(const DDSFile *aDDSFile);
private slots: private slots:
void MipmapIndexChanged(int aMipmapIndex); void MipmapIndexChanged(int aMipmapIndex);
private: private:
Ui::DDSViewer *ui; Ui::DDSViewer *ui;
std::shared_ptr<DDSFile> mDDSFile; const DDSFile* mDDSFile;
}; };
#endif // DDSVIEWER_H #endif // DDSVIEWER_H

File diff suppressed because it is too large Load Diff

View File

@ -1,27 +1,26 @@
#include "fastfileviewer.h" #include "fastfileviewer.h"
#include "asset_structs.h" #include "ui_fastfileviewer.h"
#include "ui_fastfileviewer.h"
FastFileViewer::FastFileViewer(QWidget *parent)
FastFileViewer::FastFileViewer(QWidget *parent) : QWidget(parent)
: QWidget(parent) , ui(new Ui::FFViewer)
, ui(new Ui::FFViewer) , mFastFile(nullptr)
, mFastFile(nullptr) {
{ ui->setupUi(this);
ui->setupUi(this); }
}
FastFileViewer::~FastFileViewer()
FastFileViewer::~FastFileViewer() {
{ delete ui;
delete ui; }
}
void FastFileViewer::SetFastFile(const FastFile* aFastFile) {
void FastFileViewer::SetFastFile(std::shared_ptr<FastFile> aFastFile) { mFastFile = aFastFile;
mFastFile.swap(aFastFile);
ui->label_Title->setText(mFastFile->GetStem());
ui->label_Title->setText(mFastFile->GetStem()); ui->comboBox_Company->setCurrentIndex(mFastFile->GetCompany());
ui->comboBox_Company->setCurrentIndex(mFastFile->GetCompany()); ui->comboBox_FileType->setCurrentIndex(mFastFile->GetType());
ui->comboBox_FileType->setCurrentIndex(mFastFile->GetType()); ui->checkBox_Signed->setChecked(mFastFile->GetSignage() == SIGNAGE_SIGNED);
ui->checkBox_Signed->setChecked(mFastFile->GetSignage() == SIGNAGE_SIGNED); ui->lineEdit_Magic->setText(mFastFile->GetMagic());
ui->lineEdit_Magic->setText(mFastFile->GetMagic()); ui->spinBox_Version->setValue(mFastFile->GetVersion());
ui->spinBox_Version->setValue(mFastFile->GetVersion()); }
}

View File

@ -1,26 +1,25 @@
#ifndef FASTFILEVIEWER_H #ifndef FASTFILEVIEWER_H
#define FASTFILEVIEWER_H #define FASTFILEVIEWER_H
#include "asset_structs.h" #include "fastfile.h"
#include "fastfile.h" #include <QWidget>
#include <QWidget>
namespace Ui {
namespace Ui { class FFViewer;
class FFViewer; }
}
class FastFileViewer : public QWidget
class FastFileViewer : public QWidget {
{ Q_OBJECT
Q_OBJECT
public:
public: explicit FastFileViewer(QWidget *parent = nullptr);
explicit FastFileViewer(QWidget *parent = nullptr); ~FastFileViewer();
~FastFileViewer();
void SetFastFile(const FastFile *aFastFile);
void SetFastFile(std::shared_ptr<FastFile> aFastFile); private:
private: Ui::FFViewer *ui;
Ui::FFViewer *ui; const FastFile* mFastFile;
std::shared_ptr<FastFile> mFastFile; };
};
#endif // FASTFILEVIEWER_H
#endif // FASTFILEVIEWER_H

View File

@ -1,197 +1,197 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>FFViewer</class> <class>FFViewer</class>
<widget class="QWidget" name="FFViewer"> <widget class="QWidget" name="FFViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>428</width> <width>428</width>
<height>459</height> <height>459</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>FastFile 0</string> <string>FastFile 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>400</width> <width>400</width>
<height>400</height> <height>400</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Header</string> <string>Header</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Company:</string> <string>Company:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QComboBox" name="comboBox_Company"> <widget class="QComboBox" name="comboBox_Company">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<item> <item>
<property name="text"> <property name="text">
<string>None</string> <string>None</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Infinity Ward</string> <string>Infinity Ward</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Treyarch</string> <string>Treyarch</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Sledgehammer</string> <string>Sledgehammer</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Neversoft</string> <string>Neversoft</string>
</property> </property>
</item> </item>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>File Type:</string> <string>File Type:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QComboBox" name="comboBox_FileType"> <widget class="QComboBox" name="comboBox_FileType">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<item> <item>
<property name="text"> <property name="text">
<string>None</string> <string>None</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>FastFile</string> <string>FastFile</string>
</property> </property>
</item> </item>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Signed:</string> <string>Signed:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QCheckBox" name="checkBox_Signed"> <widget class="QCheckBox" name="checkBox_Signed">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="text"> <property name="text">
<string>Is signed</string> <string>Is signed</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Magic:</string> <string>Magic:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_Magic"/> <widget class="QLineEdit" name="lineEdit_Magic"/>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>Version:</string> <string>Version:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QSpinBox" name="spinBox_Version"> <widget class="QSpinBox" name="spinBox_Version">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>10000</number> <number>10000</number>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="horizontalSpacer_3"> <spacer name="horizontalSpacer_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_5"> <spacer name="verticalSpacer_5">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>1</height> <height>1</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,28 +1,28 @@
#include "imagewidget.h" #include "imagewidget.h"
#include "ui_imagewidget.h" #include "ui_imagewidget.h"
ImageWidget::ImageWidget(QWidget *parent) ImageWidget::ImageWidget(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::ImageWidget) , ui(new Ui::ImageWidget)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
ImageWidget::~ImageWidget() ImageWidget::~ImageWidget()
{ {
delete ui; delete ui;
} }
void ImageWidget::SetImage(std::shared_ptr<Image> aImage) void ImageWidget::SetImage(std::shared_ptr<QImage> aImage)
{ {
mImage = aImage; mImage = aImage;
ui->lineEdit_Name->setText(aImage->name); //ui->lineEdit_Name->setText(aImage->name);
ui->lineEdit_Role->setText(aImage->materialName); //ui->lineEdit_Role->setText(aImage->materialName);
ui->comboBox_Compression->setCurrentIndex(aImage->compression); //ui->comboBox_Compression->setCurrentIndex(aImage->compression);
} }
std::shared_ptr<Image> ImageWidget::GetImage() std::shared_ptr<QImage> ImageWidget::GetImage()
{ {
return mImage; return mImage;
} }

View File

@ -1,32 +1,31 @@
#ifndef IMAGEWIDGET_H #ifndef IMAGEWIDGET_H
#define IMAGEWIDGET_H #define IMAGEWIDGET_H
#include "enums.h" #include "enums.h"
#include "dds_structs.h" #include "dds_structs.h"
#include "d3dbsp_structs.h" #include "d3dbsp_structs.h"
#include "asset_structs.h" #include "ipak_structs.h"
#include "ipak_structs.h"
#include <QWidget>
#include <QWidget>
namespace Ui {
namespace Ui { class ImageWidget;
class ImageWidget; }
}
class ImageWidget : public QWidget
class ImageWidget : public QWidget {
{ Q_OBJECT
Q_OBJECT
public:
public: explicit ImageWidget(QWidget *parent = nullptr);
explicit ImageWidget(QWidget *parent = nullptr); ~ImageWidget();
~ImageWidget();
void SetImage(std::shared_ptr<QImage> aImage);
void SetImage(std::shared_ptr<Image> aImage); std::shared_ptr<QImage> GetImage();
std::shared_ptr<Image> GetImage();
private:
private: std::shared_ptr<QImage> mImage;
std::shared_ptr<Image> mImage; Ui::ImageWidget *ui;
Ui::ImageWidget *ui; };
};
#endif // IMAGEWIDGET_H
#endif // IMAGEWIDGET_H

View File

@ -1,144 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>ImageWidget</class> <class>ImageWidget</class>
<widget class="QWidget" name="ImageWidget"> <widget class="QWidget" name="ImageWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>589</width> <width>589</width>
<height>422</height> <height>422</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_4"> <layout class="QHBoxLayout" name="horizontalLayout_4">
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Image Role:</string> <string>Image Role:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="lineEdit_Role"/> <widget class="QLineEdit" name="lineEdit_Role"/>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Name:</string> <string>Name:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="lineEdit_Name"/> <widget class="QLineEdit" name="lineEdit_Name"/>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Compression:</string> <string>Compression:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QComboBox" name="comboBox_Compression"> <widget class="QComboBox" name="comboBox_Compression">
<item> <item>
<property name="text"> <property name="text">
<string>None</string> <string>None</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>DXT1</string> <string>DXT1</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>DXT3</string> <string>DXT3</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>DXT5</string> <string>DXT5</string>
</property> </property>
</item> </item>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="Line" name="line"> <widget class="Line" name="line">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QLabel" name="label_Preview"> <widget class="QLabel" name="label_Preview">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>250</width> <width>250</width>
<height>250</height> <height>250</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>250</width> <width>250</width>
<height>250</height> <height>250</height>
</size> </size>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_2"> <spacer name="verticalSpacer_2">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,98 +1,98 @@
#include "iwiviewer.h" #include "iwiviewer.h"
#include "enums.h" #include "enums.h"
#include "ui_iwiviewer.h" #include "ui_iwiviewer.h"
IWIViewer::IWIViewer(QWidget *parent) IWIViewer::IWIViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::IWIViewer) , ui(new Ui::IWIViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
IWIViewer::~IWIViewer() IWIViewer::~IWIViewer()
{ {
delete ui; delete ui;
} }
void IWIViewer::SetIWIFile(std::shared_ptr<IWIFile> aIWIFile) { void IWIViewer::SetIWIFile(const IWIFile* aIWIFile) {
mIWIFile.swap(aIWIFile); mIWIFile = aIWIFile;
ui->label_Title->setText(mIWIFile->fileStem + ".iwi"); ui->label_Title->setText(mIWIFile->fileStem + ".iwi");
// If youre using Qt and want a QString: // If youre using Qt and want a QString:
QString magicStr = QString::fromLatin1(mIWIFile->header.Magic, 3); QString magicStr = QString::fromLatin1(mIWIFile->header.Magic, 3);
ui->lineEdit_Magic->setText(magicStr); ui->lineEdit_Magic->setText(magicStr);
ui->spinBox_Version->setValue(mIWIFile->header.Version); ui->spinBox_Version->setValue(mIWIFile->header.Version);
ui->spinBox_Depth->setValue(mIWIFile->info.Depth); ui->spinBox_Depth->setValue(mIWIFile->info.Depth);
QString formatStr = ""; QString formatStr = "";
switch (mIWIFile->info.Format) { switch (mIWIFile->info.Format) {
case IWI_FORMAT_ARGB32: case IWI_FORMAT_ARGB32:
formatStr = "ARGB32"; formatStr = "ARGB32";
break; break;
case IWI_FORMAT_RGB24: case IWI_FORMAT_RGB24:
formatStr = "RGB24"; formatStr = "RGB24";
break; break;
case IWI_FORMAT_GA16: case IWI_FORMAT_GA16:
formatStr = "GA16"; formatStr = "GA16";
break; break;
case IWI_FORMAT_A8: case IWI_FORMAT_A8:
formatStr = "A8"; formatStr = "A8";
break; break;
case IWI_FORMAT_DXT1: case IWI_FORMAT_DXT1:
formatStr = "DXT1"; formatStr = "DXT1";
break; break;
case IWI_FORMAT_DXT3: case IWI_FORMAT_DXT3:
formatStr = "DXT3"; formatStr = "DXT3";
break; break;
case IWI_FORMAT_DXT5: case IWI_FORMAT_DXT5:
formatStr = "DXT5"; formatStr = "DXT5";
break; break;
} }
ui->lineEdit_Format->setText(formatStr); ui->lineEdit_Format->setText(formatStr);
ui->spinBox_Height->setValue(mIWIFile->info.Height); ui->spinBox_Height->setValue(mIWIFile->info.Height);
ui->spinBox_Width->setValue(mIWIFile->info.Width); ui->spinBox_Width->setValue(mIWIFile->info.Width);
ui->spinBox_Usage->setValue(mIWIFile->info.Usage); ui->spinBox_Usage->setValue(mIWIFile->info.Usage);
ui->comboBox_Mipmap->clear(); ui->comboBox_Mipmap->clear();
for (auto mipmap : mIWIFile->mipmaps) { for (auto mipmap : mIWIFile->mipmaps) {
ui->comboBox_Mipmap->addItem(QString::number(mipmap.offset)); ui->comboBox_Mipmap->addItem(QString::number(mipmap.offset));
} }
connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &IWIViewer::MipmapIndexChanged); connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &IWIViewer::MipmapIndexChanged);
if (!mIWIFile->mipmaps.empty()) { if (!mIWIFile->mipmaps.empty()) {
MipmapIndexChanged(0); MipmapIndexChanged(0);
} }
} }
void IWIViewer::MipmapIndexChanged(int aMipmapIndex) { void IWIViewer::MipmapIndexChanged(int aMipmapIndex) {
auto mipmaps = mIWIFile->mipmaps; auto mipmaps = mIWIFile->mipmaps;
if (aMipmapIndex == -1) { return; } if (aMipmapIndex == -1) { return; }
auto mipmap = mipmaps[aMipmapIndex]; auto mipmap = mipmaps[aMipmapIndex];
ui->spinBox_MipmapSize->setValue(mipmap.size); ui->spinBox_MipmapSize->setValue(mipmap.size);
ui->spinBox_MipmapOffset->setValue(mipmap.offset); ui->spinBox_MipmapOffset->setValue(mipmap.offset);
const unsigned char* imageData = reinterpret_cast<const unsigned char*>(mipmap.data.constData()); const unsigned char* imageData = reinterpret_cast<const unsigned char*>(mipmap.data.constData());
QImage image(reinterpret_cast<const uchar*>(imageData), QImage image(reinterpret_cast<const uchar*>(imageData),
mIWIFile->info.Width, mIWIFile->info.Height, mIWIFile->info.Width, mIWIFile->info.Height,
QImage::Format_RGBA8888); QImage::Format_RGBA8888);
if (image.isNull()) { if (image.isNull()) {
qDebug() << "Error: QImage creation failed!"; qDebug() << "Error: QImage creation failed!";
return; return;
} }
// Convert to QPixmap // Convert to QPixmap
QPixmap pixmap = QPixmap::fromImage(image); QPixmap pixmap = QPixmap::fromImage(image);
if (pixmap.isNull()) { if (pixmap.isNull()) {
qDebug() << "Error: QPixmap conversion failed!"; qDebug() << "Error: QPixmap conversion failed!";
return; return;
} }
// Scale and display // Scale and display
pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label_Image->setPixmap(pixmap); ui->label_Image->setPixmap(pixmap);
} }

View File

@ -1,27 +1,27 @@
#ifndef IWIVIEWER_H #ifndef IWIVIEWER_H
#define IWIVIEWER_H #define IWIVIEWER_H
#include "iwifile.h" #include "iwifile.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class IWIViewer; class IWIViewer;
} }
class IWIViewer : public QWidget class IWIViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit IWIViewer(QWidget *parent = nullptr); explicit IWIViewer(QWidget *parent = nullptr);
~IWIViewer(); ~IWIViewer();
void MipmapIndexChanged(int aMipmapIndex); void MipmapIndexChanged(int aMipmapIndex);
void SetIWIFile(std::shared_ptr<IWIFile> aIWIFile); void SetIWIFile(const IWIFile *aIWIFile);
private: private:
Ui::IWIViewer *ui; Ui::IWIViewer *ui;
std::shared_ptr<IWIFile> mIWIFile; const IWIFile* mIWIFile;
}; };
#endif // IWIVIEWER_H #endif // IWIVIEWER_H

File diff suppressed because it is too large Load Diff

View File

@ -1,62 +1,58 @@
#include "localstringviewer.h" #include "localstringviewer.h"
#include "ui_localstringviewer.h" #include "ui_localstringviewer.h"
LocalStringViewer::LocalStringViewer(QWidget *parent) LocalStringViewer::LocalStringViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::LocalStringViewer), , ui(new Ui::LocalStringViewer),
mVersion(), mVersion(),
mConfigPath(), mConfigPath(),
mFileNotes() { mFileNotes() {
ui->setupUi(this); ui->setupUi(this);
ui->tableWidget_Strings->setColumnCount(2); ui->tableWidget_Strings->setColumnCount(2);
ui->tableWidget_Strings->setRowCount(0); ui->tableWidget_Strings->setRowCount(0);
ui->tableWidget_Strings->setColumnWidth(0, 200); ui->tableWidget_Strings->setColumnWidth(0, 200);
ui->tableWidget_Strings->horizontalHeader()->setStretchLastSection(true); ui->tableWidget_Strings->horizontalHeader()->setStretchLastSection(true);
} }
LocalStringViewer::~LocalStringViewer() { LocalStringViewer::~LocalStringViewer() {
delete ui; delete ui;
} }
void LocalStringViewer::SetVersion(quint32 aVersion) { void LocalStringViewer::SetVersion(quint32 aVersion) {
mVersion = aVersion; mVersion = aVersion;
ui->spinBox_Version->setValue(mVersion); ui->spinBox_Version->setValue(mVersion);
} }
void LocalStringViewer::SetConfigPath(const QString aConfigPath) { void LocalStringViewer::SetConfigPath(const QString aConfigPath) {
mConfigPath = aConfigPath; mConfigPath = aConfigPath;
ui->lineEdit_Config->setText(mConfigPath); ui->lineEdit_Config->setText(mConfigPath);
} }
void LocalStringViewer::SetFileNotes(const QString aFileNotes) { void LocalStringViewer::SetFileNotes(const QString aFileNotes) {
mFileNotes = aFileNotes; mFileNotes = aFileNotes;
ui->plainTextEdit_FileNotes->setPlainText(mFileNotes); ui->plainTextEdit_FileNotes->setPlainText(mFileNotes);
} }
void LocalStringViewer::AddLocalString(LocalString aLocalString) { void LocalStringViewer::AddLocalString(XLocalizeEntry aLocalString) {
mLocalStrings.append(aLocalString); mLocalStrings.append(aLocalString);
ui->tableWidget_Strings->setRowCount(mLocalStrings.size());
ui->tableWidget_Strings->setRowCount(mLocalStrings.size()); ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(mLocalStrings.size()));
QTableWidgetItem *aliasItem = new QTableWidgetItem(aLocalString.GetValue()->GetString());
ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(mLocalStrings.size())); QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.GetName()->GetString());
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 0, aliasItem);
QTableWidgetItem *aliasItem = new QTableWidgetItem(aLocalString.alias); ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 1, stringItem);
QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.string); }
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 0, aliasItem); void LocalStringViewer::SetZoneFile(const ZoneFile* aZoneFile) {
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 1, stringItem); mLocalStrings.clear();
} ui->tableWidget_Strings->clear();
void LocalStringViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) { ui->label_Title->setText(aZoneFile->GetStem().section('.', 0, 0) + ".str");
mLocalStrings.clear(); // for (const LocalString &localStr : aZoneFile->GetAssetMap().localStrings) {
ui->tableWidget_Strings->clear(); // AddLocalString(localStr);
// }
ui->label_Title->setText(aZoneFile->GetStem().section('.', 0, 0) + ".str"); }
for (const LocalString &localStr : aZoneFile->GetAssetMap().localStrings) {
AddLocalString(localStr);
}
}

View File

@ -1,34 +1,34 @@
#ifndef LOCALSTRINGVIEWER_H #ifndef LOCALSTRINGVIEWER_H
#define LOCALSTRINGVIEWER_H #define LOCALSTRINGVIEWER_H
#include "asset_structs.h" #include "xlocalizeentry.h"
#include "zonefile.h" #include "zonefile.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class LocalStringViewer; class LocalStringViewer;
} }
class LocalStringViewer : public QWidget class LocalStringViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LocalStringViewer(QWidget *parent = nullptr); explicit LocalStringViewer(QWidget *parent = nullptr);
~LocalStringViewer(); ~LocalStringViewer();
void SetVersion(quint32 aVersion); void SetVersion(quint32 aVersion);
void SetConfigPath(const QString aConfigPath); void SetConfigPath(const QString aConfigPath);
void SetFileNotes(const QString aFileNotes); void SetFileNotes(const QString aFileNotes);
void AddLocalString(LocalString aLocalString); void AddLocalString(XLocalizeEntry aLocalString);
void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile); void SetZoneFile(const ZoneFile *aZoneFile);
private: private:
Ui::LocalStringViewer *ui; Ui::LocalStringViewer *ui;
quint32 mVersion; quint32 mVersion;
QString mConfigPath; QString mConfigPath;
QString mFileNotes; QString mFileNotes;
QVector<LocalString> mLocalStrings; QVector<XLocalizeEntry> mLocalStrings;
}; };
#endif // LOCALSTRINGVIEWER_H #endif // LOCALSTRINGVIEWER_H

View File

@ -1,194 +1,194 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>LocalStringViewer</class> <class>LocalStringViewer</class>
<widget class="QWidget" name="LocalStringViewer"> <widget class="QWidget" name="LocalStringViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>841</width> <width>841</width>
<height>457</height> <height>457</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>841</width> <width>841</width>
<height>457</height> <height>457</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>LocalString File 0</string> <string>LocalString File 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>398</height> <height>398</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Header</string> <string>Header</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>File Notes:</string> <string>File Notes:</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set> <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>Version:</string> <string>Version:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_Config"> <widget class="QLineEdit" name="lineEdit_Config">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="text"> <property name="text">
<string>C:\cod5\cod\cod5\bin\StringEd.cfg</string> <string>C:\cod5\cod\cod5\bin\StringEd.cfg</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Config:</string> <string>Config:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="0" column="2">
<widget class="QToolButton" name="toolButton"> <widget class="QToolButton" name="toolButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1" colspan="2"> <item row="2" column="1" colspan="2">
<widget class="QSpinBox" name="spinBox_Version"> <widget class="QSpinBox" name="spinBox_Version">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>10000</number> <number>10000</number>
</property> </property>
<property name="value"> <property name="value">
<number>1</number> <number>1</number>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1" colspan="2"> <item row="3" column="1" colspan="2">
<widget class="QPlainTextEdit" name="plainTextEdit_FileNotes"> <widget class="QPlainTextEdit" name="plainTextEdit_FileNotes">
<property name="placeholderText"> <property name="placeholderText">
<string>Files notes...</string> <string>Files notes...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0" colspan="3"> <item row="4" column="0" colspan="3">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_LocalStrViewer"> <widget class="QGroupBox" name="groupBox_LocalStrViewer">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>400</width> <width>400</width>
<height>400</height> <height>400</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Entries</string> <string>Entries</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTableWidget" name="tableWidget_Strings"> <widget class="QTableWidget" name="tableWidget_Strings">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_5"> <spacer name="verticalSpacer_5">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,11 +1,11 @@
#include "mainwindow.h" #include "mainwindow.h"
#include <QApplication> #include <QApplication>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication a(argc, argv);
MainWindow w; MainWindow w;
w.show(); w.show();
return a.exec(); return a.exec();
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,79 +1,78 @@
#ifndef MAINWINDOW_H #ifndef MAINWINDOW_H
#define MAINWINDOW_H #define MAINWINDOW_H
#include "d3dbsp_structs.h" #include "d3dbsp_structs.h"
#include "asset_structs.h" #include "xtreewidget.h"
#include "xtreewidget.h"
#include <QMainWindow>
#include <QMainWindow> #include <QFileDialog>
#include <QFileDialog> #include <QStandardPaths>
#include <QStandardPaths> #include <QMessageBox>
#include <QMessageBox> #include <QDebug>
#include <QDebug> #include <QTableWidgetItem>
#include <QTableWidgetItem> #include <QTreeWidgetItem>
#include <QTreeWidgetItem> #include <QDockWidget>
#include <QDockWidget> #include <QPlainTextEdit>
#include <QPlainTextEdit> #include <QMimeData>
#include <QMimeData> #include <QProgressBar>
#include <QProgressBar> #include <windows.h>
#include <windows.h>
QT_BEGIN_NAMESPACE
QT_BEGIN_NAMESPACE namespace Ui {
namespace Ui { class MainWindow;
class MainWindow; }
} QT_END_NAMESPACE
QT_END_NAMESPACE
class MainWindow : public QMainWindow
class MainWindow : public QMainWindow {
{ Q_OBJECT
Q_OBJECT
public:
public: MainWindow(QWidget *parent = nullptr);
MainWindow(QWidget *parent = nullptr); ~MainWindow();
~MainWindow(); void Reset();
void Reset();
private slots:
private slots: bool OpenFastFile(const QString aFastFilePath);
bool OpenFastFile(const QString aFastFilePath); bool OpenFastFile();
bool OpenFastFile();
bool OpenZoneFile(const QString aZoneFilePath, bool fromFF = false);
bool OpenZoneFile(const QString aZoneFilePath, bool fromFF = false); bool OpenZoneFile();
bool OpenZoneFile();
int LoadFile_D3DBSP(const QString aFilePath);
int LoadFile_D3DBSP(const QString aFilePath); int LoadFile_IPAK(const QString aFilePath);
int LoadFile_IPAK(const QString aFilePath); int LoadFile_XSUB(const QString aFilePath);
int LoadFile_XSUB(const QString aFilePath); int LoadFile_IWI(const QString aFilePath);
int LoadFile_IWI(const QString aFilePath); int LoadFile_DDS(const QString aFilePath);
int LoadFile_DDS(const QString aFilePath); int LoadFile_DDSFiles(const QStringList aFilePaths);
int LoadFile_DDSFiles(const QStringList aFilePaths);
void HandleLogEntry(const QString &entry);
void HandleLogEntry(const QString &entry); void HandleStatusUpdate(const QString &message, int timeout);
void HandleStatusUpdate(const QString &message, int timeout); void HandleProgressUpdate(const QString &message, int progress, int max);
void HandleProgressUpdate(const QString &message, int progress, int max);
protected:
protected: void dragEnterEvent(QDragEnterEvent *event) override;
void dragEnterEvent(QDragEnterEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override;
void dragMoveEvent(QDragMoveEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override;
void dragLeaveEvent(QDragLeaveEvent *event) override; void dropEvent(QDropEvent *event) override;
void dropEvent(QDropEvent *event) override;
private:
private: Ui::MainWindow *ui;
Ui::MainWindow *ui; QMap<QString, int> mTypeMap;
QMap<QString, int> mTypeMap; QStringList mTypeOrder;
QStringList mTypeOrder; quint32 mTagCount;
quint32 mTagCount; quint32 mRecordCount;
quint32 mRecordCount; QMap<QString, QString> mRawFileMap;
QMap<QString, QString> mRawFileMap; //QMap<QString, Image> mImageMap;
QMap<QString, Image> mImageMap; QMap<QString, QTreeWidgetItem*> mTreeMap;
QMap<QString, QTreeWidgetItem*> mTreeMap; QMap<QString, QVector<QPair<QString, QString>>> mStrTableMap;
QMap<QString, QVector<QPair<QString, QString>>> mStrTableMap; XTreeWidget *mTreeWidget;
XTreeWidget *mTreeWidget; QPlainTextEdit *mLogWidget;
QPlainTextEdit *mLogWidget; QProgressBar *mProgressBar;
QProgressBar *mProgressBar;
quint32 mBSPVersion;
quint32 mBSPVersion; quint32 mDiskLumpCount;
quint32 mDiskLumpCount; QVector<quint32> mDiskLumpOrder;
QVector<quint32> mDiskLumpOrder; QMap<quint32, Lump> mLumps;
QMap<quint32, Lump> mLumps; };
}; #endif // MAINWINDOW_H
#endif // MAINWINDOW_H

View File

@ -1,361 +1,379 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>MainWindow</class> <class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow"> <widget class="QMainWindow" name="MainWindow">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1579</width> <width>1579</width>
<height>857</height> <height>857</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>550</width> <width>550</width>
<height>300</height> <height>300</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>XPlor</string> <string>XPlor</string>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true">QMainWindow { <string notr="true">QMainWindow {
}</string> }</string>
</property> </property>
<widget class="QWidget" name="centralwidget"> <widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>-1</number> <number>-1</number>
</property> </property>
<property name="tabsClosable"> <property name="tabsClosable">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="movable"> <property name="movable">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1579</width> <width>1579</width>
<height>21</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="MenuDef">
<property name="title"> <property name="title">
<string>File</string> <string>File</string>
</property> </property>
<widget class="QMenu" name="menuRecent"> <widget class="QMenu" name="menuRecent">
<property name="title"> <property name="title">
<string>Recent...</string> <string>Recent...</string>
</property> </property>
</widget> </widget>
<widget class="QMenu" name="menuImport"> <widget class="QMenu" name="menuImport">
<property name="title"> <property name="title">
<string>Import...</string> <string>Import...</string>
</property> </property>
</widget> </widget>
<addaction name="actionNew_File_2"/> <addaction name="actionNew_File_2"/>
<addaction name="actionNew_Fast_File"/> <addaction name="actionNew_Fast_File"/>
<addaction name="actionNew_Zone_File"/> <addaction name="actionNew_Zone_File"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionOpen_Fast_File"/> <addaction name="actionOpen_Fast_File"/>
<addaction name="actionOpen_Zone_File"/> <addaction name="actionOpen_Zone_File"/>
<addaction name="actionOpen_Folder"/> <addaction name="actionOpen_Folder"/>
<addaction name="menuImport"/> <addaction name="menuImport"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionSave"/> <addaction name="actionSave"/>
<addaction name="actionSave_As"/> <addaction name="actionSave_As"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="menuRecent"/> <addaction name="menuRecent"/>
</widget> </widget>
<widget class="QMenu" name="menuEdit"> <widget class="QMenu" name="menuEdit">
<property name="title"> <property name="title">
<string>Edit</string> <string>Edit</string>
</property> </property>
<widget class="QMenu" name="menuUndo_History"> <widget class="QMenu" name="menuUndo_History">
<property name="title"> <property name="title">
<string>Undo History...</string> <string>Undo History...</string>
</property> </property>
</widget> </widget>
<widget class="QMenu" name="menuRedo_History"> <widget class="QMenu" name="menuRedo_History">
<property name="title"> <property name="title">
<string>Redo History...</string> <string>Redo History...</string>
</property> </property>
</widget> </widget>
<addaction name="actionUndo"/> <addaction name="actionUndo"/>
<addaction name="actionRedo"/> <addaction name="actionRedo"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionCut"/> <addaction name="actionCut"/>
<addaction name="actionCopy"/> <addaction name="actionCopy"/>
<addaction name="actionPaste"/> <addaction name="actionPaste"/>
<addaction name="actionRename"/> <addaction name="actionRename"/>
<addaction name="actionDelete"/> <addaction name="actionDelete"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionFind_2"/> <addaction name="actionFind_2"/>
<addaction name="actionEdit_Value"/> <addaction name="actionEdit_Value"/>
<addaction name="actionEdit_as_Hex"/> <addaction name="actionEdit_as_Hex"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="menuUndo_History"/> <addaction name="menuUndo_History"/>
<addaction name="menuRedo_History"/> <addaction name="menuRedo_History"/>
<addaction name="actionClear_Undo_History"/> <addaction name="actionClear_Undo_History"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionPreferences"/> <addaction name="actionPreferences"/>
</widget> </widget>
<widget class="QMenu" name="menuHelp"> <widget class="QMenu" name="menuHelp">
<property name="title"> <property name="title">
<string>Help</string> <string>Help</string>
</property> </property>
<addaction name="actionAbout"/> <addaction name="actionAbout"/>
<addaction name="actionCheck_for_Updates"/> <addaction name="actionCheck_for_Updates"/>
</widget> <addaction name="actionReport_Issue"/>
<addaction name="menuFile"/> </widget>
<addaction name="menuEdit"/> <widget class="QMenu" name="menuTools">
<addaction name="menuHelp"/> <property name="title">
</widget> <string>Tools</string>
<widget class="QToolBar" name="toolBar"> </property>
<property name="windowTitle"> <addaction name="actionRun_Tests"/>
<string>toolBar</string> </widget>
</property> <addaction name="MenuDef"/>
<attribute name="toolBarArea"> <addaction name="menuEdit"/>
<enum>TopToolBarArea</enum> <addaction name="menuTools"/>
</attribute> <addaction name="menuHelp"/>
<attribute name="toolBarBreak"> </widget>
<bool>false</bool> <widget class="QToolBar" name="toolBar">
</attribute> <property name="windowTitle">
</widget> <string>toolBar</string>
<widget class="QStatusBar" name="statusBar"/> </property>
<action name="actionNew_File_2"> <attribute name="toolBarArea">
<property name="icon"> <enum>TopToolBarArea</enum>
<iconset resource="../data/data.qrc"> </attribute>
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset> <attribute name="toolBarBreak">
</property> <bool>false</bool>
<property name="text"> </attribute>
<string>New</string> </widget>
</property> <widget class="QStatusBar" name="statusBar"/>
</action> <action name="actionNew_File_2">
<action name="actionNew_Fast_File"> <property name="icon">
<property name="icon"> <iconset resource="../data/data.qrc">
<iconset resource="../data/data.qrc"> <normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset> </property>
</property> <property name="text">
<property name="text"> <string>New</string>
<string>New Fast File</string> </property>
</property> </action>
</action> <action name="actionNew_Fast_File">
<action name="actionNew_Zone_File"> <property name="icon">
<property name="icon"> <iconset resource="../data/data.qrc">
<iconset resource="../data/data.qrc"> <normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset> </property>
</property> <property name="text">
<property name="text"> <string>New Fast File</string>
<string>New Zone File</string> </property>
</property> </action>
</action> <action name="actionNew_Zone_File">
<action name="actionOpen_Fast_File"> <property name="icon">
<property name="icon"> <iconset resource="../data/data.qrc">
<iconset resource="../data/data.qrc"> <normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset> </property>
</property> <property name="text">
<property name="text"> <string>New Zone File</string>
<string>Open Fast File</string> </property>
</property> </action>
</action> <action name="actionOpen_Fast_File">
<action name="actionOpen_Zone_File"> <property name="icon">
<property name="icon"> <iconset resource="../data/data.qrc">
<iconset resource="../data/data.qrc"> <normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset> </property>
</property> <property name="text">
<property name="text"> <string>Open Fast File</string>
<string>Open Zone File</string> </property>
</property> </action>
</action> <action name="actionOpen_Zone_File">
<action name="actionOpen_Folder"> <property name="icon">
<property name="icon"> <iconset resource="../data/data.qrc">
<iconset resource="../data/data.qrc"> <normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset> </property>
</property> <property name="text">
<property name="text"> <string>Open Zone File</string>
<string>Open Folder</string> </property>
</property> </action>
</action> <action name="actionOpen_Folder">
<action name="actionSave"> <property name="icon">
<property name="icon"> <iconset resource="../data/data.qrc">
<iconset resource="../data/data.qrc"> <normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
<normaloff>:/icons/icons/Icon_Save.png</normaloff>:/icons/icons/Icon_Save.png</iconset> </property>
</property> <property name="text">
<property name="text"> <string>Open Folder</string>
<string>Save</string> </property>
</property> </action>
</action> <action name="actionSave">
<action name="actionSave_As"> <property name="icon">
<property name="text"> <iconset resource="../data/data.qrc">
<string>Save As</string> <normaloff>:/icons/icons/Icon_Save.png</normaloff>:/icons/icons/Icon_Save.png</iconset>
</property> </property>
</action> <property name="text">
<action name="actione"> <string>Save</string>
<property name="text"> </property>
<string>e</string> </action>
</property> <action name="actionSave_As">
</action> <property name="text">
<action name="actionFile"> <string>Save As</string>
<property name="text"> </property>
<string>File</string> </action>
</property> <action name="actione">
</action> <property name="text">
<action name="actionFolder"> <string>e</string>
<property name="text"> </property>
<string>Folder</string> </action>
</property> <action name="actionFile">
</action> <property name="text">
<action name="actionNew_File"> <string>File</string>
<property name="text"> </property>
<string>New File</string> </action>
</property> <action name="actionFolder">
</action> <property name="text">
<action name="actionNew_Fast_File_2"> <string>Folder</string>
<property name="text"> </property>
<string>New Fast File</string> </action>
</property> <action name="actionNew_File">
</action> <property name="text">
<action name="actionNew_Zone_File_2"> <string>New File</string>
<property name="text"> </property>
<string>New Zone File</string> </action>
</property> <action name="actionNew_Fast_File_2">
</action> <property name="text">
<action name="actionFrom_Clipboard"> <string>New Fast File</string>
<property name="text"> </property>
<string>From Clipboard</string> </action>
</property> <action name="actionNew_Zone_File_2">
</action> <property name="text">
<action name="actionMaterial"> <string>New Zone File</string>
<property name="text"> </property>
<string>Material</string> </action>
</property> <action name="actionFrom_Clipboard">
</action> <property name="text">
<action name="actionSound"> <string>From Clipboard</string>
<property name="text"> </property>
<string>Sound</string> </action>
</property> <action name="actionMaterial">
</action> <property name="text">
<action name="actionUndo"> <string>Material</string>
<property name="text"> </property>
<string>Undo</string> </action>
</property> <action name="actionSound">
</action> <property name="text">
<action name="actionRedo"> <string>Sound</string>
<property name="text"> </property>
<string>Redo</string> </action>
</property> <action name="actionUndo">
</action> <property name="text">
<action name="actionCut"> <string>Undo</string>
<property name="icon"> </property>
<iconset resource="../data/data.qrc"> </action>
<normaloff>:/icons/icons/Icon_Cut.png</normaloff>:/icons/icons/Icon_Cut.png</iconset> <action name="actionRedo">
</property> <property name="text">
<property name="text"> <string>Redo</string>
<string>Cut</string> </property>
</property> </action>
</action> <action name="actionCut">
<action name="actionCopy"> <property name="icon">
<property name="icon"> <iconset resource="../data/data.qrc">
<iconset resource="../data/data.qrc"> <normaloff>:/icons/icons/Icon_Cut.png</normaloff>:/icons/icons/Icon_Cut.png</iconset>
<normaloff>:/icons/icons/Icon_Copy.png</normaloff>:/icons/icons/Icon_Copy.png</iconset> </property>
</property> <property name="text">
<property name="text"> <string>Cut</string>
<string>Copy</string> </property>
</property> </action>
</action> <action name="actionCopy">
<action name="actionPaste"> <property name="icon">
<property name="icon"> <iconset resource="../data/data.qrc">
<iconset resource="../data/data.qrc"> <normaloff>:/icons/icons/Icon_Copy.png</normaloff>:/icons/icons/Icon_Copy.png</iconset>
<normaloff>:/icons/icons/Icon_Paste.png</normaloff>:/icons/icons/Icon_Paste.png</iconset> </property>
</property> <property name="text">
<property name="text"> <string>Copy</string>
<string>Paste</string> </property>
</property> </action>
</action> <action name="actionPaste">
<action name="actionRename"> <property name="icon">
<property name="text"> <iconset resource="../data/data.qrc">
<string>Rename</string> <normaloff>:/icons/icons/Icon_Paste.png</normaloff>:/icons/icons/Icon_Paste.png</iconset>
</property> </property>
</action> <property name="text">
<action name="actionEdit_Value"> <string>Paste</string>
<property name="text"> </property>
<string>Edit Value</string> </action>
</property> <action name="actionRename">
</action> <property name="text">
<action name="actionEdit_as_Hex"> <string>Rename</string>
<property name="text"> </property>
<string>Edit as Hex</string> </action>
</property> <action name="actionEdit_Value">
</action> <property name="text">
<action name="actionDelete"> <string>Edit Value</string>
<property name="text"> </property>
<string>Delete</string> </action>
</property> <action name="actionEdit_as_Hex">
</action> <property name="text">
<action name="actiond"> <string>Edit as Hex</string>
<property name="text"> </property>
<string>d</string> </action>
</property> <action name="actionDelete">
</action> <property name="text">
<action name="actiond_2"> <string>Delete</string>
<property name="text"> </property>
<string>d</string> </action>
</property> <action name="actiond">
</action> <property name="text">
<action name="actionClear_Undo_History"> <string>d</string>
<property name="text"> </property>
<string>Clear Undo History</string> </action>
</property> <action name="actiond_2">
</action> <property name="text">
<action name="actionFind"> <string>d</string>
<property name="text"> </property>
<string>Find</string> </action>
</property> <action name="actionClear_Undo_History">
</action> <property name="text">
<action name="actionAbout"> <string>Clear Undo History</string>
<property name="text"> </property>
<string>About</string> </action>
</property> <action name="actionFind">
</action> <property name="text">
<action name="actionChange_Icons"> <string>Find</string>
<property name="text"> </property>
<string>Change Icons</string> </action>
</property> <action name="actionAbout">
</action> <property name="text">
<action name="actionCheck_for_Updates"> <string>About</string>
<property name="text"> </property>
<string>Check for Updates</string> </action>
</property> <action name="actionChange_Icons">
</action> <property name="text">
<action name="actionFind_2"> <string>Change Icons</string>
<property name="icon"> </property>
<iconset resource="../data/data.qrc"> </action>
<normaloff>:/icons/icons/Icon_Find.png</normaloff>:/icons/icons/Icon_Find.png</iconset> <action name="actionCheck_for_Updates">
</property> <property name="text">
<property name="text"> <string>Check for Updates</string>
<string>Find</string> </property>
</property> </action>
</action> <action name="actionFind_2">
<action name="actionPreferences"> <property name="icon">
<property name="text"> <iconset resource="../data/data.qrc">
<string>Preferences...</string> <normaloff>:/icons/icons/Icon_Find.png</normaloff>:/icons/icons/Icon_Find.png</iconset>
</property> </property>
</action> <property name="text">
</widget> <string>Find</string>
<resources> </property>
<include location="../data/data.qrc"/> </action>
</resources> <action name="actionPreferences">
<connections/> <property name="text">
</ui> <string>Preferences...</string>
</property>
</action>
<action name="actionReport_Issue">
<property name="text">
<string>Report Issue</string>
</property>
</action>
<action name="actionRun_Tests">
<property name="text">
<string>Run Tests</string>
</property>
</action>
</widget>
<resources>
<include location="../data/data.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -1,35 +1,35 @@
#include "materialviewer.h" #include "materialviewer.h"
#include "ui_materialviewer.h" #include "ui_materialviewer.h"
MaterialViewer::MaterialViewer(QWidget *parent) MaterialViewer::MaterialViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::MaterialViewer) { , ui(new Ui::MaterialViewer) {
ui->setupUi(this); ui->setupUi(this);
} }
MaterialViewer::~MaterialViewer() { MaterialViewer::~MaterialViewer() {
delete ui; delete ui;
} }
QString ToHexStr(quint32 in) { QString ToHexStr(quint32 in) {
return QString("%1").arg(in, 8, 16, QChar('0')).toUpper(); return QString("%1").arg(in, 8, 16, QChar('0')).toUpper();
} }
void MaterialViewer::SetMaterial(std::shared_ptr<Material> aMaterial) { void MaterialViewer::SetMaterial(const XMaterial* aMaterial) {
ui->lineEdit_NamePtr->setText(ToHexStr(aMaterial->namePtr)); // ui->lineEdit_NamePtr->setText(ToHexStr(aMaterial->namePtr));
ui->lineEdit_Name->setText(aMaterial->name); // ui->lineEdit_Name->setText(aMaterial->name);
ui->lineEdit_RefPtr->setText(ToHexStr(aMaterial->refNamePtr)); // ui->lineEdit_RefPtr->setText(ToHexStr(aMaterial->refNamePtr));
ui->lineEdit_RefName->setText(aMaterial->refName); // ui->lineEdit_RefName->setText(aMaterial->refName);
QString unknownStr = ""; // QString unknownStr = "";
foreach (quint32 unknownPtr, aMaterial->pointers) { // foreach (quint32 unknownPtr, aMaterial->pointers) {
unknownStr += ToHexStr(unknownPtr) + "\n"; // unknownStr += ToHexStr(unknownPtr) + "\n";
} // }
ui->lineEdit_Unknowns->setText(unknownStr); // ui->lineEdit_Unknowns->setText(unknownStr);
ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[0])); // ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[0]));
ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[1])); // ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[1]));
ui->spinBox_TextureCount->setValue(aMaterial->textureCount); // ui->spinBox_TextureCount->setValue(aMaterial->textureCount);
ui->spinBox_ConstCount->setValue(aMaterial->constCount); // ui->spinBox_ConstCount->setValue(aMaterial->constCount);
ui->lineEdit_TechSetPtr->setText(ToHexStr(aMaterial->techSetPtr)); // ui->lineEdit_TechSetPtr->setText(ToHexStr(aMaterial->techSetPtr));
ui->lineEdit_TexturePtr->setText(ToHexStr(aMaterial->texturePtr)); // ui->lineEdit_TexturePtr->setText(ToHexStr(aMaterial->texturePtr));
ui->lineEdit_ConstantPtr->setText(ToHexStr(aMaterial->constPtr)); // ui->lineEdit_ConstantPtr->setText(ToHexStr(aMaterial->constPtr));
} }

View File

@ -1,27 +1,27 @@
#ifndef MATERIALVIEWER_H #ifndef MATERIALVIEWER_H
#define MATERIALVIEWER_H #define MATERIALVIEWER_H
#include "asset_structs.h" #include "xmaterial.h"
#include <QWidget> #include <QWidget>
#include <QScrollArea> #include <QScrollArea>
namespace Ui { namespace Ui {
class MaterialViewer; class MaterialViewer;
} }
class MaterialViewer : public QWidget class MaterialViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit MaterialViewer(QWidget *parent = nullptr); explicit MaterialViewer(QWidget *parent = nullptr);
~MaterialViewer(); ~MaterialViewer();
void SetMaterial(std::shared_ptr<Material> aMaterial); void SetMaterial(const XMaterial *aMaterial);
private: private:
Ui::MaterialViewer *ui; Ui::MaterialViewer *ui;
}; };
#endif // MATERIALVIEWER_H #endif // MATERIALVIEWER_H

View File

@ -1,236 +1,236 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>MaterialViewer</class> <class>MaterialViewer</class>
<widget class="QWidget" name="MaterialViewer"> <widget class="QWidget" name="MaterialViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1001</width> <width>1001</width>
<height>650</height> <height>650</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Material 0</string> <string>Material 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_3"> <widget class="QGroupBox" name="groupBox_3">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>398</height> <height>398</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Header</string> <string>Header</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Name Ptr:</string> <string>Name Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_NamePtr"/> <widget class="QLineEdit" name="lineEdit_NamePtr"/>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Name:</string> <string>Name:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_7"> <widget class="QLabel" name="label_7">
<property name="text"> <property name="text">
<string>Ref Ptr:</string> <string>Ref Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Ref Name:</string> <string>Ref Name:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Unknowns:</string> <string>Unknowns:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="5" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>State A:</string> <string>State A:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0"> <item row="6" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>State B:</string> <string>State B:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="0"> <item row="7" column="0">
<widget class="QLabel" name="label_11"> <widget class="QLabel" name="label_11">
<property name="text"> <property name="text">
<string>Texture Count:</string> <string>Texture Count:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLineEdit" name="lineEdit_Name"/> <widget class="QLineEdit" name="lineEdit_Name"/>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLineEdit" name="lineEdit_RefPtr"/> <widget class="QLineEdit" name="lineEdit_RefPtr"/>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_RefName"/> <widget class="QLineEdit" name="lineEdit_RefName"/>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLineEdit" name="lineEdit_Unknowns"/> <widget class="QLineEdit" name="lineEdit_Unknowns"/>
</item> </item>
<item row="5" column="1"> <item row="5" column="1">
<widget class="QLineEdit" name="lineEdit_StateA"/> <widget class="QLineEdit" name="lineEdit_StateA"/>
</item> </item>
<item row="6" column="1"> <item row="6" column="1">
<widget class="QLineEdit" name="lineEdit_StateB"/> <widget class="QLineEdit" name="lineEdit_StateB"/>
</item> </item>
<item row="7" column="1"> <item row="7" column="1">
<widget class="QSpinBox" name="spinBox_TextureCount"/> <widget class="QSpinBox" name="spinBox_TextureCount"/>
</item> </item>
<item row="8" column="1"> <item row="8" column="1">
<widget class="QSpinBox" name="spinBox_ConstCount"/> <widget class="QSpinBox" name="spinBox_ConstCount"/>
</item> </item>
<item row="9" column="1"> <item row="9" column="1">
<widget class="QLineEdit" name="lineEdit_TechSetPtr"/> <widget class="QLineEdit" name="lineEdit_TechSetPtr"/>
</item> </item>
<item row="8" column="0"> <item row="8" column="0">
<widget class="QLabel" name="label_12"> <widget class="QLabel" name="label_12">
<property name="text"> <property name="text">
<string>Constant Count:</string> <string>Constant Count:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="0"> <item row="9" column="0">
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="text"> <property name="text">
<string>Tech Set Ptr:</string> <string>Tech Set Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="0"> <item row="10" column="0">
<widget class="QLabel" name="label_10"> <widget class="QLabel" name="label_10">
<property name="text"> <property name="text">
<string>Texture Ptr:</string> <string>Texture Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="11" column="0"> <item row="11" column="0">
<widget class="QLabel" name="label_8"> <widget class="QLabel" name="label_8">
<property name="text"> <property name="text">
<string>Constant Ptr:</string> <string>Constant Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="1"> <item row="10" column="1">
<widget class="QLineEdit" name="lineEdit_TexturePtr"/> <widget class="QLineEdit" name="lineEdit_TexturePtr"/>
</item> </item>
<item row="11" column="1"> <item row="11" column="1">
<widget class="QLineEdit" name="lineEdit_ConstantPtr"/> <widget class="QLineEdit" name="lineEdit_ConstantPtr"/>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_4"> <widget class="QGroupBox" name="groupBox_4">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>400</width> <width>400</width>
<height>400</height> <height>400</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Data</string> <string>Data</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_6"/> <layout class="QGridLayout" name="gridLayout_6"/>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>143</height> <height>143</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,14 +1,14 @@
#include "modelviewer.h" #include "modelviewer.h"
#include "ui_modelviewer.h" #include "ui_modelviewer.h"
ModelViewer::ModelViewer(QWidget *parent) ModelViewer::ModelViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::ModelViewer) , ui(new Ui::ModelViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
ModelViewer::~ModelViewer() ModelViewer::~ModelViewer()
{ {
delete ui; delete ui;
} }

View File

@ -1,22 +1,22 @@
#ifndef MODELVIEWER_H #ifndef MODELVIEWER_H
#define MODELVIEWER_H #define MODELVIEWER_H
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class ModelViewer; class ModelViewer;
} }
class ModelViewer : public QWidget class ModelViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ModelViewer(QWidget *parent = nullptr); explicit ModelViewer(QWidget *parent = nullptr);
~ModelViewer(); ~ModelViewer();
private: private:
Ui::ModelViewer *ui; Ui::ModelViewer *ui;
}; };
#endif // MODELVIEWER_H #endif // MODELVIEWER_H

File diff suppressed because it is too large Load Diff

View File

@ -1,35 +1,35 @@
#include "preferenceeditor.h" #include "preferenceeditor.h"
#include "ui_preferenceeditor.h" #include "ui_preferenceeditor.h"
PreferenceEditor::PreferenceEditor(QWidget *parent) PreferenceEditor::PreferenceEditor(QWidget *parent)
: QDialog(parent) : QDialog(parent)
, ui(new Ui::PreferenceEditor) , ui(new Ui::PreferenceEditor)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->frame_View->show(); ui->frame_View->show();
ui->frame_TreeWidget->hide(); ui->frame_TreeWidget->hide();
ui->frame_FileEditors->hide(); ui->frame_FileEditors->hide();
connect(ui->listWidget_Categories, &QListWidget::itemSelectionChanged, this, [this]() { connect(ui->listWidget_Categories, &QListWidget::itemSelectionChanged, this, [this]() {
const QString itemText = ui->listWidget_Categories->selectedItems().first()->text(); const QString itemText = ui->listWidget_Categories->selectedItems().first()->text();
if (itemText == "View") { if (itemText == "View") {
ui->frame_View->show(); ui->frame_View->show();
ui->frame_TreeWidget->hide(); ui->frame_TreeWidget->hide();
ui->frame_FileEditors->hide(); ui->frame_FileEditors->hide();
} else if (itemText == "Tree Widget") { } else if (itemText == "Tree Widget") {
ui->frame_View->hide(); ui->frame_View->hide();
ui->frame_TreeWidget->show(); ui->frame_TreeWidget->show();
ui->frame_FileEditors->hide(); ui->frame_FileEditors->hide();
} else if (itemText == "File Editors") { } else if (itemText == "File Editors") {
ui->frame_View->hide(); ui->frame_View->hide();
ui->frame_TreeWidget->hide(); ui->frame_TreeWidget->hide();
ui->frame_FileEditors->show(); ui->frame_FileEditors->show();
} }
}); });
} }
PreferenceEditor::~PreferenceEditor() PreferenceEditor::~PreferenceEditor()
{ {
delete ui; delete ui;
} }

View File

@ -1,22 +1,22 @@
#ifndef PREFERENCEEDITOR_H #ifndef PREFERENCEEDITOR_H
#define PREFERENCEEDITOR_H #define PREFERENCEEDITOR_H
#include <QDialog> #include <QDialog>
namespace Ui { namespace Ui {
class PreferenceEditor; class PreferenceEditor;
} }
class PreferenceEditor : public QDialog class PreferenceEditor : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PreferenceEditor(QWidget *parent = nullptr); explicit PreferenceEditor(QWidget *parent = nullptr);
~PreferenceEditor(); ~PreferenceEditor();
private: private:
Ui::PreferenceEditor *ui; Ui::PreferenceEditor *ui;
}; };
#endif // PREFERENCEEDITOR_H #endif // PREFERENCEEDITOR_H

File diff suppressed because it is too large Load Diff

View File

@ -1,103 +1,103 @@
#include "reportissuedialog.h" #include "reportissuedialog.h"
#include "qjsonarray.h" #include "qjsonarray.h"
#include "ui_reportissuedialog.h" #include "ui_reportissuedialog.h"
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QMessageBox> #include <QMessageBox>
#include <QNetworkRequest> #include <QNetworkRequest>
ReportIssueDialog::ReportIssueDialog(const QString &giteaBaseUrl, ReportIssueDialog::ReportIssueDialog(const QString &giteaBaseUrl,
const QString &repoOwner, const QString &repoOwner,
const QString &repoName, const QString &repoName,
const QString &accessToken, const QString &accessToken,
QWidget *parent) : QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::ReportIssueDialog), ui(new Ui::ReportIssueDialog),
networkManager(new QNetworkAccessManager(this)), networkManager(new QNetworkAccessManager(this)),
giteaBaseUrl(giteaBaseUrl), giteaBaseUrl(giteaBaseUrl),
repoOwner(repoOwner), repoOwner(repoOwner),
repoName(repoName), repoName(repoName),
accessToken(accessToken) accessToken(accessToken)
{ {
ui->setupUi(this); ui->setupUi(this);
connect(networkManager, &QNetworkAccessManager::finished, this, &ReportIssueDialog::onNetworkReplyFinished); connect(networkManager, &QNetworkAccessManager::finished, this, &ReportIssueDialog::onNetworkReplyFinished);
} }
ReportIssueDialog::~ReportIssueDialog() ReportIssueDialog::~ReportIssueDialog()
{ {
delete ui; delete ui;
} }
void ReportIssueDialog::on_buttonSend_clicked() void ReportIssueDialog::on_buttonSend_clicked()
{ {
QString title = ui->lineEditSummary->text().trimmed(); QString title = ui->lineEditSummary->text().trimmed();
QString details = ui->textEditDetails->toPlainText().trimmed(); QString details = ui->textEditDetails->toPlainText().trimmed();
QString contact = ui->lineEditContact->text().trimmed(); QString contact = ui->lineEditContact->text().trimmed();
if (title.isEmpty()) { if (title.isEmpty()) {
QMessageBox::warning(this, tr("Input Error"), tr("Please enter a summary/title for the issue.")); QMessageBox::warning(this, tr("Input Error"), tr("Please enter a summary/title for the issue."));
return; return;
} }
QString body = details; QString body = details;
if (!contact.isEmpty()) { if (!contact.isEmpty()) {
body += QString("\n\nContact info:\n%1").arg(contact); body += QString("\n\nContact info:\n%1").arg(contact);
} }
ui->buttonSend->setEnabled(false); ui->buttonSend->setEnabled(false);
sendIssueReport(title, body, contact); sendIssueReport(title, body, contact);
} }
void ReportIssueDialog::on_buttonCancel_clicked() void ReportIssueDialog::on_buttonCancel_clicked()
{ {
reject(); reject();
} }
void ReportIssueDialog::sendIssueReport(const QString &title, const QString &body, const QString &/*contact*/) void ReportIssueDialog::sendIssueReport(const QString &title, const QString &body, const QString &/*contact*/)
{ {
// Compose URL: e.g. https://gitea.example.com/api/v1/repos/{owner}/{repo}/issues // Compose URL: e.g. https://gitea.example.com/api/v1/repos/{owner}/{repo}/issues
QUrl url(QString("%1/api/v1/repos/%2/%3/issues").arg(giteaBaseUrl).arg(repoOwner).arg(repoName)); QUrl url(QString("%1/api/v1/repos/%2/%3/issues").arg(giteaBaseUrl).arg(repoOwner).arg(repoName));
QNetworkRequest request(url); QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
if (!accessToken.isEmpty()) { if (!accessToken.isEmpty()) {
request.setRawHeader("Authorization", "token " + accessToken.toUtf8()); request.setRawHeader("Authorization", "token " + accessToken.toUtf8());
} }
// Compose JSON body // Compose JSON body
QJsonObject json; QJsonObject json;
json["title"] = title; json["title"] = title;
json["body"] = body; json["body"] = body;
json["labels"] = QJsonArray{12}; json["labels"] = QJsonArray{12};
QJsonDocument doc(json); QJsonDocument doc(json);
QByteArray data = doc.toJson(); QByteArray data = doc.toJson();
networkManager->post(request, data); networkManager->post(request, data);
} }
void ReportIssueDialog::onNetworkReplyFinished(QNetworkReply *reply) void ReportIssueDialog::onNetworkReplyFinished(QNetworkReply *reply)
{ {
ui->buttonSend->setEnabled(true); ui->buttonSend->setEnabled(true);
QByteArray responseData = reply->readAll(); QByteArray responseData = reply->readAll();
QString responseStr = QString::fromUtf8(responseData); QString responseStr = QString::fromUtf8(responseData);
if (reply->error() != QNetworkReply::NoError) { if (reply->error() != QNetworkReply::NoError) {
QString errorStr = reply->errorString(); QString errorStr = reply->errorString();
if (errorStr.isEmpty()) errorStr = "Unknown network error"; if (errorStr.isEmpty()) errorStr = "Unknown network error";
QMessageBox::critical(this, tr("Error"), tr("Failed to send issue report:\n%1\nResponse:\n%2").arg(errorStr).arg(responseStr)); QMessageBox::critical(this, tr("Error"), tr("Failed to send issue report:\n%1\nResponse:\n%2").arg(errorStr).arg(responseStr));
} else { } else {
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (status == 201) { if (status == 201) {
QMessageBox::information(this, tr("Success"), tr("Issue reported successfully!")); QMessageBox::information(this, tr("Success"), tr("Issue reported successfully!"));
accept(); accept();
} else { } else {
QMessageBox::warning(this, tr("Failed"), tr("Unexpected response from server (%1):\n%2").arg(status).arg(responseStr)); QMessageBox::warning(this, tr("Failed"), tr("Unexpected response from server (%1):\n%2").arg(status).arg(responseStr));
} }
} }
reply->deleteLater(); reply->deleteLater();
} }

View File

@ -1,43 +1,43 @@
#ifndef REPORTISSUEDIALOG_H #ifndef REPORTISSUEDIALOG_H
#define REPORTISSUEDIALOG_H #define REPORTISSUEDIALOG_H
#include <QDialog> #include <QDialog>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
namespace Ui { namespace Ui {
class ReportIssueDialog; class ReportIssueDialog;
} }
class ReportIssueDialog : public QDialog class ReportIssueDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ReportIssueDialog(const QString &giteaBaseUrl, explicit ReportIssueDialog(const QString &giteaBaseUrl,
const QString &repoOwner, const QString &repoOwner,
const QString &repoName, const QString &repoName,
const QString &accessToken, const QString &accessToken,
QWidget *parent = nullptr); QWidget *parent = nullptr);
~ReportIssueDialog(); ~ReportIssueDialog();
private slots: private slots:
void on_buttonSend_clicked(); void on_buttonSend_clicked();
void on_buttonCancel_clicked(); void on_buttonCancel_clicked();
void onNetworkReplyFinished(QNetworkReply *reply); void onNetworkReplyFinished(QNetworkReply *reply);
private: private:
Ui::ReportIssueDialog *ui; Ui::ReportIssueDialog *ui;
QNetworkAccessManager *networkManager; QNetworkAccessManager *networkManager;
QString giteaBaseUrl; QString giteaBaseUrl;
QString repoOwner; QString repoOwner;
QString repoName; QString repoName;
QString accessToken; QString accessToken;
void sendIssueReport(const QString &title, const QString &body, const QString &contact); void sendIssueReport(const QString &title, const QString &body, const QString &contact);
}; };
#endif // REPORTISSUEDIALOG_H #endif // REPORTISSUEDIALOG_H

View File

@ -1,84 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>ReportIssueDialog</class> <class>ReportIssueDialog</class>
<widget class="QDialog" name="ReportIssueDialog"> <widget class="QDialog" name="ReportIssueDialog">
<property name="windowTitle"> <property name="windowTitle">
<string>Report a Problem</string> <string>Report a Problem</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="labelInstructions"> <widget class="QLabel" name="labelInstructions">
<property name="text"> <property name="text">
<string>Please describe the problem you encountered. Well use this info to help fix it.</string> <string>Please describe the problem you encountered. Well use this info to help fix it.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="labelSummary"> <widget class="QLabel" name="labelSummary">
<property name="text"> <property name="text">
<string>Summary (short title):</string> <string>Summary (short title):</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="lineEditSummary" /> <widget class="QLineEdit" name="lineEditSummary" />
</item> </item>
<item> <item>
<widget class="QLabel" name="labelDetails"> <widget class="QLabel" name="labelDetails">
<property name="text"> <property name="text">
<string>Details (what happened?):</string> <string>Details (what happened?):</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QTextEdit" name="textEditDetails" /> <widget class="QTextEdit" name="textEditDetails" />
</item> </item>
<item> <item>
<widget class="QLabel" name="labelContact"> <widget class="QLabel" name="labelContact">
<property name="text"> <property name="text">
<string>Your contact (email or name, optional):</string> <string>Your contact (email or name, optional):</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="lineEditContact" /> <widget class="QLineEdit" name="lineEditContact" />
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="buttonLayout"> <layout class="QHBoxLayout" name="buttonLayout">
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeType"> <property name="sizeType">
<enum>QSizePolicy::Expanding</enum> <enum>QSizePolicy::Expanding</enum>
</property> </property>
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="buttonSend"> <widget class="QPushButton" name="buttonSend">
<property name="text"> <property name="text">
<string>Send Report</string> <string>Send Report</string>
</property> </property>
<property name="default"> <property name="default">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="buttonCancel"> <widget class="QPushButton" name="buttonCancel">
<property name="text"> <property name="text">
<string>Cancel</string> <string>Cancel</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,58 +1,58 @@
#include "rumblefileviewer.h" #include "rumblefileviewer.h"
#include "ui_rumblefileviewer.h" #include "ui_rumblefileviewer.h"
RumbleFileViewer::RumbleFileViewer(QWidget *parent) RumbleFileViewer::RumbleFileViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::RumbleFileViewer) , ui(new Ui::RumbleFileViewer)
, mPropertyCount() , mPropertyCount()
, mRumbleFile(nullptr) { , mRumbleFile(nullptr) {
ui->setupUi(this); ui->setupUi(this);
ui->tableWidget_Properties->setColumnCount(2); ui->tableWidget_Properties->setColumnCount(2);
ui->tableWidget_Properties->setRowCount(0); ui->tableWidget_Properties->setRowCount(0);
ui->tableWidget_Properties->setColumnWidth(0, 200); ui->tableWidget_Properties->setColumnWidth(0, 200);
ui->tableWidget_Properties->horizontalHeader()->setStretchLastSection(true); ui->tableWidget_Properties->horizontalHeader()->setStretchLastSection(true);
} }
RumbleFileViewer::~RumbleFileViewer() { RumbleFileViewer::~RumbleFileViewer() {
delete ui; delete ui;
} }
void RumbleFileViewer::SetRumbleFile(std::shared_ptr<RawFile> aRumbleFile) { void RumbleFileViewer::SetRumbleFile(XRawFile *aRumbleFile) {
mRumbleFile = aRumbleFile; mRumbleFile = aRumbleFile;
ui->tableWidget_Properties->clear(); ui->tableWidget_Properties->clear();
const QString magic = aRumbleFile->contents.left(6); // const QString magic = aRumbleFile->contents.left(6);
if (magic != "RUMBLE") { // if (magic != "RUMBLE") {
qDebug() << "Rumble file has invalid magic: " << magic; // qDebug() << "Rumble file has invalid magic: " << magic;
return; // return;
} // }
int firstIndex = 0; // int firstIndex = 0;
int secondIndex = 0; // int secondIndex = 0;
int thirdIndex = 0; // int thirdIndex = 0;
int startIndex = 0; // int startIndex = 0;
for (int i = 0; i < aRumbleFile->contents.count("\\") / 2; i++) { // for (int i = 0; i < aRumbleFile->contents.count("\\") / 2; i++) {
ui->tableWidget_Properties->setRowCount(i + 1); // ui->tableWidget_Properties->setRowCount(i + 1);
ui->spinBox_Entries->setValue(i + 1); // ui->spinBox_Entries->setValue(i + 1);
firstIndex = aRumbleFile->contents.indexOf("\\", startIndex); // firstIndex = aRumbleFile->contents.indexOf("\\", startIndex);
secondIndex = aRumbleFile->contents.indexOf("\\", firstIndex + 1); // secondIndex = aRumbleFile->contents.indexOf("\\", firstIndex + 1);
thirdIndex = aRumbleFile->contents.indexOf("\\", secondIndex + 1); // thirdIndex = aRumbleFile->contents.indexOf("\\", secondIndex + 1);
if (thirdIndex == -1) { // if (thirdIndex == -1) {
thirdIndex = aRumbleFile->contents.size(); // thirdIndex = aRumbleFile->contents.size();
} // }
const QString keyStr = aRumbleFile->contents.mid(firstIndex + 1, secondIndex - firstIndex - 1); // const QString keyStr = aRumbleFile->contents.mid(firstIndex + 1, secondIndex - firstIndex - 1);
QTableWidgetItem *keyItem = new QTableWidgetItem(keyStr); // QTableWidgetItem *keyItem = new QTableWidgetItem(keyStr);
ui->tableWidget_Properties->setItem(i, 0, keyItem); // ui->tableWidget_Properties->setItem(i, 0, keyItem);
const QString valStr = aRumbleFile->contents.mid(secondIndex + 1, thirdIndex - secondIndex - 1); // const QString valStr = aRumbleFile->contents.mid(secondIndex + 1, thirdIndex - secondIndex - 1);
QTableWidgetItem *valueItem = new QTableWidgetItem(valStr); // QTableWidgetItem *valueItem = new QTableWidgetItem(valStr);
ui->tableWidget_Properties->setItem(i, 1, valueItem); // ui->tableWidget_Properties->setItem(i, 1, valueItem);
startIndex = thirdIndex; // startIndex = thirdIndex;
} // }
} }

View File

@ -1,28 +1,28 @@
#ifndef RUMBLEFILEVIEWER_H #ifndef RUMBLEFILEVIEWER_H
#define RUMBLEFILEVIEWER_H #define RUMBLEFILEVIEWER_H
#include "asset_structs.h" #include "xrawfile.h"
#include "zonefile.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class RumbleFileViewer; class RumbleFileViewer;
} }
class RumbleFileViewer : public QWidget class RumbleFileViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit RumbleFileViewer(QWidget *parent = nullptr); explicit RumbleFileViewer(QWidget *parent = nullptr);
~RumbleFileViewer(); ~RumbleFileViewer();
void SetRumbleFile(std::shared_ptr<RawFile> aRumbleFile); void SetRumbleFile(XRawFile* aRumbleFile);
private: private:
Ui::RumbleFileViewer *ui; Ui::RumbleFileViewer *ui;
quint32 mPropertyCount; quint32 mPropertyCount;
std::shared_ptr<RawFile> mRumbleFile; XRawFile* mRumbleFile;
}; };
#endif // RUMBLEFILEVIEWER_H #endif // RUMBLEFILEVIEWER_H

View File

@ -1,153 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>RumbleFileViewer</class> <class>RumbleFileViewer</class>
<widget class="QWidget" name="RumbleFileViewer"> <widget class="QWidget" name="RumbleFileViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>841</width> <width>841</width>
<height>457</height> <height>457</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>841</width> <width>841</width>
<height>457</height> <height>457</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Rumble File Viewer</string> <string>Rumble File Viewer</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>398</height> <height>398</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Header</string> <string>Header</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="2" column="0" colspan="3"> <item row="2" column="0" colspan="3">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="1" column="1" colspan="2"> <item row="1" column="1" colspan="2">
<widget class="QSpinBox" name="spinBox_Entries"> <widget class="QSpinBox" name="spinBox_Entries">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>10000</number> <number>10000</number>
</property> </property>
<property name="value"> <property name="value">
<number>1</number> <number>1</number>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>Entries:</string> <string>Entries:</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_LocalStrViewer"> <widget class="QGroupBox" name="groupBox_LocalStrViewer">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>400</width> <width>400</width>
<height>400</height> <height>400</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Properties</string> <string>Properties</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTableWidget" name="tableWidget_Properties"> <widget class="QTableWidget" name="tableWidget_Properties">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_5"> <spacer name="verticalSpacer_5">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,54 +1,54 @@
#include "rumblegraphviewer.h" #include "rumblegraphviewer.h"
#include "ui_rumblegraphviewer.h" #include "ui_rumblegraphviewer.h"
RumbleGraphViewer::RumbleGraphViewer(QWidget *parent) RumbleGraphViewer::RumbleGraphViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::RumbleGraphViewer), , ui(new Ui::RumbleGraphViewer),
mEntryCount(), mEntryCount(),
mRumbleGraphFile(nullptr) { mRumbleGraphFile(nullptr) {
ui->setupUi(this); ui->setupUi(this);
ui->tableWidget_Entries->setColumnCount(2); ui->tableWidget_Entries->setColumnCount(2);
ui->tableWidget_Entries->setHorizontalHeaderLabels({ "X", "Y" }); ui->tableWidget_Entries->setHorizontalHeaderLabels({ "X", "Y" });
ui->tableWidget_Entries->setRowCount(0); ui->tableWidget_Entries->setRowCount(0);
ui->tableWidget_Entries->setColumnWidth(0, 200); ui->tableWidget_Entries->setColumnWidth(0, 200);
ui->tableWidget_Entries->horizontalHeader()->setStretchLastSection(true); ui->tableWidget_Entries->horizontalHeader()->setStretchLastSection(true);
} }
RumbleGraphViewer::~RumbleGraphViewer() { RumbleGraphViewer::~RumbleGraphViewer() {
delete ui; delete ui;
} }
void RumbleGraphViewer::SetRumbleGraphFile(const std::shared_ptr<RawFile> aRawFile) { void RumbleGraphViewer::SetRumbleGraphFile(const XRawFile* aRawFile) {
mRumbleGraphFile = aRawFile; mRumbleGraphFile = aRawFile;
QDataStream rawFileStream(mRumbleGraphFile->contents.toLatin1()); QDataStream rawFileStream;//(mRumbleGraphFile->contents.toLatin1());
QByteArray magic(15, Qt::Uninitialized); QByteArray magic(15, Qt::Uninitialized);
rawFileStream.readRawData(magic.data(), 15); rawFileStream.readRawData(magic.data(), 15);
rawFileStream.skipRawData(4); rawFileStream.skipRawData(4);
char sectionChar; char sectionChar;
rawFileStream >> sectionChar; rawFileStream >> sectionChar;
int sectionCount = sectionChar - '0'; int sectionCount = sectionChar - '0';
ui->tableWidget_Entries->setRowCount(sectionCount); ui->tableWidget_Entries->setRowCount(sectionCount);
ui->spinBox_Entries->setValue(sectionCount); ui->spinBox_Entries->setValue(sectionCount);
ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(sectionCount)); ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(sectionCount));
rawFileStream.skipRawData(2); rawFileStream.skipRawData(2);
for (int i = 0; i < sectionCount; i++) { for (int i = 0; i < sectionCount; i++) {
QByteArray xVal(6, Qt::Uninitialized), yVal(6, Qt::Uninitialized); QByteArray xVal(6, Qt::Uninitialized), yVal(6, Qt::Uninitialized);
rawFileStream.readRawData(xVal.data(), 6); rawFileStream.readRawData(xVal.data(), 6);
rawFileStream.skipRawData(1); rawFileStream.skipRawData(1);
rawFileStream.readRawData(yVal.data(), 6); rawFileStream.readRawData(yVal.data(), 6);
rawFileStream.skipRawData(2); rawFileStream.skipRawData(2);
QTableWidgetItem *xItem = new QTableWidgetItem(xVal); QTableWidgetItem *xItem = new QTableWidgetItem(xVal);
QTableWidgetItem *yItem = new QTableWidgetItem(yVal); QTableWidgetItem *yItem = new QTableWidgetItem(yVal);
ui->tableWidget_Entries->setItem(i, 0, xItem); ui->tableWidget_Entries->setItem(i, 0, xItem);
ui->tableWidget_Entries->setItem(i, 1, yItem); ui->tableWidget_Entries->setItem(i, 1, yItem);
} }
} }

View File

@ -1,30 +1,30 @@
#ifndef RUMBLEGRAPHVIEWER_H #ifndef RUMBLEGRAPHVIEWER_H
#define RUMBLEGRAPHVIEWER_H #define RUMBLEGRAPHVIEWER_H
#include "asset_structs.h" #include "xrawfile.h"
#include "zonefile.h" #include "zonefile.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class RumbleGraphViewer; class RumbleGraphViewer;
} }
class RumbleGraphViewer : public QWidget class RumbleGraphViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit RumbleGraphViewer(QWidget *parent = nullptr); explicit RumbleGraphViewer(QWidget *parent = nullptr);
~RumbleGraphViewer(); ~RumbleGraphViewer();
void SetEntryCount(quint32 aCount); void SetEntryCount(quint32 aCount);
void SetRumbleGraphFile(const std::shared_ptr<RawFile> aRawFile); void SetRumbleGraphFile(const XRawFile *aRawFile);
void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile); void SetZoneFile(ZoneFile* aZoneFile);
private: private:
Ui::RumbleGraphViewer *ui; Ui::RumbleGraphViewer *ui;
quint32 mEntryCount; quint32 mEntryCount;
std::shared_ptr<RawFile> mRumbleGraphFile; const XRawFile* mRumbleGraphFile;
}; };
#endif // RUMBLEGRAPHVIEWER_H #endif // RUMBLEGRAPHVIEWER_H

View File

@ -1,153 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>RumbleGraphViewer</class> <class>RumbleGraphViewer</class>
<widget class="QWidget" name="RumbleGraphViewer"> <widget class="QWidget" name="RumbleGraphViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>841</width> <width>841</width>
<height>457</height> <height>457</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>841</width> <width>841</width>
<height>457</height> <height>457</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Rumble Graph File </string> <string>Rumble Graph File </string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>398</height> <height>398</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Header</string> <string>Header</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>Entry Count: </string> <string>Entry Count: </string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1" colspan="2"> <item row="1" column="1" colspan="2">
<widget class="QSpinBox" name="spinBox_Entries"> <widget class="QSpinBox" name="spinBox_Entries">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>10000</number> <number>10000</number>
</property> </property>
<property name="value"> <property name="value">
<number>0</number> <number>0</number>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0" colspan="3"> <item row="2" column="0" colspan="3">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_LocalStrViewer"> <widget class="QGroupBox" name="groupBox_LocalStrViewer">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>400</width> <width>400</width>
<height>400</height> <height>400</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Entries</string> <string>Entries</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTableWidget" name="tableWidget_Entries"> <widget class="QTableWidget" name="tableWidget_Entries">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_5"> <spacer name="verticalSpacer_5">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,80 +1,80 @@
#include "soundviewer.h" #include "soundviewer.h"
#include "ui_soundviewer.h" #include "ui_soundviewer.h"
SoundViewer::SoundViewer(QWidget *parent) SoundViewer::SoundViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::SoundViewer) , ui(new Ui::SoundViewer)
, player(new QMediaPlayer()) , player(new QMediaPlayer())
, buffer(new QBuffer()) , buffer(new QBuffer())
{ {
ui->setupUi(this); ui->setupUi(this);
connect(ui->pushButton_Play, &QPushButton::clicked, player, &QMediaPlayer::play); connect(ui->pushButton_Play, &QPushButton::clicked, player, &QMediaPlayer::play);
connect(ui->pushButton_Pause, &QPushButton::clicked, player, &QMediaPlayer::pause); connect(ui->pushButton_Pause, &QPushButton::clicked, player, &QMediaPlayer::pause);
connect(ui->pushButton_Stop, &QPushButton::clicked, this, [this]() { connect(ui->pushButton_Stop, &QPushButton::clicked, this, [this]() {
if (player->isPlaying()) { if (player->isPlaying()) {
player->stop(); player->stop();
} }
}); });
connect(ui->pushButton_SkipForward, &QPushButton::clicked, this, [this]() { connect(ui->pushButton_SkipForward, &QPushButton::clicked, this, [this]() {
player->setPosition(player->position() + 30); player->setPosition(player->position() + 30);
}); });
connect(ui->pushButton_SkipBack, &QPushButton::clicked, this, [this]() { connect(ui->pushButton_SkipBack, &QPushButton::clicked, this, [this]() {
player->setPosition(player->position() - 30); player->setPosition(player->position() - 30);
}); });
connect(player, &QMediaPlayer::positionChanged, player, [this](qint64 position) { connect(player, &QMediaPlayer::positionChanged, player, [this](qint64 position) {
ui->horizontalSlider->setSliderPosition(position); ui->horizontalSlider->setSliderPosition(position);
ui->label_Time->setText(QString("%1:%2:%3") ui->label_Time->setText(QString("%1:%2:%3")
.arg(position / 60000) .arg(position / 60000)
.arg((position % 60000) / 1000) .arg((position % 60000) / 1000)
.arg(position % 1000)); .arg(position % 1000));
}); });
connect(player, &QMediaPlayer::durationChanged, player, [this](qint64 duration) { connect(player, &QMediaPlayer::durationChanged, player, [this](qint64 duration) {
ui->horizontalSlider->setMaximum(duration); ui->horizontalSlider->setMaximum(duration);
ui->label_TimeMax->setText(QString("%1:%2:%3") ui->label_TimeMax->setText(QString("%1:%2:%3")
.arg(duration / 60000) .arg(duration / 60000)
.arg((duration % 60000) / 1000) .arg((duration % 60000) / 1000)
.arg(duration % 1000)); .arg(duration % 1000));
}); });
connect(ui->horizontalSlider, &QSlider::sliderMoved, this, [this](int position) { connect(ui->horizontalSlider, &QSlider::sliderMoved, this, [this](int position) {
player->setPosition(position); player->setPosition(position);
}); });
for (auto outputDevice : QMediaDevices::audioOutputs()) { for (auto outputDevice : QMediaDevices::audioOutputs()) {
ui->comboBox_Output->addItem(outputDevice.description()); ui->comboBox_Output->addItem(outputDevice.description());
} }
connect(ui->comboBox_Output, &QComboBox::currentIndexChanged, this, [this](int index) { connect(ui->comboBox_Output, &QComboBox::currentIndexChanged, this, [this](int index) {
auto outputDevice = QMediaDevices::audioOutputs()[index]; auto outputDevice = QMediaDevices::audioOutputs()[index];
QAudioOutput *audioOutput = new QAudioOutput(outputDevice); QAudioOutput *audioOutput = new QAudioOutput(outputDevice);
player->setAudioOutput(audioOutput); player->setAudioOutput(audioOutput);
}); });
auto outputDevice = QMediaDevices::defaultAudioOutput(); auto outputDevice = QMediaDevices::defaultAudioOutput();
QAudioOutput *audioOutput = new QAudioOutput(outputDevice); QAudioOutput *audioOutput = new QAudioOutput(outputDevice);
player->setAudioOutput(audioOutput); player->setAudioOutput(audioOutput);
} }
SoundViewer::~SoundViewer() SoundViewer::~SoundViewer()
{ {
delete buffer; delete buffer;
delete player; delete player;
delete ui; delete ui;
} }
void SoundViewer::SetSound(std::shared_ptr<Sound> aSound) // void SoundViewer::SetSound(std::shared_ptr<Sound> aSound)
{ // {
buffer->setData(aSound->data); // buffer->setData(aSound->data);
if (!buffer->open(QIODevice::ReadOnly)) { // if (!buffer->open(QIODevice::ReadOnly)) {
qWarning() << "Failed to open QBuffer."; // qWarning() << "Failed to open QBuffer.";
return; // return;
} // }
ui->groupBox->setTitle(aSound->path); // ui->groupBox->setTitle(aSound->path);
player->setSourceDevice(buffer); // player->setSourceDevice(buffer);
} // }
void SoundViewer::SetOutput(QAudioOutput *aOutput) { void SoundViewer::SetOutput(QAudioOutput *aOutput) {
if (!aOutput) { return; } if (!aOutput) { return; }
player->setAudioOutput(aOutput); player->setAudioOutput(aOutput);
} }

View File

@ -1,34 +1,32 @@
#ifndef SOUNDVIEWER_H #ifndef SOUNDVIEWER_H
#define SOUNDVIEWER_H #define SOUNDVIEWER_H
#include "asset_structs.h" #include <QWidget>
#include <QMediaPlayer>
#include <QWidget> #include <QBuffer>
#include <QMediaPlayer> #include <QAudioDevice>
#include <QBuffer> #include <QMediaDevices>
#include <QAudioDevice> #include <QAudioOutput>
#include <QMediaDevices>
#include <QAudioOutput> namespace Ui {
class SoundViewer;
namespace Ui { }
class SoundViewer;
} class SoundViewer : public QWidget
{
class SoundViewer : public QWidget Q_OBJECT
{
Q_OBJECT public:
explicit SoundViewer(QWidget *parent = nullptr);
public: ~SoundViewer();
explicit SoundViewer(QWidget *parent = nullptr);
~SoundViewer(); //void SetSound(std::shared_ptr<Sound> aSound);
void SetSound(std::shared_ptr<Sound> aSound); void SetOutput(QAudioOutput *aOutput);
private:
void SetOutput(QAudioOutput *aOutput); Ui::SoundViewer *ui;
private: QMediaPlayer *player;
Ui::SoundViewer *ui; QBuffer *buffer;
QMediaPlayer *player; };
QBuffer *buffer;
}; #endif // SOUNDVIEWER_H
#endif // SOUNDVIEWER_H

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +1,35 @@
#include "stringtableviewer.h" #include "stringtableviewer.h"
#include "ui_stringtableviewer.h" #include "ui_stringtableviewer.h"
StringTableViewer::StringTableViewer(QWidget *parent) StringTableViewer::StringTableViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::StringTableViewer) , ui(new Ui::StringTableViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
StringTableViewer::~StringTableViewer() StringTableViewer::~StringTableViewer()
{ {
delete ui; delete ui;
} }
void StringTableViewer::SetStringTable(std::shared_ptr<StringTable> aStringTable) { void StringTableViewer::SetStringTable(const XStringTable *aStringTable) {
ui->tableWidget_Strings->clear(); ui->tableWidget_Strings->clear();
ui->tableWidget_Strings->setRowCount(aStringTable->rowCount); ui->tableWidget_Strings->setRowCount(aStringTable->GetRowCount());
ui->tableWidget_Strings->setColumnCount(aStringTable->columnCount); ui->tableWidget_Strings->setColumnCount(aStringTable->GetColumnCount());
int currentIndex = 0; int currentIndex = 0;
for (const QString &key : aStringTable->content.keys()) { for (auto value : *aStringTable->GetValues()) {
const QString value = aStringTable->content[key];
QTableWidgetItem *tableKeyItem = new QTableWidgetItem();
QTableWidgetItem *tableKeyItem = new QTableWidgetItem(); tableKeyItem->setText(value->GetName());
tableKeyItem->setText(key); ui->tableWidget_Strings->setItem(currentIndex, 0, tableKeyItem);
ui->tableWidget_Strings->setItem(currentIndex, 0, tableKeyItem);
QTableWidgetItem *tableValItem = new QTableWidgetItem();
QTableWidgetItem *tableValItem = new QTableWidgetItem(); tableValItem->setText(value->GetString());
tableValItem->setText(value); ui->tableWidget_Strings->setItem(currentIndex, 1, tableValItem);
ui->tableWidget_Strings->setItem(currentIndex, 1, tableValItem);
currentIndex++;
currentIndex++; }
} }
}

View File

@ -1,25 +1,26 @@
#ifndef STRINGTABLEVIEWER_H #ifndef STRINGTABLEVIEWER_H
#define STRINGTABLEVIEWER_H #define STRINGTABLEVIEWER_H
#include "asset_structs.h" #include "xstringtable.h"
#include <QWidget>
#include <QWidget>
namespace Ui {
class StringTableViewer; namespace Ui {
} class StringTableViewer;
}
class StringTableViewer : public QWidget
{ class StringTableViewer : public QWidget
Q_OBJECT {
Q_OBJECT
public:
explicit StringTableViewer(QWidget *parent = nullptr); public:
~StringTableViewer(); explicit StringTableViewer(QWidget *parent = nullptr);
~StringTableViewer();
void SetStringTable(std::shared_ptr<StringTable> aStringTable);
void SetStringTable(const XStringTable *aStringTable);
private:
Ui::StringTableViewer *ui; private:
}; Ui::StringTableViewer *ui;
};
#endif // STRINGTABLEVIEWER_H
#endif // STRINGTABLEVIEWER_H

View File

@ -1,24 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>StringTableViewer</class> <class>StringTableViewer</class>
<widget class="QWidget" name="StringTableViewer"> <widget class="QWidget" name="StringTableViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>525</width> <width>525</width>
<height>752</height> <height>752</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTableWidget" name="tableWidget_Strings"/> <widget class="QTableWidget" name="tableWidget_Strings"/>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,25 +1,25 @@
#include "techsetviewer.h" #include "techsetviewer.h"
#include "ui_techsetviewer.h" #include "ui_techsetviewer.h"
TechSetViewer::TechSetViewer(QWidget *parent) TechSetViewer::TechSetViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::TechSetViewer) , ui(new Ui::TechSetViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
TechSetViewer::~TechSetViewer() TechSetViewer::~TechSetViewer()
{ {
delete ui; delete ui;
} }
void TechSetViewer::SetTechSet(std::shared_ptr<TechSet> aTechSet) { void TechSetViewer::SetTechSet(const XMaterialTechniqueSet* aTechSet) {
ui->listWidget_Ptrs->clear(); //ui->listWidget_Ptrs->clear();
ui->label_Title->setText(aTechSet->name); ui->label_Title->setText(aTechSet->GetName());
int ptrIndex = 1; // int ptrIndex = 1;
for (auto ptr : aTechSet->pointers) { //for (auto ptr : aTechSet->pointers) {
ui->listWidget_Ptrs->addItem(QString("Pointer %1: %2").arg(ptrIndex).arg(ptr)); // ui->listWidget_Ptrs->addItem(QString("Pointer %1: %2").arg(ptrIndex).arg(ptr));
ptrIndex++; // ptrIndex++;
} //}
} }

View File

@ -1,25 +1,26 @@
#ifndef TECHSETVIEWER_H #ifndef TECHSETVIEWER_H
#define TECHSETVIEWER_H #define TECHSETVIEWER_H
#include "asset_structs.h" #include "xmaterialtechniqueset.h"
#include <QWidget>
#include <QWidget>
namespace Ui {
class TechSetViewer; namespace Ui {
} class TechSetViewer;
}
class TechSetViewer : public QWidget
{ class TechSetViewer : public QWidget
Q_OBJECT {
Q_OBJECT
public:
explicit TechSetViewer(QWidget *parent = nullptr); public:
~TechSetViewer(); explicit TechSetViewer(QWidget *parent = nullptr);
~TechSetViewer();
void SetTechSet(std::shared_ptr<TechSet> aTechSet);
void SetTechSet(const XMaterialTechniqueSet *aTechSet);
private:
Ui::TechSetViewer *ui; private:
}; Ui::TechSetViewer *ui;
};
#endif // TECHSETVIEWER_H
#endif // TECHSETVIEWER_H

View File

@ -1,77 +1,151 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>TechSetViewer</class> <class>TechSetViewer</class>
<widget class="QWidget" name="TechSetViewer"> <widget class="QWidget" name="TechSetViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>961</width> <width>880</width>
<height>756</height> <height>559</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Technique Set 0</string> <string>Technique Set 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout_7">
<item> <item>
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="title"> <property name="title">
<string>Unknown Pointers:</string> <string>Set Parameters</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QListWidget" name="listWidget_Ptrs"/> <layout class="QHBoxLayout" name="horizontalLayout">
</item> <item>
</layout> <widget class="QLabel" name="label">
</widget> <property name="text">
</item> <string>Name:</string>
<item> </property>
<spacer name="horizontalSpacer"> </widget>
<property name="orientation"> </item>
<enum>Qt::Orientation::Horizontal</enum> <item>
</property> <widget class="QLineEdit" name="lineEdit_Name">
<property name="sizeHint" stdset="0"> <property name="placeholderText">
<size> <string>Technique set name</string>
<width>40</width> </property>
<height>20</height> </widget>
</size> </item>
</property> </layout>
</spacer> </item>
</item> <item>
</layout> <layout class="QHBoxLayout" name="horizontalLayout_2">
</item> <item>
<item> <widget class="QLabel" name="label_2">
<spacer name="verticalSpacer"> <property name="text">
<property name="orientation"> <string>World Vertex Format:</string>
<enum>Qt::Orientation::Vertical</enum> </property>
</property> </widget>
<property name="sizeHint" stdset="0"> </item>
<size> <item>
<width>20</width> <widget class="QSpinBox" name="spinBox_WorldVertFormat"/>
<height>363</height> </item>
</size> </layout>
</property> </item>
</spacer> <item>
</item> <widget class="QListWidget" name="listWidget_Techniques"/>
</layout> </item>
</widget> </layout>
<resources/> </widget>
<connections/> </item>
</ui> <item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Current Technique</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Name:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_TechniqueName">
<property name="placeholderText">
<string>Technique set name</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>Flags:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_Flags"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Pass Count:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_PassCount"/>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Material Pass</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

File diff suppressed because it is too large Load Diff

View File

@ -1,64 +1,67 @@
#ifndef XTREEWIDGET_H #ifndef XTREEWIDGET_H
#define XTREEWIDGET_H #define XTREEWIDGET_H
#include "d3dbsp_structs.h" #include "d3dbsp_structs.h"
#include "asset_structs.h" #include "ddsfile.h"
#include "ddsfile.h" #include "iwifile.h"
#include "iwifile.h" #include "fastfile.h"
#include "fastfile.h" #include "xloadedsound.h"
#include "xtreewidgetitem.h" #include "xtreewidgetitem.h"
#include "zonefile.h" #include "zonefile.h"
#include "utils.h" #include "xrawfile.h"
#include "xgfximage.h"
#include <QTreeWidget> #include "xstringtable.h"
#include <QFileDialog> #include "xmenudef.h"
class XTreeWidget : public QTreeWidget #include <QTreeWidget>
{ #include <QFileDialog>
Q_OBJECT
public: class XTreeWidget : public QTreeWidget
explicit XTreeWidget(QWidget *parent = nullptr); {
~XTreeWidget(); Q_OBJECT
public:
void AddFastFile(std::shared_ptr<FastFile> aFastFile); explicit XTreeWidget(QWidget *parent = nullptr);
void AddZoneFile(std::shared_ptr<ZoneFile> aZoneFile, XTreeWidgetItem *aParentItem = nullptr); ~XTreeWidget();
void AddIWIFile(std::shared_ptr<IWIFile> aIWIFile);
void AddDDSFile(std::shared_ptr<DDSFile> aDDSFile); void AddFastFile(FastFile* aFastFile);
void AddZoneFile(const ZoneFile *aZoneFile, XTreeWidgetItem *aParentItem = nullptr);
std::shared_ptr<ZoneFile> FindZoneFile(const QString aStem); void AddIWIFile(IWIFile* aIWIFile);
std::shared_ptr<FastFile> FindFastFile(const QString aStem); void AddDDSFile(DDSFile* aDDSFile);
bool HasZoneFile(const QString aStem); const ZoneFile *FindZoneFile(const QString aStem);
bool HasFastFile(const QString aStem); const FastFile* FindFastFile(const QString aStem);
void CloseFastFile(const QString aFFName); bool HasZoneFile(const QString aStem);
signals: bool HasFastFile(const QString aStem);
void DDSFileSelected(std::shared_ptr<DDSFile> aDDSFile, const QString aParentName);
void IWIFileSelected(std::shared_ptr<IWIFile> aIWIFile, const QString aParentName); void CloseFastFile(const QString aFFName);
void FastFileSelected(std::shared_ptr<FastFile> aFastFile, const QString aParentName); signals:
void ZoneFileSelected(std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName); void DDSFileSelected(const DDSFile* aDDSFile, const QString aParentName);
void LocalStringSelected(std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName); void IWIFileSelected(const IWIFile* aIWIFile, const QString aParentName);
void RawFileSelected(std::shared_ptr<RawFile> aRawFile, const QString aParentName); void FastFileSelected(const FastFile* aFastFile, const QString aParentName);
void ImageSelected(std::shared_ptr<Image> aImage, const QString aParentName); void ZoneFileSelected(const ZoneFile* aZoneFile, const QString aParentName);
void TechSetSelected(std::shared_ptr<TechSet> aZoneFile, const QString aParentName); void LocalStringSelected(const ZoneFile* aZoneFile, const QString aParentName);
void StrTableSelected(std::shared_ptr<StringTable> aStrTable, const QString aParentName); void RawFileSelected(const XRawFile* aRawFile, const QString aParentName);
void MenuSelected(std::shared_ptr<Menu> aMenu, const QString aParentName); void ImageSelected(const XGfxImage* aImage, const QString aParentName);
void SoundSelected(std::shared_ptr<Sound> aSound, const QString aParentName); void TechSetSelected(const XMaterialTechniqueSet* aZoneFile, const QString aParentName);
void MaterialSelected(std::shared_ptr<Material> aMaterial, const QString aParentName); void StrTableSelected(const XStringTable* aStrTable, const QString aParentName);
void ItemSelected(const QString itemText); void MenuSelected(const XMenuDef* aMenu, const QString aParentName);
void SoundSelected(const XLoadedSound* aSound, const QString aParentName);
void ItemClosed(const QString itemText); void MaterialSelected(const XMaterial* aMaterial, const QString aParentName);
void Cleared(); void ItemSelected(const QString itemText);
protected: void ItemClosed(const QString itemText);
void ItemSelectionChanged(); void Cleared();
void PrepareContextMenu(const QPoint &pos);
protected:
private: void ItemSelectionChanged();
QMap<QString, std::shared_ptr<FastFile>> mFastFiles; void PrepareContextMenu(const QPoint &pos);
QMap<QString, std::shared_ptr<ZoneFile>> mZoneFiles;
QMap<QString, std::shared_ptr<DDSFile>> mDDSFiles; private:
QMap<QString, std::shared_ptr<IWIFile>> mIWIFiles; QMap<QString, const FastFile*> mFastFiles;
}; QMap<QString, const ZoneFile*> mZoneFiles;
QMap<QString, const DDSFile*> mDDSFiles;
#endif // XTREEWIDGET_H QMap<QString, const IWIFile*> mIWIFiles;
};
#endif // XTREEWIDGET_H

View File

@ -1,56 +1,56 @@
#include "xtreewidgetitem.h" #include "xtreewidgetitem.h"
XTreeWidgetItem::XTreeWidgetItem(QTreeWidget *parent, bool group) XTreeWidgetItem::XTreeWidgetItem(QTreeWidget *parent, bool group)
: QTreeWidgetItem(parent) : QTreeWidgetItem(parent)
, isGroup(group) , isGroup(group)
, mCategory(CATEGORY_NONE) { , mCategory(CATEGORY_NONE) {
} }
XTreeWidgetItem::XTreeWidgetItem(QTreeWidgetItem *parent, bool group) XTreeWidgetItem::XTreeWidgetItem(QTreeWidgetItem *parent, bool group)
: QTreeWidgetItem(parent) : QTreeWidgetItem(parent)
, isGroup(group) , isGroup(group)
, mCategory(CATEGORY_NONE) { , mCategory(CATEGORY_NONE) {
} }
void XTreeWidgetItem::SetCategory(TREE_CATEGORY category) void XTreeWidgetItem::SetCategory(TREE_CATEGORY category)
{ {
mCategory = category; mCategory = category;
} }
TREE_CATEGORY XTreeWidgetItem::GetCategory() TREE_CATEGORY XTreeWidgetItem::GetCategory()
{ {
return mCategory; return mCategory;
} }
bool XTreeWidgetItem::operator<(const QTreeWidgetItem &other) const { bool XTreeWidgetItem::operator<(const QTreeWidgetItem &other) const {
// Attempt to cast the other item to our custom type. // Attempt to cast the other item to our custom type.
const XTreeWidgetItem* otherItem = dynamic_cast<const XTreeWidgetItem*>(&other); const XTreeWidgetItem* otherItem = dynamic_cast<const XTreeWidgetItem*>(&other);
if (otherItem) { if (otherItem) {
bool thisIsGroup = this->childCount() > 0; bool thisIsGroup = this->childCount() > 0;
bool otherIsGroup = otherItem->childCount() > 0; bool otherIsGroup = otherItem->childCount() > 0;
if (thisIsGroup != otherIsGroup) { if (thisIsGroup != otherIsGroup) {
return otherIsGroup; // Groups should come before non-groups return otherIsGroup; // Groups should come before non-groups
} }
} }
// Fallback to the default string comparison on the current sort column. // Fallback to the default string comparison on the current sort column.
return QTreeWidgetItem::operator<(other); return QTreeWidgetItem::operator<(other);
} }
XTreeWidgetItem& XTreeWidgetItem::operator=(const XTreeWidgetItem &other) XTreeWidgetItem& XTreeWidgetItem::operator=(const XTreeWidgetItem &other)
{ {
if (this != &other) { if (this != &other) {
// Copy text and icon for each column. // Copy text and icon for each column.
const int colCount = other.columnCount(); const int colCount = other.columnCount();
for (int i = 0; i < colCount; ++i) { for (int i = 0; i < colCount; ++i) {
setText(i, other.text(i)); setText(i, other.text(i));
setIcon(i, other.icon(i)); setIcon(i, other.icon(i));
} }
// Copy custom members. // Copy custom members.
this->isGroup = other.isGroup; this->isGroup = other.isGroup;
} }
return *this; return *this;
} }

View File

@ -1,36 +1,36 @@
#ifndef XTREEWIDGETITEM_H #ifndef XTREEWIDGETITEM_H
#define XTREEWIDGETITEM_H #define XTREEWIDGETITEM_H
#include <QTreeWidget> #include <QTreeWidget>
#include <QTreeWidgetItem> #include <QTreeWidgetItem>
enum TREE_CATEGORY { enum TREE_CATEGORY {
CATEGORY_NONE = 0x00, CATEGORY_NONE = 0x00,
CATEGORY_FILE = 0x01, CATEGORY_FILE = 0x01,
CATEGORY_TYPE = 0x02 CATEGORY_TYPE = 0x02
}; };
// Custom item class // Custom item class
class XTreeWidgetItem : public QTreeWidgetItem class XTreeWidgetItem : public QTreeWidgetItem
{ {
public: public:
// Flag to indicate if the item is a collapsible group/header. // Flag to indicate if the item is a collapsible group/header.
bool isGroup; bool isGroup;
// Constructors: default to non-group unless specified. // Constructors: default to non-group unless specified.
XTreeWidgetItem(QTreeWidget *parent, bool group = false); XTreeWidgetItem(QTreeWidget *parent, bool group = false);
XTreeWidgetItem(QTreeWidgetItem *parent, bool group = false); XTreeWidgetItem(QTreeWidgetItem *parent, bool group = false);
void SetCategory(TREE_CATEGORY category); void SetCategory(TREE_CATEGORY category);
TREE_CATEGORY GetCategory(); TREE_CATEGORY GetCategory();
// Override the less-than operator to customize sorting. // Override the less-than operator to customize sorting.
bool operator<(const QTreeWidgetItem &other) const override; bool operator<(const QTreeWidgetItem &other) const override;
XTreeWidgetItem &operator =(const XTreeWidgetItem &other); XTreeWidgetItem &operator =(const XTreeWidgetItem &other);
private: private:
TREE_CATEGORY mCategory; TREE_CATEGORY mCategory;
}; };
#endif // XTREEWIDGETITEM_H #endif // XTREEWIDGETITEM_H

View File

@ -1,158 +1,156 @@
#include "zonefileviewer.h" #include "zonefileviewer.h"
#include "ui_zonefileviewer.h" #include "ui_zonefileviewer.h"
#include "statusbarmanager.h" #include "statusbarmanager.h"
ZoneFileViewer::ZoneFileViewer(QWidget *parent) ZoneFileViewer::ZoneFileViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::ZoneFileViewer) { , ui(new Ui::ZoneFileViewer) {
ui->setupUi(this); ui->setupUi(this);
mZoneFile = nullptr; mZoneFile = nullptr;
ui->tableWidget_RecordCounts->setColumnCount(3); ui->tableWidget_RecordCounts->setColumnCount(3);
ui->tableWidget_RecordCounts->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count" }); ui->tableWidget_RecordCounts->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count" });
ui->tableWidget_RecordCounts->horizontalHeader()->setStretchLastSection(true); ui->tableWidget_RecordCounts->horizontalHeader()->setStretchLastSection(true);
ui->tableWidget_RecordOrder->setColumnCount(3); ui->tableWidget_RecordOrder->setColumnCount(3);
ui->tableWidget_RecordOrder->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count" }); ui->tableWidget_RecordOrder->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count" });
ui->tableWidget_RecordOrder->horizontalHeader()->setStretchLastSection(true); ui->tableWidget_RecordOrder->horizontalHeader()->setStretchLastSection(true);
connect(ui->lineEdit_TagSearch, &QLineEdit::textChanged, this, &ZoneFileViewer::SortTags); connect(ui->lineEdit_TagSearch, &QLineEdit::textChanged, this, &ZoneFileViewer::SortTags);
connect(ui->tableWidget_RecordCounts, &QTableWidget::itemSelectionChanged, this, &ZoneFileViewer::HighlightRecordInOrder); connect(ui->tableWidget_RecordCounts, &QTableWidget::itemSelectionChanged, this, &ZoneFileViewer::HighlightRecordInOrder);
connect(ui->listWidget_Tags, &QListWidget::currentTextChanged, this, [this](const QString &aCurrentText) { connect(ui->listWidget_Tags, &QListWidget::currentTextChanged, this, [this](const QString &aCurrentText) {
StatusBarManager::instance().updateStatus(QString("Selected tag '%1' with index %2").arg(aCurrentText).arg(mZoneFile->GetTags().indexOf(aCurrentText))); StatusBarManager::instance().updateStatus(QString("Selected tag '%1' with index %2").arg(aCurrentText).arg(mZoneFile->GetTags().indexOf(aCurrentText)));
}); });
} }
ZoneFileViewer::~ZoneFileViewer() { ZoneFileViewer::~ZoneFileViewer() {
delete ui; delete ui;
} }
void ZoneFileViewer::HighlightRecordInOrder() { void ZoneFileViewer::HighlightRecordInOrder() {
ui->tableWidget_RecordOrder->clearSelection(); ui->tableWidget_RecordOrder->clearSelection();
foreach (auto selectedItem, ui->tableWidget_RecordCounts->selectedItems()) { foreach (auto selectedItem, ui->tableWidget_RecordCounts->selectedItems()) {
int selectedRow = selectedItem->row(); int selectedRow = selectedItem->row();
const QString assetId = ui->tableWidget_RecordCounts->item(selectedRow, 0)->text(); const QString assetId = ui->tableWidget_RecordCounts->item(selectedRow, 0)->text();
for (int i = 0; i < ui->tableWidget_RecordOrder->rowCount(); i++) { for (int i = 0; i < ui->tableWidget_RecordOrder->rowCount(); i++) {
const QString testAssetId = ui->tableWidget_RecordOrder->item(i, 0)->text(); const QString testAssetId = ui->tableWidget_RecordOrder->item(i, 0)->text();
if (testAssetId != assetId) { continue; } if (testAssetId != assetId) { continue; }
ui->tableWidget_RecordOrder->selectRow(i); ui->tableWidget_RecordOrder->selectRow(i);
ui->tableWidget_RecordOrder->item(i, 0)->setSelected(true); ui->tableWidget_RecordOrder->item(i, 0)->setSelected(true);
ui->tableWidget_RecordOrder->item(i, 1)->setSelected(true); ui->tableWidget_RecordOrder->item(i, 1)->setSelected(true);
ui->tableWidget_RecordOrder->item(i, 2)->setSelected(true); ui->tableWidget_RecordOrder->item(i, 2)->setSelected(true);
ui->tableWidget_RecordOrder->item(i, 3)->setSelected(true); ui->tableWidget_RecordOrder->item(i, 3)->setSelected(true);
} }
} }
} }
void ZoneFileViewer::SortTags(const QString &aSearchText) { void ZoneFileViewer::SortTags(const QString &aSearchText) {
ui->listWidget_Tags->clear(); ui->listWidget_Tags->clear();
const QStringList tags = mZoneFile->GetTags(); const QStringList tags = mZoneFile->GetTags();
if (aSearchText.isEmpty()) { if (aSearchText.isEmpty()) {
ui->listWidget_Tags->addItems(tags); ui->listWidget_Tags->addItems(tags);
return; return;
} }
QStringList sortedTags; QStringList sortedTags;
foreach (const QString tag, tags) { foreach (const QString tag, tags) {
if (tag.contains(aSearchText)) { if (tag.contains(aSearchText)) {
sortedTags << tag; sortedTags << tag;
} }
} }
StatusBarManager::instance().updateStatus(QString("Found %1 tags.").arg(sortedTags.size())); StatusBarManager::instance().updateStatus(QString("Found %1 tags.").arg(sortedTags.size()));
ui->listWidget_Tags->addItems(sortedTags); ui->listWidget_Tags->addItems(sortedTags);
} }
void ZoneFileViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) { void ZoneFileViewer::SetZoneFile(const ZoneFile* aZoneFile) {
mZoneFile = aZoneFile; mZoneFile = aZoneFile;
ui->tableWidget_RecordCounts->clearContents(); ui->tableWidget_RecordCounts->clearContents();
ui->tableWidget_RecordOrder->clearContents(); ui->tableWidget_RecordOrder->clearContents();
ui->listWidget_Tags->clear(); ui->listWidget_Tags->clear();
const QStringList tags = mZoneFile->GetTags(); const QStringList tags = mZoneFile->GetTags();
ui->listWidget_Tags->addItems(tags); ui->listWidget_Tags->addItems(tags);
ui->label_Title->setText(mZoneFile->GetBaseStem() + ".zone"); ui->label_Title->setText(mZoneFile->GetBaseStem() + ".zone");
ui->groupBox_Tags->setTitle(QString("Tags (%1)").arg(tags.size())); ui->groupBox_Tags->setTitle(QString("Tags (%1)").arg(tags.size()));
if (tags.isEmpty()) { if (tags.isEmpty()) {
ui->groupBox_Tags->hide(); ui->groupBox_Tags->hide();
} else { } else {
ui->groupBox_Tags->show(); ui->groupBox_Tags->show();
} }
QMap<QString, int> recordCounts = QMap<QString, int>(); QMap<XAssetType, int> recordCounts = QMap<XAssetType, int>();
QVector<QPair<QString, int>> assetOccurances = QVector<QPair<QString, int>>(); QVector<QPair<XAssetType, int>> assetOccurances = QVector<QPair<XAssetType, int>>();
for (const QString &record : mZoneFile->GetRecords()) { for (XAssetType type : mZoneFile->GetTypes()) {
if (!recordCounts.contains(record)) { if (!recordCounts.contains(type)) {
recordCounts[record] = 0; recordCounts[type] = 0;
} }
recordCounts[record]++; recordCounts[type]++;
if (!assetOccurances.isEmpty() && assetOccurances.last().first == record) { if (!assetOccurances.isEmpty() && assetOccurances.last().first == type) {
assetOccurances.last().second++; assetOccurances.last().second++;
continue; continue;
} }
QPair<QString, int> assetOccurance(record, 1); QPair<XAssetType, int> assetOccurance(type, 1);
assetOccurances << assetOccurance; assetOccurances << assetOccurance;
} }
ui->tableWidget_RecordOrder->setRowCount(assetOccurances.size()); ui->tableWidget_RecordOrder->setRowCount(assetOccurances.size());
int assetIndex = 0; int assetIndex = 0;
foreach (auto assetOccurance, assetOccurances) { foreach (auto assetOccurance, assetOccurances) {
const QString record = assetOccurance.first; XAssetType assetType = assetOccurance.first;
AssetType assetType = mZoneFile->AssetStrToEnum(record); int assetCount = assetOccurance.second;
int assetCount = assetOccurance.second;
QIcon assetIcon = Utils::CreateAssetIcon(assetType);
QIcon assetIcon = mZoneFile->AssetTypeToIcon(assetType); if (assetIcon.isNull()) {
if (assetIcon.isNull()) { qDebug() << "Icon is null for record: " << assetType;
qDebug() << "Icon is null for record: " << record; }
}
QTableWidgetItem *recordItem = new QTableWidgetItem(QString::number(assetType, 16));
QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper()); QTableWidgetItem *recordStrItem = new QTableWidgetItem(XAsset::XAssetTypeToString(assetType));
QTableWidgetItem *recordStrItem = new QTableWidgetItem(mZoneFile->AssetEnumToStr(assetType)); QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(assetCount));
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(assetCount)); recordItem->setIcon(assetIcon);
recordItem->setIcon(assetIcon);
ui->tableWidget_RecordOrder->setItem(assetIndex, 0, recordItem);
ui->tableWidget_RecordOrder->setItem(assetIndex, 0, recordItem); ui->tableWidget_RecordOrder->setItem(assetIndex, 1, recordStrItem);
ui->tableWidget_RecordOrder->setItem(assetIndex, 1, recordStrItem); ui->tableWidget_RecordOrder->setItem(assetIndex, 2, recordCountItem);
ui->tableWidget_RecordOrder->setItem(assetIndex, 2, recordCountItem);
assetIndex++;
assetIndex++; }
}
int recordIndex = 0;
int recordIndex = 0; for (XAssetType assetType : recordCounts.keys()) {
for (const QString &record : recordCounts.keys()) { int recordCount = recordCounts[assetType];
int recordCount = recordCounts[record];
QIcon assetIcon = Utils::CreateAssetIcon(assetType);
AssetType assetType = mZoneFile->AssetStrToEnum(record); if (assetIcon.isNull()) {
QIcon assetIcon = mZoneFile->AssetTypeToIcon(assetType); qDebug() << "Icon is null for record: " << assetType;
if (assetIcon.isNull()) { }
qDebug() << "Icon is null for record: " << record;
} ui->tableWidget_RecordCounts->setRowCount(recordIndex + 1);
ui->tableWidget_RecordCounts->setRowCount(recordIndex + 1); QTableWidgetItem *recordItem = new QTableWidgetItem(QString::number(assetType, 16));
QTableWidgetItem *recordCountStrItem = new QTableWidgetItem(XAsset::XAssetTypeToString(assetType));
QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper()); QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(recordCount));
QTableWidgetItem *recordCountStrItem = new QTableWidgetItem(mZoneFile->AssetEnumToStr(assetType)); recordItem->setIcon(assetIcon);
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(recordCount));
recordItem->setIcon(assetIcon); ui->tableWidget_RecordCounts->setItem(recordIndex, 0, recordItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 1, recordCountStrItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 0, recordItem); ui->tableWidget_RecordCounts->setItem(recordIndex, 2, recordCountItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 1, recordCountStrItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 2, recordCountItem); recordIndex++;
}
recordIndex++;
} ui->tableWidget_RecordOrder->resizeColumnsToContents();
ui->tableWidget_RecordCounts->resizeColumnsToContents();
ui->tableWidget_RecordOrder->resizeColumnsToContents(); }
ui->tableWidget_RecordCounts->resizeColumnsToContents();
}

View File

@ -1,33 +1,33 @@
#ifndef ZONEFILEVIEWER_H #ifndef ZONEFILEVIEWER_H
#define ZONEFILEVIEWER_H #define ZONEFILEVIEWER_H
#include "zonefile.h" #include "zonefile.h"
#include "utils.h" #include "utils.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class ZoneFileViewer; class ZoneFileViewer;
} }
class ZoneFileViewer : public QWidget class ZoneFileViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ZoneFileViewer(QWidget *parent = nullptr); explicit ZoneFileViewer(QWidget *parent = nullptr);
~ZoneFileViewer(); ~ZoneFileViewer();
void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile); void SetZoneFile(const ZoneFile *aZoneFile);
public slots: public slots:
void SortTags(const QString &aSearchText); void SortTags(const QString &aSearchText);
void HighlightRecordInOrder(); void HighlightRecordInOrder();
private: private:
Ui::ZoneFileViewer *ui; Ui::ZoneFileViewer *ui;
std::shared_ptr<ZoneFile> mZoneFile; const ZoneFile* mZoneFile;
}; };
#endif // ZONEFILEVIEWER_H #endif // ZONEFILEVIEWER_H

View File

@ -1,129 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>ZoneFileViewer</class> <class>ZoneFileViewer</class>
<widget class="QWidget" name="ZoneFileViewer"> <widget class="QWidget" name="ZoneFileViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>556</width> <width>556</width>
<height>428</height> <height>428</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>ZoneFile 0</string> <string>ZoneFile 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QGroupBox" name="groupBox_Tags"> <widget class="QGroupBox" name="groupBox_Tags">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Tags</string> <string>Tags</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Search:</string> <string>Search:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="lineEdit_TagSearch"> <widget class="QLineEdit" name="lineEdit_TagSearch">
<property name="placeholderText"> <property name="placeholderText">
<string>Search tags...</string> <string>Search tags...</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QListWidget" name="listWidget_Tags"> <widget class="QListWidget" name="listWidget_Tags">
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set> <set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property> </property>
<property name="alternatingRowColors"> <property name="alternatingRowColors">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_RecordCounts"> <widget class="QGroupBox" name="groupBox_RecordCounts">
<property name="title"> <property name="title">
<string>Record Counts</string> <string>Record Counts</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_4">
<item> <item>
<widget class="QTableWidget" name="tableWidget_RecordCounts"> <widget class="QTableWidget" name="tableWidget_RecordCounts">
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set> <set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property> </property>
<property name="alternatingRowColors"> <property name="alternatingRowColors">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="selectionMode"> <property name="selectionMode">
<enum>QAbstractItemView::SelectionMode::SingleSelection</enum> <enum>QAbstractItemView::SelectionMode::SingleSelection</enum>
</property> </property>
<property name="selectionBehavior"> <property name="selectionBehavior">
<enum>QAbstractItemView::SelectionBehavior::SelectRows</enum> <enum>QAbstractItemView::SelectionBehavior::SelectRows</enum>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_RecordOrder"> <widget class="QGroupBox" name="groupBox_RecordOrder">
<property name="title"> <property name="title">
<string>Record Order</string> <string>Record Order</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>
<widget class="QTableWidget" name="tableWidget_RecordOrder"> <widget class="QTableWidget" name="tableWidget_RecordOrder">
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set> <set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property> </property>
<property name="alternatingRowColors"> <property name="alternatingRowColors">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="selectionMode"> <property name="selectionMode">
<enum>QAbstractItemView::SelectionMode::NoSelection</enum> <enum>QAbstractItemView::SelectionMode::NoSelection</enum>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,31 +1,31 @@
<RCC> <RCC>
<qresource prefix="/images"> <qresource prefix="/images">
<file>images/XPlor.png</file> <file>images/XPlor.png</file>
<file>images/copy.svg</file> <file>images/copy.svg</file>
<file>images/cut.svg</file> <file>images/cut.svg</file>
<file>images/multiple.png</file> <file>images/multiple.png</file>
<file>images/new_file.svg</file> <file>images/new_file.svg</file>
<file>images/open_file.svg</file> <file>images/open_file.svg</file>
<file>images/open_folder.svg</file> <file>images/open_folder.svg</file>
<file>images/paste.svg</file> <file>images/paste.svg</file>
<file>images/refresh.svg</file> <file>images/refresh.svg</file>
<file>images/save.svg</file> <file>images/save.svg</file>
</qresource> </qresource>
<qresource prefix="/icons"> <qresource prefix="/icons">
<file>icons/Icon_Pause.png</file> <file>icons/Icon_Pause.png</file>
<file>icons/Icon_Play.png</file> <file>icons/Icon_Play.png</file>
<file>icons/Icon_SkipBack.png</file> <file>icons/Icon_SkipBack.png</file>
<file>icons/Icon_SkipForward.png</file> <file>icons/Icon_SkipForward.png</file>
<file>icons/Icon_Stop.png</file> <file>icons/Icon_Stop.png</file>
<file>icons/Icon_Editor.png</file> <file>icons/Icon_Editor.png</file>
<file>icons/Icon_Views.png</file> <file>icons/Icon_Views.png</file>
<file>icons/Icon_Tree.png</file> <file>icons/Icon_Tree.png</file>
<file>icons/Icon_Copy.png</file> <file>icons/Icon_Copy.png</file>
<file>icons/Icon_Cut.png</file> <file>icons/Icon_Cut.png</file>
<file>icons/Icon_Find.png</file> <file>icons/Icon_Find.png</file>
<file>icons/Icon_NewFile.png</file> <file>icons/Icon_NewFile.png</file>
<file>icons/Icon_Paste.png</file> <file>icons/Icon_Paste.png</file>
<file>icons/Icon_Save.png</file> <file>icons/Icon_Save.png</file>
<file>icons/Icon_OpenFile.png</file> <file>icons/Icon_OpenFile.png</file>
</qresource> </qresource>
</RCC> </RCC>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 B

View File

@ -1,5 +1,5 @@
#include "compression.h" #include "compression.h"
#include "minilzo.h" //#include "minilzo.h"
#define XBOXAPI __declspec(dllimport) #define XBOXAPI __declspec(dllimport)
#include "xcompress.h" #include "xcompress.h"
@ -295,22 +295,23 @@ QByteArray Compression::CompressDeflateWithSettings(const QByteArray &aData, int
} }
QByteArray Compression::DecompressLZO(const QByteArray &aCompressedData, quint32 aDestSize) { QByteArray Compression::DecompressLZO(const QByteArray &aCompressedData, quint32 aDestSize) {
static bool ok = (lzo_init() == LZO_E_OK); QByteArray dst;
if (!ok) // static bool ok = (lzo_init() == LZO_E_OK);
throw std::runtime_error("lzo_init failed"); // if (!ok)
// throw std::runtime_error("lzo_init failed");
QByteArray dst(aDestSize, Qt::Uninitialized); // dst = QByteArray(aDestSize, Qt::Uninitialized);
lzo_uint out = aDestSize; // lzo_uint out = aDestSize;
int rc = lzo1x_decompress_safe( // int rc = lzo1x_decompress_safe(
reinterpret_cast<const lzo_bytep>(aCompressedData.constData()), // reinterpret_cast<const lzo_bytep>(aCompressedData.constData()),
static_cast<lzo_uint>(aCompressedData.size()), // static_cast<lzo_uint>(aCompressedData.size()),
reinterpret_cast<lzo_bytep>(dst.data()), // reinterpret_cast<lzo_bytep>(dst.data()),
&out, // &out,
nullptr); // nullptr);
if (rc != LZO_E_OK || out != aDestSize) // if (rc != LZO_E_OK || out != aDestSize)
throw std::runtime_error("LZO decompression error"); // throw std::runtime_error("LZO decompression error");
return dst; return dst;
} }

View File

@ -3,15 +3,8 @@ TEMPLATE = lib
CONFIG += staticlib c++17 CONFIG += staticlib c++17
DEFINES += MINILZO_USE_STATIC DEFINES += MINILZO_USE_STATIC
SOURCES += \ SOURCES += $$files($$PWD/*.cpp, true)
compression.cpp \ HEADERS += $$files($$PWD/*.h, true)
minilzo.c \
lzoconf.h \
lzodefs.h
HEADERS += \
compression.h \
minilzo.h
LIBS += \ LIBS += \
-L$$PWD/../../third_party/xbox_sdk/lib -lxcompress64 \ -L$$PWD/../../third_party/xbox_sdk/lib -lxcompress64 \

View File

@ -2,23 +2,13 @@ QT += core widgets
TEMPLATE = lib TEMPLATE = lib
CONFIG += staticlib c++17 CONFIG += staticlib c++17
SOURCES += \ SOURCES += $$files($$PWD/*.cpp, true)
highlighter_cfg.cpp \ HEADERS += $$files($$PWD/*.h, true)
highlighter_shock.cpp \
highlighter_rumble.cpp \
highlighter_gsc.cpp \
logmanager.cpp \
statusbarmanager.cpp
HEADERS += \ LIBS += -L$$OUT_PWD/../libs/xassets -lxassets
enums.h \
highlighter_cfg.h \ INCLUDEPATH += $$PWD/../xassets
highlighter_shock.h \
highlighter_rumble.h \ DEPENDPATH += $$PWD/../xassets
highlighter_gsc.h \
logmanager.h \
stringutils.h \
utils.h \
statusbarmanager.h
DESTDIR = $$OUT_PWD/../ DESTDIR = $$OUT_PWD/../

View File

@ -3,28 +3,6 @@
#include <QString> #include <QString>
enum FF_PLATFORM {
FF_PLATFORM_NONE = 0x00, // No platform
FF_PLATFORM_XBOX = 0x01, // Xbox 360
FF_PLATFORM_PS3 = 0x02, // Playstation 3
FF_PLATFORM_PC = 0x03, // PC
FF_PLATFORM_WII = 0x04, // WII
FF_PLATFORM_WIIU = 0x05 // WII U
};
enum FF_GAME {
FF_GAME_NONE = 0x00, // No game
FF_GAME_COD1 = 0x01, // Call of Duty
FF_GAME_COD2 = 0x02, // Call of Duty 2
FF_GAME_COD3 = 0x03, // Call of Duty 3
FF_GAME_COD4 = 0x04, // Modern Warware 1
FF_GAME_COD5 = 0x05, // World at War
FF_GAME_COD6 = 0x06, // Modern Warfare 2
FF_GAME_COD7 = 0x07, // Black Ops 1
FF_GAME_COD8 = 0x08, // Modern Warfare 3
FF_GAME_COD9 = 0x09, // Black Ops 2
};
enum IWI_VERSION { enum IWI_VERSION {
IWI_VERSION_COD2 = 0x05, // 05 CoD2 IWI_VERSION_COD2 = 0x05, // 05 CoD2
IWI_VERSION_COD4 = 0x06, // 06 CoD4 IWI_VERSION_COD4 = 0x06, // 06 CoD4
@ -432,7 +410,7 @@ enum MENU_FONT_TYPE{
UI_FONT_DEFAULT = 0, // auto-chose betwen big/reg/small UI_FONT_DEFAULT = 0, // auto-chose betwen big/reg/small
UI_FONT_NORMAL = 1, UI_FONT_NORMAL = 1,
UI_FONT_BIG = 2, UI_FONT_BIG = 2,
UI_FONT_SMALL = 3, UI_GameFontMALL = 3,
UI_FONT_BOLD = 4, UI_FONT_BOLD = 4,
UI_FONT_CONSOLE = 5, UI_FONT_CONSOLE = 5,
UI_FONT_OBJECTIVE = 6, UI_FONT_OBJECTIVE = 6,

View File

@ -2,15 +2,19 @@
#define UTILS_H #define UTILS_H
#include "enums.h" #include "enums.h"
#include "QtZlib/zlib.h"
#include "qdir.h"
#include "qicon.h"
#include "xasset.h"
#include "xassettype.h"
#include <QString> #include <QMetaEnum>
#include <QtZlib/zlib.h>
#include <QFileDialog>
#include <QMessageBox>
#include <QPainter> #include <QPainter>
#include <QCryptographicHash> #include <QCryptographicHash>
class Utils { class Utils : public QObject {
Q_OBJECT
public: public:
static bool ExportData(const QString aFileName, const QByteArray aData) { static bool ExportData(const QString aFileName, const QByteArray aData) {
QDir workingDir = QDir::currentPath(); QDir workingDir = QDir::currentPath();
@ -30,6 +34,29 @@ public:
b = (b & 0xAA) >> 1 | (b & 0x55) << 1; b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
return b; return b;
} }
static QIcon CreateAssetIcon(XAssetType aAssetType, QColor color = QColor()) {
const QString assetTypeStr = XAsset::XAssetTypeToString(aAssetType);
QString assetAbbr;
for (int i = 0; i < assetTypeStr.length(); i++)
{
if (assetTypeStr[i].isUpper())
{
assetAbbr += assetTypeStr[i];
}
}
return CreateAssetIcon(assetAbbr, color);
// QString name;
// const QStringList parts = assetTypeStr.split('_').mid(1);
// foreach (const QString part, parts) {
// name += part[0];
// }
// if (parts.size() == 1) {
// name += parts.first()[1];
// }
// return CreateAssetIcon(name, color);
}
static QIcon CreateAssetIcon(const QString& name, QColor color = QColor()) { static QIcon CreateAssetIcon(const QString& name, QColor color = QColor()) {
constexpr int iconSize = 32; constexpr int iconSize = 32;
constexpr int padding = 4; constexpr int padding = 4;
@ -380,34 +407,6 @@ public:
return PadInt4(size) - size; return PadInt4(size) - size;
} }
static QString GetOpenFastFileName(QWidget *parent = nullptr) {
// Open file dialog to steam apps
const QString steamPath = "C:/Program Files (x86)/Steam/steamapps/common/Call of Duty World at War/zone/english/";
const QString fastFilePath = QFileDialog::getOpenFileName(parent, "Open Fast File", steamPath, "Fast File (*.ff);;All Files (*.*)");
if (fastFilePath.isNull()) {
// User pressed cancel
return "";
} else if (!QFile::exists(fastFilePath)) {
QMessageBox::warning(parent, "Warning!", QString("%1 does not exist!.").arg(fastFilePath));
return "";
}
return fastFilePath;
}
static QString GetOpenZoneFileName(QWidget *parent = nullptr) {
// Open file dialog to steam apps
const QString steamPath = "C:/Program Files (x86)/Steam/steamapps/common/Call of Duty World at War/zone/english/";
const QString zoneFilePath = QFileDialog::getOpenFileName(parent, "Open Zone File", steamPath, "Zone File (*.zone);;All Files (*.*)");
if (zoneFilePath.isNull()) {
// User pressed cancel
return "";
} else if (!QFile::exists(zoneFilePath)) {
QMessageBox::warning(parent, "Warning!", QString("%1 does not exist!.").arg(zoneFilePath));
return nullptr;
}
return zoneFilePath;
}
static QString CompanyEnumToStr(FF_COMPANY aCompany) { static QString CompanyEnumToStr(FF_COMPANY aCompany) {
switch (aCompany) { switch (aCompany) {
case COMPANY_NONE: case COMPANY_NONE:

View File

@ -35,7 +35,7 @@ DDSPixelFormat DDSFile::CalculatePixelFormat(quint8 aIWIFormat) {
return ddsPixelFormat; return ddsPixelFormat;
} }
void DDSFile::SetupExportDirs() { void DDSFile::SetupExportDirs() const {
QDir dir = QDir::currentPath(); QDir dir = QDir::currentPath();
if (!dir.exists("exports/")) { if (!dir.exists("exports/")) {
dir.mkdir("exports/"); dir.mkdir("exports/");
@ -248,7 +248,7 @@ DDSFile &DDSFile::operator=(const DDSFile &other) {
} }
// Write a DDS file from a DDSFile object // Write a DDS file from a DDSFile object
bool DDSFile::SaveDDS() { bool DDSFile::SaveDDS() const {
SetupExportDirs(); SetupExportDirs();
QFile file("exports/dds/" + fileStem + ".dds"); QFile file("exports/dds/" + fileStem + ".dds");
@ -268,7 +268,7 @@ bool DDSFile::SaveDDS() {
return true; return true;
} }
bool DDSFile::SaveIWI() { bool DDSFile::SaveIWI() const {
SetupExportDirs(); SetupExportDirs();
IWIFile iwiFile(*this); IWIFile iwiFile(*this);
@ -279,7 +279,7 @@ bool DDSFile::SaveIWI() {
return true; return true;
} }
bool DDSFile::SavePNG() { bool DDSFile::SavePNG() const {
SetupExportDirs(); SetupExportDirs();
int mipmapIndex = 1; int mipmapIndex = 1;
@ -311,7 +311,7 @@ bool DDSFile::SavePNG() {
return true; return true;
} }
bool DDSFile::SaveJPG() { bool DDSFile::SaveJPG() const {
SetupExportDirs(); SetupExportDirs();
int mipmapIndex = 1; int mipmapIndex = 1;

View File

@ -68,12 +68,12 @@ public:
DDSFile(const DDSFile &ddsFile); DDSFile(const DDSFile &ddsFile);
DDSFile& operator=(const DDSFile& other); DDSFile& operator=(const DDSFile& other);
bool SaveDDS(); bool SaveDDS() const;
bool SaveIWI(); bool SaveIWI() const;
bool SavePNG(); bool SavePNG() const;
bool SaveJPG(); bool SaveJPG() const;
void SetupExportDirs(); void SetupExportDirs() const;
static DDSPixelFormat CalculatePixelFormat(quint8 aIWIFormat); static DDSPixelFormat CalculatePixelFormat(quint8 aIWIFormat);
private: private:

View File

@ -2,13 +2,8 @@ QT += core
TEMPLATE = lib TEMPLATE = lib
CONFIG += staticlib c++17 CONFIG += staticlib c++17
SOURCES += \ SOURCES += $$files($$PWD/*.cpp, true)
ddsfile.cpp HEADERS += $$files($$PWD/*.h, true)
HEADERS += \
dds_structs.h \
ddsfile.h \
enums.h
LIBS += \ LIBS += \
-L$$PWD/../../third_party/devil_sdk/lib/ -lDevIL \ -L$$PWD/../../third_party/devil_sdk/lib/ -lDevIL \

View File

@ -430,7 +430,7 @@ enum MENU_FONT_TYPE{
UI_FONT_DEFAULT = 0, // auto-chose betwen big/reg/small UI_FONT_DEFAULT = 0, // auto-chose betwen big/reg/small
UI_FONT_NORMAL = 1, UI_FONT_NORMAL = 1,
UI_FONT_BIG = 2, UI_FONT_BIG = 2,
UI_FONT_SMALL = 3, UI_GameFontMALL = 3,
UI_FONT_BOLD = 4, UI_FONT_BOLD = 4,
UI_FONT_CONSOLE = 5, UI_FONT_CONSOLE = 5,
UI_FONT_OBJECTIVE = 6, UI_FONT_OBJECTIVE = 6,

View File

@ -2,20 +2,8 @@ QT += core
TEMPLATE = lib TEMPLATE = lib
CONFIG += staticlib c++17 CONFIG += staticlib c++17
SOURCES += \ SOURCES += $$files($$PWD/*.cpp, true)
salsa20.cpp \ HEADERS += $$files($$PWD/*.h, true)
sha1.cpp \
encryption.cpp
HEADERS += \
ecrypt-config.h \
ecrypt-machine.h \
ecrypt-portable.h \
ecrypt-sync.h \
encryption.h \
os_types.h \
config_win32.h \
sha1.h
app.depends += \ app.depends += \
compression compression

View File

@ -36,7 +36,7 @@ FastFile_COD10_360::~FastFile_COD10_360() {
} }
QByteArray FastFile_COD10_360::GetBinaryData() { QByteArray FastFile_COD10_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -106,10 +106,13 @@ bool FastFile_COD10_360::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD10_360 zoneFile; ZoneFile_COD10_360* zoneFile = new ZoneFile_COD10_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD10_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD10_360(const QString aFilePath); FastFile_COD10_360(const QString aFilePath);
~FastFile_COD10_360(); ~FastFile_COD10_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -38,7 +38,7 @@ FastFile_COD11_360::~FastFile_COD11_360() {
} }
QByteArray FastFile_COD11_360::GetBinaryData() { QByteArray FastFile_COD11_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -94,14 +94,13 @@ bool FastFile_COD11_360::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
// Load the zone file with decompressed data // Load the zone file with decompressed data
ZoneFile_COD11_360 zoneFile; ZoneFile_COD11_360* zoneFile = new ZoneFile_COD11_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
if (!zoneFile.Load(decompressedData)) { if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!"; qWarning() << "Failed to load ZoneFile!";
return false; return false;
} }
SetZoneFile(zoneFile);
SetZoneFile(std::make_shared<ZoneFile_COD11_360>(zoneFile));
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD11_360(const QString aFilePath); FastFile_COD11_360(const QString aFilePath);
~FastFile_COD11_360(); ~FastFile_COD11_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -38,7 +38,7 @@ FastFile_COD12_360::~FastFile_COD12_360() {
} }
QByteArray FastFile_COD12_360::GetBinaryData() { QByteArray FastFile_COD12_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -94,14 +94,13 @@ bool FastFile_COD12_360::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
// Load the zone file with decompressed data // Load the zone file with decompressed data
ZoneFile_COD12_360 zoneFile; ZoneFile_COD12_360* zoneFile = new ZoneFile_COD12_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
if (!zoneFile.Load(decompressedData)) { if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!"; qWarning() << "Failed to load ZoneFile!";
return false; return false;
} }
SetZoneFile(zoneFile);
SetZoneFile(std::make_shared<ZoneFile_COD12_360>(zoneFile));
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD12_360(const QString aFilePath); FastFile_COD12_360(const QString aFilePath);
~FastFile_COD12_360(); ~FastFile_COD12_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -38,7 +38,7 @@ FastFile_COD2_360::~FastFile_COD2_360() {
} }
QByteArray FastFile_COD2_360::GetBinaryData() { QByteArray FastFile_COD2_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -79,10 +79,13 @@ bool FastFile_COD2_360::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD2_360 zoneFile; ZoneFile_COD2_360* zoneFile = new ZoneFile_COD2_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD2_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD2_360(const QString aFilePath); FastFile_COD2_360(const QString aFilePath);
~FastFile_COD2_360(); ~FastFile_COD2_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD4_360::~FastFile_COD4_360() {
} }
QByteArray FastFile_COD4_360::GetBinaryData() { QByteArray FastFile_COD4_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -126,14 +126,15 @@ bool FastFile_COD4_360::Load(const QByteArray aData) {
} }
decompressedData = Compression::DecompressZLIB(compressedData); decompressedData = Compression::DecompressZLIB(compressedData);
} }
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD4_360 zoneFile; ZoneFile_COD4_360* zoneFile = new ZoneFile_COD4_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD4_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD4_360(const QString aFilePath); FastFile_COD4_360(const QString aFilePath);
~FastFile_COD4_360(); ~FastFile_COD4_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD5_360::~FastFile_COD5_360() {
} }
QByteArray FastFile_COD5_360::GetBinaryData() { QByteArray FastFile_COD5_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -80,10 +80,13 @@ bool FastFile_COD5_360::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
ZoneFile_COD5_360 zoneFile; ZoneFile_COD5_360* zoneFile = new ZoneFile_COD5_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD5_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD5_360(const QString aFilePath); FastFile_COD5_360(const QString aFilePath);
~FastFile_COD5_360(); ~FastFile_COD5_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD6_360::~FastFile_COD6_360() {
} }
QByteArray FastFile_COD6_360::GetBinaryData() { QByteArray FastFile_COD6_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -78,31 +78,30 @@ bool FastFile_COD6_360::Load(const QByteArray aData) {
} }
QByteArray compressed = aData.mid(zlibOffset); QByteArray compressed = aData.mid(zlibOffset);
// 2. Try plain decompression first ------------------------------ QByteArray decompressedData = Compression::DecompressZLIB(compressed);
QByteArray decompressed = Compression::DecompressZLIB(compressed);
// 3. If that failed or looks too small, try stripping hash blocks if (decompressedData.isEmpty() || decompressedData.size() < 1024)
if (decompressed.isEmpty() || decompressed.size() < 1024)
{ {
QByteArray stripped = Compression::StripHashBlocks(compressed); QByteArray stripped = Compression::StripHashBlocks(compressed);
QByteArray retry = Compression::DecompressZLIB(stripped); QByteArray retry = Compression::DecompressZLIB(stripped);
if (!retry.isEmpty()) if (!retry.isEmpty())
decompressed.swap(retry); decompressedData.swap(retry);
} }
if (decompressed.isEmpty()) if (decompressedData.isEmpty())
{ {
qWarning() << "Unable to decompress fast-file"; qWarning() << "Unable to decompress fast-file";
return false; return false;
} }
// Optional keep a copy on disk for quick inspection Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
Utils::ExportData(GetBaseStem() + ".zone", decompressed);
// 4. Forward to zone-file loader -------------------------------- ZoneFile_COD6_360* zoneFile = new ZoneFile_COD6_360();
auto zoneFile = std::make_shared<ZoneFile_COD6_360>(); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile->SetStem(GetStem()); if (!zoneFile->Load(decompressedData)) {
zoneFile->Load(decompressed); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile); SetZoneFile(zoneFile);
return true; return true;

View File

@ -11,7 +11,7 @@ public:
FastFile_COD6_360(const QString aFilePath); FastFile_COD6_360(const QString aFilePath);
~FastFile_COD6_360(); ~FastFile_COD6_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -38,7 +38,7 @@ FastFile_COD7_360::~FastFile_COD7_360() {
} }
QByteArray FastFile_COD7_360::GetBinaryData() { QByteArray FastFile_COD7_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -73,10 +73,7 @@ bool FastFile_COD7_360::Load(const QByteArray aData) {
// Create a QDataStream on the input data. // Create a QDataStream on the input data.
QDataStream fastFileStream(aData); QDataStream fastFileStream(aData);
fastFileStream.skipRawData(12);
// Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD7_360 zoneFile;
zoneFile.SetStem(GetBaseStem() + ".zone");
// For COD7/COD9, use BigEndian. // For COD7/COD9, use BigEndian.
fastFileStream.setByteOrder(QDataStream::BigEndian); fastFileStream.setByteOrder(QDataStream::BigEndian);
@ -142,10 +139,15 @@ bool FastFile_COD7_360::Load(const QByteArray aData) {
sectionIndex++; sectionIndex++;
} }
Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
zoneFile.Load(decompressedData); ZoneFile_COD7_360* zoneFile = new ZoneFile_COD7_360();
zoneFile->SetStem(GetBaseStem() + ".zone");
SetZoneFile(std::make_shared<ZoneFile_COD7_360>(zoneFile)); if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD7_360(const QString aFilePath); FastFile_COD7_360(const QString aFilePath);
~FastFile_COD7_360(); ~FastFile_COD7_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD8_360::~FastFile_COD8_360() {
} }
QByteArray FastFile_COD8_360::GetBinaryData() { QByteArray FastFile_COD8_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -106,10 +106,13 @@ bool FastFile_COD8_360::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD8_360 zoneFile; ZoneFile_COD8_360* zoneFile = new ZoneFile_COD8_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD8_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD8_360(const QString aFilePath); FastFile_COD8_360(const QString aFilePath);
~FastFile_COD8_360(); ~FastFile_COD8_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD9_360::~FastFile_COD9_360() {
} }
QByteArray FastFile_COD9_360::GetBinaryData() { QByteArray FastFile_COD9_360::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -106,10 +106,13 @@ bool FastFile_COD9_360::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD9_360 zoneFile; ZoneFile_COD9_360* zoneFile = new ZoneFile_COD9_360();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD9_360>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD9_360(const QString aFilePath); FastFile_COD9_360(const QString aFilePath);
~FastFile_COD9_360(); ~FastFile_COD9_360();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD10_PC::~FastFile_COD10_PC() {
} }
QByteArray FastFile_COD10_PC::GetBinaryData() { QByteArray FastFile_COD10_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -128,10 +128,13 @@ bool FastFile_COD10_PC::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD10_PC zoneFile; ZoneFile_COD10_PC* zoneFile = new ZoneFile_COD10_PC();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD10_PC>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD10_PC(const QString aFilePath); FastFile_COD10_PC(const QString aFilePath);
~FastFile_COD10_PC(); ~FastFile_COD10_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -36,7 +36,7 @@ FastFile_COD11_PC::~FastFile_COD11_PC() {
} }
QByteArray FastFile_COD11_PC::GetBinaryData() { QByteArray FastFile_COD11_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -128,10 +128,13 @@ bool FastFile_COD11_PC::Load(const QByteArray aData) {
} }
// Load the zone file with the decompressed data (using an Xbox platform flag). // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD11_PC zoneFile; ZoneFile_COD11_PC* zoneFile = new ZoneFile_COD11_PC();
zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile->SetStem(GetBaseStem() + ".zone");
zoneFile.Load(decompressedData); if (!zoneFile->Load(decompressedData)) {
SetZoneFile(std::make_shared<ZoneFile_COD11_PC>(zoneFile)); qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

View File

@ -11,7 +11,7 @@ public:
FastFile_COD11_PC(const QString aFilePath); FastFile_COD11_PC(const QString aFilePath);
~FastFile_COD11_PC(); ~FastFile_COD11_PC();
QByteArray GetBinaryData() override; QByteArray GetBinaryData() const override;
bool Load(const QString aFilePath) override; bool Load(const QString aFilePath) override;
bool Load(const QByteArray aData) override; bool Load(const QByteArray aData) override;

View File

@ -39,7 +39,7 @@ FastFile_COD12_PC::~FastFile_COD12_PC() {
} }
QByteArray FastFile_COD12_PC::GetBinaryData() { QByteArray FastFile_COD12_PC::GetBinaryData() const {
return QByteArray(); return QByteArray();
} }
@ -76,10 +76,6 @@ bool FastFile_COD12_PC::Load(const QByteArray aData) {
QDataStream fastFileStream(aData); QDataStream fastFileStream(aData);
fastFileStream.setByteOrder(QDataStream::LittleEndian); fastFileStream.setByteOrder(QDataStream::LittleEndian);
// Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD12_PC zoneFile;
zoneFile.SetStem(GetBaseStem() + ".zone");
// Skip header magic // Skip header magic
fastFileStream.skipRawData(8); fastFileStream.skipRawData(8);
@ -143,9 +139,14 @@ bool FastFile_COD12_PC::Load(const QByteArray aData) {
Utils::ExportData(GetBaseStem() + ".zone", decompressedData); Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
zoneFile.Load(decompressedData); // Load the zone file with the decompressed data (using an Xbox platform flag).
ZoneFile_COD12_PC* zoneFile = new ZoneFile_COD12_PC();
SetZoneFile(std::make_shared<ZoneFile_COD12_PC>(zoneFile)); zoneFile->SetStem(GetBaseStem() + ".zone");
if (!zoneFile->Load(decompressedData)) {
qWarning() << "Failed to load ZoneFile!";
return false;
}
SetZoneFile(zoneFile);
return true; return true;
} }

Some files were not shown because too many files have changed in this diff Show More