Compare commits
No commits in common. "main" and "feature/icon_factory" have entirely different histories.
main
...
feature/ic
37
.gitignore
vendored
37
.gitignore
vendored
@ -1,25 +1,12 @@
|
|||||||
/build/
|
/build/
|
||||||
/data/dlls/
|
/data/dlls/
|
||||||
/data/fastfiles/
|
/data/fastfiles/
|
||||||
/releases/
|
|
||||||
|
# Ignore Qt Creator user files
|
||||||
.vscode/*
|
*.pro.user
|
||||||
.qmake.stash
|
*.pro.user.*
|
||||||
|
*.qbs.user
|
||||||
# Ignore Qt Creator user files
|
*.qbs.user.*
|
||||||
*.pro.user
|
*.creator.user
|
||||||
*.pro.user.*
|
*.creator.user.*
|
||||||
*.qbs.user
|
*.creator.*
|
||||||
*.qbs.user.*
|
|
||||||
*.creator.user
|
|
||||||
*.creator.user.*
|
|
||||||
*.creator.*
|
|
||||||
*.ps1
|
|
||||||
version.txt
|
|
||||||
*.autosave
|
|
||||||
*.XMODEL_EXPORT
|
|
||||||
data/obj/*
|
|
||||||
libs/*/release/*
|
|
||||||
libs/*/debug/*
|
|
||||||
.git.stash
|
|
||||||
*Makefile*
|
|
||||||
20
XPlor.pro
20
XPlor.pro
@ -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
|
||||||
|
|||||||
36
ai-commit.sh
36
ai-commit.sh
@ -1,36 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# 1. Stage everything
|
|
||||||
git add -A
|
|
||||||
|
|
||||||
# 2. Get list of staged files
|
|
||||||
FILES=$(git diff --cached --name-only)
|
|
||||||
|
|
||||||
if [ -z "$FILES" ]; then
|
|
||||||
echo "No changes to commit."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 3. Loop file by file
|
|
||||||
for FILE in $FILES; do
|
|
||||||
# Get diff for this file
|
|
||||||
DIFF=$(git diff --cached -- "$FILE")
|
|
||||||
|
|
||||||
if [ -z "$DIFF" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ask Ollama for a commit message describing this file change
|
|
||||||
MSG=$(echo "$DIFF" | ollama run gemma3 \
|
|
||||||
"You are a commit bot. Write a SHORT, clear, concise Git commit message for changes in file: $FILE.
|
|
||||||
Only output the commit message, nothing else.
|
|
||||||
Diff:
|
|
||||||
$DIFF")
|
|
||||||
|
|
||||||
# Commit just this file with its message
|
|
||||||
git commit -m "$MSG" -- "$FILE"
|
|
||||||
|
|
||||||
echo "✅ Committed $FILE with message:"
|
|
||||||
echo "$MSG"
|
|
||||||
done
|
|
||||||
402
app/LICENSE
402
app/LICENSE
@ -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.
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
179
app/app.pro
179
app/app.pro
@ -1,61 +1,118 @@
|
|||||||
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 += $$files($$PWD/*.cpp)
|
SOURCES += \
|
||||||
HEADERS += $$files($$PWD/*.h)
|
aboutdialog.cpp \
|
||||||
FORMS += $$files($$PWD/*.ui)
|
ddsviewer.cpp \
|
||||||
|
fastfileviewer.cpp \
|
||||||
RESOURCES += ../data/data.qrc
|
imagewidget.cpp \
|
||||||
|
iwiviewer.cpp \
|
||||||
LIBS += \
|
localstringviewer.cpp \
|
||||||
-L$$PWD/../third_party/devil_sdk/lib/ -lDevIL -lILU -lILUT \
|
main.cpp \
|
||||||
-L$$PWD/../third_party/zlib/lib/ -lzlib \
|
mainwindow.cpp \
|
||||||
-L$$PWD/../third_party/xbox_sdk/lib -lxcompress64 \
|
materialviewer.cpp \
|
||||||
-L$$OUT_PWD/../libs/ -lcore \
|
preferenceeditor.cpp \
|
||||||
-L$$OUT_PWD/../libs/ -lxassets\
|
soundviewer.cpp \
|
||||||
-L$$OUT_PWD/../libs/ -lcompression \
|
stringtableviewer.cpp \
|
||||||
-L$$OUT_PWD/../libs/ -lencryption \
|
rumblegraphviewer.cpp \
|
||||||
-L$$OUT_PWD/../libs/ -lfastfile \
|
rumblefileviewer.cpp \
|
||||||
-L$$OUT_PWD/../libs/ -lddsfile \
|
techsetviewer.cpp \
|
||||||
-L$$OUT_PWD/../libs/ -lipakfile \
|
xtreewidget.cpp \
|
||||||
-L$$OUT_PWD/../libs/ -liwifile \
|
xtreewidgetitem.cpp \
|
||||||
-L$$OUT_PWD/../libs/ -lzonefile
|
zonefileviewer.cpp
|
||||||
|
|
||||||
INCLUDEPATH += \
|
HEADERS += \
|
||||||
$$PWD/../third_party/devil_sdk/include/ \
|
aboutdialog.h \
|
||||||
$$PWD/../third_party/zlib/include \
|
d3dbsp_structs.h \
|
||||||
$$PWD/../third_party/xbox_sdk/include \
|
ddsviewer.h \
|
||||||
$$PWD/../libs/core \
|
fastfileviewer.h \
|
||||||
$$PWD/../libs/compression \
|
imagewidget.h \
|
||||||
$$PWD/../libs/encryption \
|
iwiviewer.h \
|
||||||
$$PWD/../libs/fastfile \
|
localstringviewer.h \
|
||||||
$$PWD/../libs/ddsfile \
|
mainwindow.h \
|
||||||
$$PWD/../libs/ipakfile \
|
materialviewer.h \
|
||||||
$$PWD/../libs/iwifile \
|
preferenceeditor.h \
|
||||||
$$PWD/../libs/xassets \
|
soundviewer.h \
|
||||||
$$PWD/../libs/zonefile
|
stringtableviewer.h \
|
||||||
|
rumblegraphviewer.h \
|
||||||
DEPENDPATH += \
|
rumblefileviewer.h \
|
||||||
$$PWD/../third_party/devil_sdk/include/ \
|
techsetviewer.h \
|
||||||
$$PWD/../third_party/zlib/include \
|
xtreewidget.h \
|
||||||
$$PWD/../third_party/xbox_sdk/include \
|
xtreewidgetitem.h \
|
||||||
$$PWD/../libs/core \
|
zonefileviewer.h
|
||||||
$$PWD/../libs/compression \
|
|
||||||
$$PWD/../libs/encryption \
|
FORMS += \
|
||||||
$$PWD/../libs/fastfile \
|
aboutdialog.ui \
|
||||||
$$PWD/../libs/ddsfile \
|
ddsviewer.ui \
|
||||||
$$PWD/../libs/ipakfile \
|
fastfileviewer.ui \
|
||||||
$$PWD/../libs/iwifile \
|
imagewidget.ui \
|
||||||
$$PWD/../libs/xassets \
|
iwiviewer.ui \
|
||||||
$$PWD/../libs/zonefile
|
localstringviewer.ui \
|
||||||
|
mainwindow.ui \
|
||||||
|
materialviewer.ui \
|
||||||
win32 {
|
modelviewer.ui \
|
||||||
QMAKE_POST_LINK =
|
preferenceeditor.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)
|
soundviewer.ui \
|
||||||
}
|
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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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(const DDSFile* aDDSFile) {
|
void DDSViewer::SetDDSFile(std::shared_ptr<DDSFile> aDDSFile) {
|
||||||
mDDSFile = aDDSFile;
|
mDDSFile.swap(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 you’re using Qt and want a QString:
|
// If you’re 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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(const DDSFile *aDDSFile);
|
void SetDDSFile(std::shared_ptr<DDSFile> aDDSFile);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void MipmapIndexChanged(int aMipmapIndex);
|
void MipmapIndexChanged(int aMipmapIndex);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::DDSViewer *ui;
|
Ui::DDSViewer *ui;
|
||||||
const DDSFile* mDDSFile;
|
std::shared_ptr<DDSFile> mDDSFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DDSVIEWER_H
|
#endif // DDSVIEWER_H
|
||||||
|
|||||||
3424
app/ddsviewer.ui
3424
app/ddsviewer.ui
File diff suppressed because it is too large
Load Diff
@ -1,26 +1,27 @@
|
|||||||
#include "fastfileviewer.h"
|
#include "fastfileviewer.h"
|
||||||
#include "ui_fastfileviewer.h"
|
#include "asset_structs.h"
|
||||||
|
#include "ui_fastfileviewer.h"
|
||||||
FastFileViewer::FastFileViewer(QWidget *parent)
|
|
||||||
: QWidget(parent)
|
FastFileViewer::FastFileViewer(QWidget *parent)
|
||||||
, ui(new Ui::FFViewer)
|
: QWidget(parent)
|
||||||
, mFastFile(nullptr)
|
, ui(new Ui::FFViewer)
|
||||||
{
|
, mFastFile(nullptr)
|
||||||
ui->setupUi(this);
|
{
|
||||||
}
|
ui->setupUi(this);
|
||||||
|
}
|
||||||
FastFileViewer::~FastFileViewer()
|
|
||||||
{
|
FastFileViewer::~FastFileViewer()
|
||||||
delete ui;
|
{
|
||||||
}
|
delete ui;
|
||||||
|
}
|
||||||
void FastFileViewer::SetFastFile(const FastFile* aFastFile) {
|
|
||||||
mFastFile = aFastFile;
|
void FastFileViewer::SetFastFile(std::shared_ptr<FastFile> aFastFile) {
|
||||||
|
mFastFile.swap(aFastFile);
|
||||||
ui->label_Title->setText(mFastFile->GetStem());
|
|
||||||
ui->comboBox_Company->setCurrentIndex(mFastFile->GetCompany());
|
ui->label_Title->setText(mFastFile->GetStem());
|
||||||
ui->comboBox_FileType->setCurrentIndex(mFastFile->GetType());
|
ui->comboBox_Company->setCurrentIndex(mFastFile->GetCompany());
|
||||||
ui->checkBox_Signed->setChecked(mFastFile->GetSignage() == SIGNAGE_SIGNED);
|
ui->comboBox_FileType->setCurrentIndex(mFastFile->GetType());
|
||||||
ui->lineEdit_Magic->setText(mFastFile->GetMagic());
|
ui->checkBox_Signed->setChecked(mFastFile->GetSignage() == SIGNAGE_SIGNED);
|
||||||
ui->spinBox_Version->setValue(mFastFile->GetVersion());
|
ui->lineEdit_Magic->setText(mFastFile->GetMagic());
|
||||||
}
|
ui->spinBox_Version->setValue(mFastFile->GetVersion());
|
||||||
|
}
|
||||||
|
|||||||
@ -1,25 +1,26 @@
|
|||||||
#ifndef FASTFILEVIEWER_H
|
#ifndef FASTFILEVIEWER_H
|
||||||
#define FASTFILEVIEWER_H
|
#define FASTFILEVIEWER_H
|
||||||
|
|
||||||
#include "fastfile.h"
|
#include "asset_structs.h"
|
||||||
#include <QWidget>
|
#include "fastfile.h"
|
||||||
|
#include <QWidget>
|
||||||
namespace Ui {
|
|
||||||
class FFViewer;
|
namespace Ui {
|
||||||
}
|
class FFViewer;
|
||||||
|
}
|
||||||
class FastFileViewer : public QWidget
|
|
||||||
{
|
class FastFileViewer : public QWidget
|
||||||
Q_OBJECT
|
{
|
||||||
|
Q_OBJECT
|
||||||
public:
|
|
||||||
explicit FastFileViewer(QWidget *parent = nullptr);
|
public:
|
||||||
~FastFileViewer();
|
explicit FastFileViewer(QWidget *parent = nullptr);
|
||||||
|
~FastFileViewer();
|
||||||
void SetFastFile(const FastFile *aFastFile);
|
|
||||||
private:
|
void SetFastFile(std::shared_ptr<FastFile> aFastFile);
|
||||||
Ui::FFViewer *ui;
|
private:
|
||||||
const FastFile* mFastFile;
|
Ui::FFViewer *ui;
|
||||||
};
|
std::shared_ptr<FastFile> mFastFile;
|
||||||
|
};
|
||||||
#endif // FASTFILEVIEWER_H
|
|
||||||
|
#endif // FASTFILEVIEWER_H
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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<QImage> aImage)
|
void ImageWidget::SetImage(std::shared_ptr<Image> 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<QImage> ImageWidget::GetImage()
|
std::shared_ptr<Image> ImageWidget::GetImage()
|
||||||
{
|
{
|
||||||
return mImage;
|
return mImage;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,31 +1,32 @@
|
|||||||
#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 "ipak_structs.h"
|
#include "asset_structs.h"
|
||||||
|
#include "ipak_structs.h"
|
||||||
#include <QWidget>
|
|
||||||
|
#include <QWidget>
|
||||||
namespace Ui {
|
|
||||||
class ImageWidget;
|
namespace Ui {
|
||||||
}
|
class ImageWidget;
|
||||||
|
}
|
||||||
class ImageWidget : public QWidget
|
|
||||||
{
|
class ImageWidget : public QWidget
|
||||||
Q_OBJECT
|
{
|
||||||
|
Q_OBJECT
|
||||||
public:
|
|
||||||
explicit ImageWidget(QWidget *parent = nullptr);
|
public:
|
||||||
~ImageWidget();
|
explicit ImageWidget(QWidget *parent = nullptr);
|
||||||
|
~ImageWidget();
|
||||||
void SetImage(std::shared_ptr<QImage> aImage);
|
|
||||||
std::shared_ptr<QImage> GetImage();
|
void SetImage(std::shared_ptr<Image> aImage);
|
||||||
|
std::shared_ptr<Image> GetImage();
|
||||||
private:
|
|
||||||
std::shared_ptr<QImage> mImage;
|
private:
|
||||||
Ui::ImageWidget *ui;
|
std::shared_ptr<Image> mImage;
|
||||||
};
|
Ui::ImageWidget *ui;
|
||||||
|
};
|
||||||
#endif // IMAGEWIDGET_H
|
|
||||||
|
#endif // IMAGEWIDGET_H
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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(const IWIFile* aIWIFile) {
|
void IWIViewer::SetIWIFile(std::shared_ptr<IWIFile> aIWIFile) {
|
||||||
mIWIFile = aIWIFile;
|
mIWIFile.swap(aIWIFile);
|
||||||
|
|
||||||
ui->label_Title->setText(mIWIFile->fileStem + ".iwi");
|
ui->label_Title->setText(mIWIFile->fileStem + ".iwi");
|
||||||
|
|
||||||
// If you’re using Qt and want a QString:
|
// If you’re 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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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(const IWIFile *aIWIFile);
|
void SetIWIFile(std::shared_ptr<IWIFile> aIWIFile);
|
||||||
private:
|
private:
|
||||||
Ui::IWIViewer *ui;
|
Ui::IWIViewer *ui;
|
||||||
const IWIFile* mIWIFile;
|
std::shared_ptr<IWIFile> mIWIFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // IWIVIEWER_H
|
#endif // IWIVIEWER_H
|
||||||
|
|||||||
1096
app/iwiviewer.ui
1096
app/iwiviewer.ui
File diff suppressed because it is too large
Load Diff
@ -1,58 +1,62 @@
|
|||||||
#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(XLocalizeEntry aLocalString) {
|
void LocalStringViewer::AddLocalString(LocalString aLocalString) {
|
||||||
mLocalStrings.append(aLocalString);
|
mLocalStrings.append(aLocalString);
|
||||||
ui->tableWidget_Strings->setRowCount(mLocalStrings.size());
|
|
||||||
ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(mLocalStrings.size()));
|
ui->tableWidget_Strings->setRowCount(mLocalStrings.size());
|
||||||
QTableWidgetItem *aliasItem = new QTableWidgetItem(aLocalString.GetValue()->GetString());
|
|
||||||
QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.GetName()->GetString());
|
ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(mLocalStrings.size()));
|
||||||
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 0, aliasItem);
|
|
||||||
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 1, stringItem);
|
QTableWidgetItem *aliasItem = new QTableWidgetItem(aLocalString.alias);
|
||||||
}
|
QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.string);
|
||||||
|
|
||||||
void LocalStringViewer::SetZoneFile(const ZoneFile* aZoneFile) {
|
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 0, aliasItem);
|
||||||
mLocalStrings.clear();
|
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 1, stringItem);
|
||||||
ui->tableWidget_Strings->clear();
|
}
|
||||||
|
|
||||||
ui->label_Title->setText(aZoneFile->GetStem().section('.', 0, 0) + ".str");
|
void LocalStringViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) {
|
||||||
// for (const LocalString &localStr : aZoneFile->GetAssetMap().localStrings) {
|
mLocalStrings.clear();
|
||||||
// AddLocalString(localStr);
|
ui->tableWidget_Strings->clear();
|
||||||
// }
|
|
||||||
}
|
ui->label_Title->setText(aZoneFile->GetStem().section('.', 0, 0) + ".str");
|
||||||
|
for (const LocalString &localStr : aZoneFile->GetAssetMap().localStrings) {
|
||||||
|
AddLocalString(localStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,34 +1,34 @@
|
|||||||
#ifndef LOCALSTRINGVIEWER_H
|
#ifndef LOCALSTRINGVIEWER_H
|
||||||
#define LOCALSTRINGVIEWER_H
|
#define LOCALSTRINGVIEWER_H
|
||||||
|
|
||||||
#include "xlocalizeentry.h"
|
#include "asset_structs.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(XLocalizeEntry aLocalString);
|
void AddLocalString(LocalString aLocalString);
|
||||||
void SetZoneFile(const ZoneFile *aZoneFile);
|
void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::LocalStringViewer *ui;
|
Ui::LocalStringViewer *ui;
|
||||||
quint32 mVersion;
|
quint32 mVersion;
|
||||||
QString mConfigPath;
|
QString mConfigPath;
|
||||||
QString mFileNotes;
|
QString mFileNotes;
|
||||||
QVector<XLocalizeEntry> mLocalStrings;
|
QVector<LocalString> mLocalStrings;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // LOCALSTRINGVIEWER_H
|
#endif // LOCALSTRINGVIEWER_H
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
22
app/main.cpp
22
app/main.cpp
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
1918
app/mainwindow.cpp
1918
app/mainwindow.cpp
File diff suppressed because it is too large
Load Diff
157
app/mainwindow.h
157
app/mainwindow.h
@ -1,78 +1,79 @@
|
|||||||
#ifndef MAINWINDOW_H
|
#ifndef MAINWINDOW_H
|
||||||
#define MAINWINDOW_H
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
#include "d3dbsp_structs.h"
|
#include "d3dbsp_structs.h"
|
||||||
#include "xtreewidget.h"
|
#include "asset_structs.h"
|
||||||
|
#include "xtreewidget.h"
|
||||||
#include <QMainWindow>
|
|
||||||
#include <QFileDialog>
|
#include <QMainWindow>
|
||||||
#include <QStandardPaths>
|
#include <QFileDialog>
|
||||||
#include <QMessageBox>
|
#include <QStandardPaths>
|
||||||
#include <QDebug>
|
#include <QMessageBox>
|
||||||
#include <QTableWidgetItem>
|
#include <QDebug>
|
||||||
#include <QTreeWidgetItem>
|
#include <QTableWidgetItem>
|
||||||
#include <QDockWidget>
|
#include <QTreeWidgetItem>
|
||||||
#include <QPlainTextEdit>
|
#include <QDockWidget>
|
||||||
#include <QMimeData>
|
#include <QPlainTextEdit>
|
||||||
#include <QProgressBar>
|
#include <QMimeData>
|
||||||
|
#include <QProgressBar>
|
||||||
QT_BEGIN_NAMESPACE
|
#include <windows.h>
|
||||||
namespace Ui {
|
|
||||||
class MainWindow;
|
QT_BEGIN_NAMESPACE
|
||||||
}
|
namespace Ui {
|
||||||
QT_END_NAMESPACE
|
class MainWindow;
|
||||||
|
}
|
||||||
class MainWindow : public QMainWindow
|
QT_END_NAMESPACE
|
||||||
{
|
|
||||||
Q_OBJECT
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
public:
|
Q_OBJECT
|
||||||
MainWindow(QWidget *parent = nullptr);
|
|
||||||
~MainWindow();
|
public:
|
||||||
void Reset();
|
MainWindow(QWidget *parent = nullptr);
|
||||||
|
~MainWindow();
|
||||||
private slots:
|
void Reset();
|
||||||
bool OpenFastFile(const QString aFastFilePath);
|
|
||||||
bool OpenFastFile(const QByteArray& aFastFileData, const QString aFastFilePath);
|
private slots:
|
||||||
bool OpenFastFile();
|
bool OpenFastFile(const QString aFastFilePath);
|
||||||
|
bool OpenFastFile();
|
||||||
bool OpenZoneFile(const QString aZoneFilePath, bool fromFF = false);
|
|
||||||
bool OpenZoneFile();
|
bool OpenZoneFile(const QString aZoneFilePath, bool fromFF = false);
|
||||||
|
bool OpenZoneFile();
|
||||||
int LoadFile_D3DBSP(const QString aFilePath);
|
|
||||||
int LoadFile_IPAK(const QString aFilePath);
|
int LoadFile_D3DBSP(const QString aFilePath);
|
||||||
int LoadFile_XSUB(const QString aFilePath);
|
int LoadFile_IPAK(const QString aFilePath);
|
||||||
int LoadFile_IWI(const QString aFilePath);
|
int LoadFile_XSUB(const QString aFilePath);
|
||||||
int LoadFile_DDS(const QString aFilePath);
|
int LoadFile_IWI(const QString aFilePath);
|
||||||
int LoadFile_DDSFiles(const QStringList aFilePaths);
|
int LoadFile_DDS(const QString aFilePath);
|
||||||
|
int LoadFile_DDSFiles(const QStringList aFilePaths);
|
||||||
void HandleLogEntry(const QString &entry);
|
|
||||||
void HandleStatusUpdate(const QString &message, int timeout);
|
void HandleLogEntry(const QString &entry);
|
||||||
void HandleProgressUpdate(const QString &message, int progress, int max);
|
void HandleStatusUpdate(const QString &message, int timeout);
|
||||||
|
void HandleProgressUpdate(const QString &message, int progress, int max);
|
||||||
protected:
|
|
||||||
void dragEnterEvent(QDragEnterEvent *event) override;
|
protected:
|
||||||
void dragMoveEvent(QDragMoveEvent *event) override;
|
void dragEnterEvent(QDragEnterEvent *event) override;
|
||||||
void dragLeaveEvent(QDragLeaveEvent *event) override;
|
void dragMoveEvent(QDragMoveEvent *event) override;
|
||||||
void dropEvent(QDropEvent *event) override;
|
void dragLeaveEvent(QDragLeaveEvent *event) override;
|
||||||
|
void dropEvent(QDropEvent *event) override;
|
||||||
private:
|
|
||||||
Ui::MainWindow *ui;
|
private:
|
||||||
QMap<QString, int> mTypeMap;
|
Ui::MainWindow *ui;
|
||||||
QStringList mTypeOrder;
|
QMap<QString, int> mTypeMap;
|
||||||
quint32 mTagCount;
|
QStringList mTypeOrder;
|
||||||
quint32 mRecordCount;
|
quint32 mTagCount;
|
||||||
QMap<QString, QString> mRawFileMap;
|
quint32 mRecordCount;
|
||||||
//QMap<QString, Image> mImageMap;
|
QMap<QString, QString> mRawFileMap;
|
||||||
QMap<QString, QTreeWidgetItem*> mTreeMap;
|
QMap<QString, Image> mImageMap;
|
||||||
QMap<QString, QVector<QPair<QString, QString>>> mStrTableMap;
|
QMap<QString, QTreeWidgetItem*> mTreeMap;
|
||||||
XTreeWidget *mTreeWidget;
|
QMap<QString, QVector<QPair<QString, QString>>> mStrTableMap;
|
||||||
QPlainTextEdit *mLogWidget;
|
XTreeWidget *mTreeWidget;
|
||||||
QProgressBar *mProgressBar;
|
QPlainTextEdit *mLogWidget;
|
||||||
|
QProgressBar *mProgressBar;
|
||||||
quint32 mBSPVersion;
|
|
||||||
quint32 mDiskLumpCount;
|
quint32 mBSPVersion;
|
||||||
QVector<quint32> mDiskLumpOrder;
|
quint32 mDiskLumpCount;
|
||||||
QMap<quint32, Lump> mLumps;
|
QVector<quint32> mDiskLumpOrder;
|
||||||
};
|
QMap<quint32, Lump> mLumps;
|
||||||
#endif // MAINWINDOW_H
|
};
|
||||||
|
#endif // MAINWINDOW_H
|
||||||
|
|||||||
@ -1,379 +1,361 @@
|
|||||||
<?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="MenuDef">
|
<widget class="QMenu" name="menuFile">
|
||||||
<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"/>
|
||||||
<addaction name="actionReport_Issue"/>
|
</widget>
|
||||||
</widget>
|
<addaction name="menuFile"/>
|
||||||
<widget class="QMenu" name="menuTools">
|
<addaction name="menuEdit"/>
|
||||||
<property name="title">
|
<addaction name="menuHelp"/>
|
||||||
<string>Tools</string>
|
</widget>
|
||||||
</property>
|
<widget class="QToolBar" name="toolBar">
|
||||||
<addaction name="actionRun_Tests"/>
|
<property name="windowTitle">
|
||||||
</widget>
|
<string>toolBar</string>
|
||||||
<addaction name="MenuDef"/>
|
</property>
|
||||||
<addaction name="menuEdit"/>
|
<attribute name="toolBarArea">
|
||||||
<addaction name="menuTools"/>
|
<enum>TopToolBarArea</enum>
|
||||||
<addaction name="menuHelp"/>
|
</attribute>
|
||||||
</widget>
|
<attribute name="toolBarBreak">
|
||||||
<widget class="QToolBar" name="toolBar">
|
<bool>false</bool>
|
||||||
<property name="windowTitle">
|
</attribute>
|
||||||
<string>toolBar</string>
|
</widget>
|
||||||
</property>
|
<widget class="QStatusBar" name="statusBar"/>
|
||||||
<attribute name="toolBarArea">
|
<action name="actionNew_File_2">
|
||||||
<enum>TopToolBarArea</enum>
|
<property name="icon">
|
||||||
</attribute>
|
<iconset resource="../data/data.qrc">
|
||||||
<attribute name="toolBarBreak">
|
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
|
||||||
<bool>false</bool>
|
</property>
|
||||||
</attribute>
|
<property name="text">
|
||||||
</widget>
|
<string>New</string>
|
||||||
<widget class="QStatusBar" name="statusBar"/>
|
</property>
|
||||||
<action name="actionNew_File_2">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionNew_Fast_File">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="icon">
|
||||||
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
|
<iconset resource="../data/data.qrc">
|
||||||
</property>
|
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>New</string>
|
<property name="text">
|
||||||
</property>
|
<string>New Fast File</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionNew_Fast_File">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionNew_Zone_File">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="icon">
|
||||||
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
|
<iconset resource="../data/data.qrc">
|
||||||
</property>
|
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>New Fast File</string>
|
<property name="text">
|
||||||
</property>
|
<string>New Zone File</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionNew_Zone_File">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionOpen_Fast_File">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="icon">
|
||||||
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
|
<iconset resource="../data/data.qrc">
|
||||||
</property>
|
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>New Zone File</string>
|
<property name="text">
|
||||||
</property>
|
<string>Open Fast File</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionOpen_Fast_File">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionOpen_Zone_File">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="icon">
|
||||||
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
|
<iconset resource="../data/data.qrc">
|
||||||
</property>
|
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>Open Fast File</string>
|
<property name="text">
|
||||||
</property>
|
<string>Open Zone File</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionOpen_Zone_File">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionOpen_Folder">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="icon">
|
||||||
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
|
<iconset resource="../data/data.qrc">
|
||||||
</property>
|
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>Open Zone File</string>
|
<property name="text">
|
||||||
</property>
|
<string>Open Folder</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionOpen_Folder">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionSave">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="icon">
|
||||||
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
|
<iconset resource="../data/data.qrc">
|
||||||
</property>
|
<normaloff>:/icons/icons/Icon_Save.png</normaloff>:/icons/icons/Icon_Save.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>Open Folder</string>
|
<property name="text">
|
||||||
</property>
|
<string>Save</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionSave">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionSave_As">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="text">
|
||||||
<normaloff>:/icons/icons/Icon_Save.png</normaloff>:/icons/icons/Icon_Save.png</iconset>
|
<string>Save As</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Save</string>
|
<action name="actione">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>e</string>
|
||||||
<action name="actionSave_As">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Save As</string>
|
<action name="actionFile">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>File</string>
|
||||||
<action name="actione">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>e</string>
|
<action name="actionFolder">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Folder</string>
|
||||||
<action name="actionFile">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>File</string>
|
<action name="actionNew_File">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>New File</string>
|
||||||
<action name="actionFolder">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Folder</string>
|
<action name="actionNew_Fast_File_2">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>New Fast File</string>
|
||||||
<action name="actionNew_File">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>New File</string>
|
<action name="actionNew_Zone_File_2">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>New Zone File</string>
|
||||||
<action name="actionNew_Fast_File_2">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>New Fast File</string>
|
<action name="actionFrom_Clipboard">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>From Clipboard</string>
|
||||||
<action name="actionNew_Zone_File_2">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>New Zone File</string>
|
<action name="actionMaterial">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Material</string>
|
||||||
<action name="actionFrom_Clipboard">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>From Clipboard</string>
|
<action name="actionSound">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Sound</string>
|
||||||
<action name="actionMaterial">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Material</string>
|
<action name="actionUndo">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Undo</string>
|
||||||
<action name="actionSound">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Sound</string>
|
<action name="actionRedo">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Redo</string>
|
||||||
<action name="actionUndo">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Undo</string>
|
<action name="actionCut">
|
||||||
</property>
|
<property name="icon">
|
||||||
</action>
|
<iconset resource="../data/data.qrc">
|
||||||
<action name="actionRedo">
|
<normaloff>:/icons/icons/Icon_Cut.png</normaloff>:/icons/icons/Icon_Cut.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>Redo</string>
|
<property name="text">
|
||||||
</property>
|
<string>Cut</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionCut">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionCopy">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="icon">
|
||||||
<normaloff>:/icons/icons/Icon_Cut.png</normaloff>:/icons/icons/Icon_Cut.png</iconset>
|
<iconset resource="../data/data.qrc">
|
||||||
</property>
|
<normaloff>:/icons/icons/Icon_Copy.png</normaloff>:/icons/icons/Icon_Copy.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>Cut</string>
|
<property name="text">
|
||||||
</property>
|
<string>Copy</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionCopy">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionPaste">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="icon">
|
||||||
<normaloff>:/icons/icons/Icon_Copy.png</normaloff>:/icons/icons/Icon_Copy.png</iconset>
|
<iconset resource="../data/data.qrc">
|
||||||
</property>
|
<normaloff>:/icons/icons/Icon_Paste.png</normaloff>:/icons/icons/Icon_Paste.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>Copy</string>
|
<property name="text">
|
||||||
</property>
|
<string>Paste</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionPaste">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionRename">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="text">
|
||||||
<normaloff>:/icons/icons/Icon_Paste.png</normaloff>:/icons/icons/Icon_Paste.png</iconset>
|
<string>Rename</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Paste</string>
|
<action name="actionEdit_Value">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Edit Value</string>
|
||||||
<action name="actionRename">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Rename</string>
|
<action name="actionEdit_as_Hex">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Edit as Hex</string>
|
||||||
<action name="actionEdit_Value">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Edit Value</string>
|
<action name="actionDelete">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Delete</string>
|
||||||
<action name="actionEdit_as_Hex">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Edit as Hex</string>
|
<action name="actiond">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>d</string>
|
||||||
<action name="actionDelete">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Delete</string>
|
<action name="actiond_2">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>d</string>
|
||||||
<action name="actiond">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>d</string>
|
<action name="actionClear_Undo_History">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Clear Undo History</string>
|
||||||
<action name="actiond_2">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>d</string>
|
<action name="actionFind">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Find</string>
|
||||||
<action name="actionClear_Undo_History">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Clear Undo History</string>
|
<action name="actionAbout">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>About</string>
|
||||||
<action name="actionFind">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Find</string>
|
<action name="actionChange_Icons">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Change Icons</string>
|
||||||
<action name="actionAbout">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>About</string>
|
<action name="actionCheck_for_Updates">
|
||||||
</property>
|
<property name="text">
|
||||||
</action>
|
<string>Check for Updates</string>
|
||||||
<action name="actionChange_Icons">
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Change Icons</string>
|
<action name="actionFind_2">
|
||||||
</property>
|
<property name="icon">
|
||||||
</action>
|
<iconset resource="../data/data.qrc">
|
||||||
<action name="actionCheck_for_Updates">
|
<normaloff>:/icons/icons/Icon_Find.png</normaloff>:/icons/icons/Icon_Find.png</iconset>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>Check for Updates</string>
|
<property name="text">
|
||||||
</property>
|
<string>Find</string>
|
||||||
</action>
|
</property>
|
||||||
<action name="actionFind_2">
|
</action>
|
||||||
<property name="icon">
|
<action name="actionPreferences">
|
||||||
<iconset resource="../data/data.qrc">
|
<property name="text">
|
||||||
<normaloff>:/icons/icons/Icon_Find.png</normaloff>:/icons/icons/Icon_Find.png</iconset>
|
<string>Preferences...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
</action>
|
||||||
<string>Find</string>
|
</widget>
|
||||||
</property>
|
<resources>
|
||||||
</action>
|
<include location="../data/data.qrc"/>
|
||||||
<action name="actionPreferences">
|
</resources>
|
||||||
<property name="text">
|
<connections/>
|
||||||
<string>Preferences...</string>
|
</ui>
|
||||||
</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>
|
|
||||||
|
|||||||
@ -1,43 +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) {
|
||||||
|
return QString("%1").arg(in, 8, 16, QChar('0')).toUpper();
|
||||||
QString ToHexStr(quint32 in)
|
}
|
||||||
{
|
|
||||||
return QString("%1").arg(in, 8, 16, QChar('0')).toUpper();
|
void MaterialViewer::SetMaterial(std::shared_ptr<Material> aMaterial) {
|
||||||
}
|
ui->lineEdit_NamePtr->setText(ToHexStr(aMaterial->namePtr));
|
||||||
|
ui->lineEdit_Name->setText(aMaterial->name);
|
||||||
void MaterialViewer::SetMaterial(const XMaterial* aMaterial)
|
ui->lineEdit_RefPtr->setText(ToHexStr(aMaterial->refNamePtr));
|
||||||
{
|
ui->lineEdit_RefName->setText(aMaterial->refName);
|
||||||
Q_UNUSED(aMaterial);
|
QString unknownStr = "";
|
||||||
|
foreach (quint32 unknownPtr, aMaterial->pointers) {
|
||||||
// TODO: Fill in MaterialViewer::SetMaterial
|
unknownStr += ToHexStr(unknownPtr) + "\n";
|
||||||
|
}
|
||||||
// ui->lineEdit_NamePtr->setText(ToHexStr(aMaterial->namePtr));
|
ui->lineEdit_Unknowns->setText(unknownStr);
|
||||||
// ui->lineEdit_Name->setText(aMaterial->name);
|
ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[0]));
|
||||||
// ui->lineEdit_RefPtr->setText(ToHexStr(aMaterial->refNamePtr));
|
ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[1]));
|
||||||
// ui->lineEdit_RefName->setText(aMaterial->refName);
|
ui->spinBox_TextureCount->setValue(aMaterial->textureCount);
|
||||||
// QString unknownStr = "";
|
ui->spinBox_ConstCount->setValue(aMaterial->constCount);
|
||||||
// foreach (quint32 unknownPtr, aMaterial->pointers) {
|
ui->lineEdit_TechSetPtr->setText(ToHexStr(aMaterial->techSetPtr));
|
||||||
// unknownStr += ToHexStr(unknownPtr) + "\n";
|
ui->lineEdit_TexturePtr->setText(ToHexStr(aMaterial->texturePtr));
|
||||||
// }
|
ui->lineEdit_ConstantPtr->setText(ToHexStr(aMaterial->constPtr));
|
||||||
// ui->lineEdit_Unknowns->setText(unknownStr);
|
}
|
||||||
// ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[0]));
|
|
||||||
// ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[1]));
|
|
||||||
// ui->spinBox_TextureCount->setValue(aMaterial->textureCount);
|
|
||||||
// ui->spinBox_ConstCount->setValue(aMaterial->constCount);
|
|
||||||
// ui->lineEdit_TechSetPtr->setText(ToHexStr(aMaterial->techSetPtr));
|
|
||||||
// ui->lineEdit_TexturePtr->setText(ToHexStr(aMaterial->texturePtr));
|
|
||||||
// ui->lineEdit_ConstantPtr->setText(ToHexStr(aMaterial->constPtr));
|
|
||||||
}
|
|
||||||
|
|||||||
@ -1,27 +1,27 @@
|
|||||||
#ifndef MATERIALVIEWER_H
|
#ifndef MATERIALVIEWER_H
|
||||||
#define MATERIALVIEWER_H
|
#define MATERIALVIEWER_H
|
||||||
|
|
||||||
#include "xmaterial.h"
|
#include "asset_structs.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(const XMaterial *aMaterial);
|
void SetMaterial(std::shared_ptr<Material> aMaterial);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MaterialViewer *ui;
|
Ui::MaterialViewer *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MATERIALVIEWER_H
|
#endif // MATERIALVIEWER_H
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
1248
app/modelviewer.ui
1248
app/modelviewer.ui
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
@ -1,103 +0,0 @@
|
|||||||
#include "reportissuedialog.h"
|
|
||||||
#include "qjsonarray.h"
|
|
||||||
#include "ui_reportissuedialog.h"
|
|
||||||
|
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QJsonObject>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
|
|
||||||
ReportIssueDialog::ReportIssueDialog(const QString &giteaBaseUrl,
|
|
||||||
const QString &repoOwner,
|
|
||||||
const QString &repoName,
|
|
||||||
const QString &accessToken,
|
|
||||||
QWidget *parent) :
|
|
||||||
QDialog(parent),
|
|
||||||
ui(new Ui::ReportIssueDialog),
|
|
||||||
networkManager(new QNetworkAccessManager(this)),
|
|
||||||
giteaBaseUrl(giteaBaseUrl),
|
|
||||||
repoOwner(repoOwner),
|
|
||||||
repoName(repoName),
|
|
||||||
accessToken(accessToken)
|
|
||||||
{
|
|
||||||
ui->setupUi(this);
|
|
||||||
|
|
||||||
connect(networkManager, &QNetworkAccessManager::finished, this, &ReportIssueDialog::onNetworkReplyFinished);
|
|
||||||
}
|
|
||||||
|
|
||||||
ReportIssueDialog::~ReportIssueDialog()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReportIssueDialog::on_buttonSend_clicked()
|
|
||||||
{
|
|
||||||
QString title = ui->lineEditSummary->text().trimmed();
|
|
||||||
QString details = ui->textEditDetails->toPlainText().trimmed();
|
|
||||||
QString contact = ui->lineEditContact->text().trimmed();
|
|
||||||
|
|
||||||
if (title.isEmpty()) {
|
|
||||||
QMessageBox::warning(this, tr("Input Error"), tr("Please enter a summary/title for the issue."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString body = details;
|
|
||||||
if (!contact.isEmpty()) {
|
|
||||||
body += QString("\n\nContact info:\n%1").arg(contact);
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->buttonSend->setEnabled(false);
|
|
||||||
sendIssueReport(title, body, contact);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReportIssueDialog::on_buttonCancel_clicked()
|
|
||||||
{
|
|
||||||
reject();
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
QUrl url(QString("%1/api/v1/repos/%2/%3/issues").arg(giteaBaseUrl).arg(repoOwner).arg(repoName));
|
|
||||||
|
|
||||||
QNetworkRequest request(url);
|
|
||||||
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
|
||||||
|
|
||||||
if (!accessToken.isEmpty()) {
|
|
||||||
request.setRawHeader("Authorization", "token " + accessToken.toUtf8());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compose JSON body
|
|
||||||
QJsonObject json;
|
|
||||||
json["title"] = title;
|
|
||||||
json["body"] = body;
|
|
||||||
json["labels"] = QJsonArray{12};
|
|
||||||
|
|
||||||
QJsonDocument doc(json);
|
|
||||||
QByteArray data = doc.toJson();
|
|
||||||
|
|
||||||
networkManager->post(request, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReportIssueDialog::onNetworkReplyFinished(QNetworkReply *reply)
|
|
||||||
{
|
|
||||||
ui->buttonSend->setEnabled(true);
|
|
||||||
|
|
||||||
QByteArray responseData = reply->readAll();
|
|
||||||
QString responseStr = QString::fromUtf8(responseData);
|
|
||||||
|
|
||||||
if (reply->error() != QNetworkReply::NoError) {
|
|
||||||
QString errorStr = reply->errorString();
|
|
||||||
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));
|
|
||||||
} else {
|
|
||||||
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
|
||||||
if (status == 201) {
|
|
||||||
QMessageBox::information(this, tr("Success"), tr("Issue reported successfully!"));
|
|
||||||
accept();
|
|
||||||
} else {
|
|
||||||
QMessageBox::warning(this, tr("Failed"), tr("Unexpected response from server (%1):\n%2").arg(status).arg(responseStr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
reply->deleteLater();
|
|
||||||
}
|
|
||||||
@ -1,43 +0,0 @@
|
|||||||
#ifndef REPORTISSUEDIALOG_H
|
|
||||||
#define REPORTISSUEDIALOG_H
|
|
||||||
|
|
||||||
#include <QDialog>
|
|
||||||
#include <QNetworkAccessManager>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
class ReportIssueDialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
class ReportIssueDialog : public QDialog
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit ReportIssueDialog(const QString &giteaBaseUrl,
|
|
||||||
const QString &repoOwner,
|
|
||||||
const QString &repoName,
|
|
||||||
const QString &accessToken,
|
|
||||||
QWidget *parent = nullptr);
|
|
||||||
~ReportIssueDialog();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void on_buttonSend_clicked();
|
|
||||||
void on_buttonCancel_clicked();
|
|
||||||
|
|
||||||
void onNetworkReplyFinished(QNetworkReply *reply);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Ui::ReportIssueDialog *ui;
|
|
||||||
|
|
||||||
QNetworkAccessManager *networkManager;
|
|
||||||
|
|
||||||
QString giteaBaseUrl;
|
|
||||||
QString repoOwner;
|
|
||||||
QString repoName;
|
|
||||||
QString accessToken;
|
|
||||||
|
|
||||||
void sendIssueReport(const QString &title, const QString &body, const QString &contact);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // REPORTISSUEDIALOG_H
|
|
||||||
@ -1,84 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>ReportIssueDialog</class>
|
|
||||||
<widget class="QDialog" name="ReportIssueDialog">
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Report a Problem</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="labelInstructions">
|
|
||||||
<property name="text">
|
|
||||||
<string>Please describe the problem you encountered. We’ll use this info to help fix it.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="labelSummary">
|
|
||||||
<property name="text">
|
|
||||||
<string>Summary (short title):</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="lineEditSummary" />
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="labelDetails">
|
|
||||||
<property name="text">
|
|
||||||
<string>Details (what happened?):</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QTextEdit" name="textEditDetails" />
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="labelContact">
|
|
||||||
<property name="text">
|
|
||||||
<string>Your contact (email or name, optional):</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="lineEditContact" />
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="buttonLayout">
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::Expanding</enum>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="buttonSend">
|
|
||||||
<property name="text">
|
|
||||||
<string>Send Report</string>
|
|
||||||
</property>
|
|
||||||
<property name="default">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="buttonCancel">
|
|
||||||
<property name="text">
|
|
||||||
<string>Cancel</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
||||||
@ -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(XRawFile *aRumbleFile) {
|
void RumbleFileViewer::SetRumbleFile(std::shared_ptr<RawFile> 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;
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,28 +1,28 @@
|
|||||||
#ifndef RUMBLEFILEVIEWER_H
|
#ifndef RUMBLEFILEVIEWER_H
|
||||||
#define RUMBLEFILEVIEWER_H
|
#define RUMBLEFILEVIEWER_H
|
||||||
|
|
||||||
#include "xrawfile.h"
|
#include "asset_structs.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(XRawFile* aRumbleFile);
|
void SetRumbleFile(std::shared_ptr<RawFile> aRumbleFile);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::RumbleFileViewer *ui;
|
Ui::RumbleFileViewer *ui;
|
||||||
quint32 mPropertyCount;
|
quint32 mPropertyCount;
|
||||||
XRawFile* mRumbleFile;
|
std::shared_ptr<RawFile> mRumbleFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RUMBLEFILEVIEWER_H
|
#endif // RUMBLEFILEVIEWER_H
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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 XRawFile* aRawFile) {
|
void RumbleGraphViewer::SetRumbleGraphFile(const std::shared_ptr<RawFile> aRawFile) {
|
||||||
mRumbleGraphFile = aRawFile;
|
mRumbleGraphFile = aRawFile;
|
||||||
|
|
||||||
XDataStream 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,30 +1,30 @@
|
|||||||
#ifndef RUMBLEGRAPHVIEWER_H
|
#ifndef RUMBLEGRAPHVIEWER_H
|
||||||
#define RUMBLEGRAPHVIEWER_H
|
#define RUMBLEGRAPHVIEWER_H
|
||||||
|
|
||||||
#include "xrawfile.h"
|
#include "asset_structs.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 XRawFile *aRawFile);
|
void SetRumbleGraphFile(const std::shared_ptr<RawFile> aRawFile);
|
||||||
void SetZoneFile(ZoneFile* aZoneFile);
|
void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::RumbleGraphViewer *ui;
|
Ui::RumbleGraphViewer *ui;
|
||||||
quint32 mEntryCount;
|
quint32 mEntryCount;
|
||||||
const XRawFile* mRumbleGraphFile;
|
std::shared_ptr<RawFile> mRumbleGraphFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RUMBLEGRAPHVIEWER_H
|
#endif // RUMBLEGRAPHVIEWER_H
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,32 +1,34 @@
|
|||||||
#ifndef SOUNDVIEWER_H
|
#ifndef SOUNDVIEWER_H
|
||||||
#define SOUNDVIEWER_H
|
#define SOUNDVIEWER_H
|
||||||
|
|
||||||
#include <QWidget>
|
#include "asset_structs.h"
|
||||||
#include <QMediaPlayer>
|
|
||||||
#include <QBuffer>
|
#include <QWidget>
|
||||||
#include <QAudioDevice>
|
#include <QMediaPlayer>
|
||||||
#include <QMediaDevices>
|
#include <QBuffer>
|
||||||
#include <QAudioOutput>
|
#include <QAudioDevice>
|
||||||
|
#include <QMediaDevices>
|
||||||
namespace Ui {
|
#include <QAudioOutput>
|
||||||
class SoundViewer;
|
|
||||||
}
|
namespace Ui {
|
||||||
|
class SoundViewer;
|
||||||
class SoundViewer : public QWidget
|
}
|
||||||
{
|
|
||||||
Q_OBJECT
|
class SoundViewer : public QWidget
|
||||||
|
{
|
||||||
public:
|
Q_OBJECT
|
||||||
explicit SoundViewer(QWidget *parent = nullptr);
|
|
||||||
~SoundViewer();
|
public:
|
||||||
|
explicit SoundViewer(QWidget *parent = nullptr);
|
||||||
//void SetSound(std::shared_ptr<Sound> aSound);
|
~SoundViewer();
|
||||||
|
|
||||||
void SetOutput(QAudioOutput *aOutput);
|
void SetSound(std::shared_ptr<Sound> aSound);
|
||||||
private:
|
|
||||||
Ui::SoundViewer *ui;
|
void SetOutput(QAudioOutput *aOutput);
|
||||||
QMediaPlayer *player;
|
private:
|
||||||
QBuffer *buffer;
|
Ui::SoundViewer *ui;
|
||||||
};
|
QMediaPlayer *player;
|
||||||
|
QBuffer *buffer;
|
||||||
#endif // SOUNDVIEWER_H
|
};
|
||||||
|
|
||||||
|
#endif // SOUNDVIEWER_H
|
||||||
|
|||||||
5146
app/soundviewer.ui
5146
app/soundviewer.ui
File diff suppressed because it is too large
Load Diff
@ -1,35 +1,36 @@
|
|||||||
#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(const XStringTable *aStringTable) {
|
void StringTableViewer::SetStringTable(std::shared_ptr<StringTable> aStringTable) {
|
||||||
ui->tableWidget_Strings->clear();
|
ui->tableWidget_Strings->clear();
|
||||||
|
|
||||||
ui->tableWidget_Strings->setRowCount(aStringTable->GetRowCount());
|
ui->tableWidget_Strings->setRowCount(aStringTable->rowCount);
|
||||||
ui->tableWidget_Strings->setColumnCount(aStringTable->GetColumnCount());
|
ui->tableWidget_Strings->setColumnCount(aStringTable->columnCount);
|
||||||
|
|
||||||
int currentIndex = 0;
|
int currentIndex = 0;
|
||||||
for (auto value : *aStringTable->GetValues()) {
|
for (const QString &key : aStringTable->content.keys()) {
|
||||||
|
const QString value = aStringTable->content[key];
|
||||||
QTableWidgetItem *tableKeyItem = new QTableWidgetItem();
|
|
||||||
tableKeyItem->setText(value->GetName());
|
QTableWidgetItem *tableKeyItem = new QTableWidgetItem();
|
||||||
ui->tableWidget_Strings->setItem(currentIndex, 0, tableKeyItem);
|
tableKeyItem->setText(key);
|
||||||
|
ui->tableWidget_Strings->setItem(currentIndex, 0, tableKeyItem);
|
||||||
QTableWidgetItem *tableValItem = new QTableWidgetItem();
|
|
||||||
tableValItem->setText(value->GetString());
|
QTableWidgetItem *tableValItem = new QTableWidgetItem();
|
||||||
ui->tableWidget_Strings->setItem(currentIndex, 1, tableValItem);
|
tableValItem->setText(value);
|
||||||
|
ui->tableWidget_Strings->setItem(currentIndex, 1, tableValItem);
|
||||||
currentIndex++;
|
|
||||||
}
|
currentIndex++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,26 +1,25 @@
|
|||||||
#ifndef STRINGTABLEVIEWER_H
|
#ifndef STRINGTABLEVIEWER_H
|
||||||
#define STRINGTABLEVIEWER_H
|
#define STRINGTABLEVIEWER_H
|
||||||
|
|
||||||
#include "xstringtable.h"
|
#include "asset_structs.h"
|
||||||
|
#include <QWidget>
|
||||||
#include <QWidget>
|
|
||||||
|
namespace Ui {
|
||||||
namespace Ui {
|
class StringTableViewer;
|
||||||
class StringTableViewer;
|
}
|
||||||
}
|
|
||||||
|
class StringTableViewer : public QWidget
|
||||||
class StringTableViewer : public QWidget
|
{
|
||||||
{
|
Q_OBJECT
|
||||||
Q_OBJECT
|
|
||||||
|
public:
|
||||||
public:
|
explicit StringTableViewer(QWidget *parent = nullptr);
|
||||||
explicit StringTableViewer(QWidget *parent = nullptr);
|
~StringTableViewer();
|
||||||
~StringTableViewer();
|
|
||||||
|
void SetStringTable(std::shared_ptr<StringTable> aStringTable);
|
||||||
void SetStringTable(const XStringTable *aStringTable);
|
|
||||||
|
private:
|
||||||
private:
|
Ui::StringTableViewer *ui;
|
||||||
Ui::StringTableViewer *ui;
|
};
|
||||||
};
|
|
||||||
|
#endif // STRINGTABLEVIEWER_H
|
||||||
#endif // STRINGTABLEVIEWER_H
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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(const XMaterialTechniqueSet* aTechSet) {
|
void TechSetViewer::SetTechSet(std::shared_ptr<TechSet> aTechSet) {
|
||||||
//ui->listWidget_Ptrs->clear();
|
ui->listWidget_Ptrs->clear();
|
||||||
ui->label_Title->setText(aTechSet->GetName());
|
ui->label_Title->setText(aTechSet->name);
|
||||||
|
|
||||||
// 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++;
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,26 +1,25 @@
|
|||||||
#ifndef TECHSETVIEWER_H
|
#ifndef TECHSETVIEWER_H
|
||||||
#define TECHSETVIEWER_H
|
#define TECHSETVIEWER_H
|
||||||
|
|
||||||
#include "xmaterialtechniqueset.h"
|
#include "asset_structs.h"
|
||||||
|
#include <QWidget>
|
||||||
#include <QWidget>
|
|
||||||
|
namespace Ui {
|
||||||
namespace Ui {
|
class TechSetViewer;
|
||||||
class TechSetViewer;
|
}
|
||||||
}
|
|
||||||
|
class TechSetViewer : public QWidget
|
||||||
class TechSetViewer : public QWidget
|
{
|
||||||
{
|
Q_OBJECT
|
||||||
Q_OBJECT
|
|
||||||
|
public:
|
||||||
public:
|
explicit TechSetViewer(QWidget *parent = nullptr);
|
||||||
explicit TechSetViewer(QWidget *parent = nullptr);
|
~TechSetViewer();
|
||||||
~TechSetViewer();
|
|
||||||
|
void SetTechSet(std::shared_ptr<TechSet> aTechSet);
|
||||||
void SetTechSet(const XMaterialTechniqueSet *aTechSet);
|
|
||||||
|
private:
|
||||||
private:
|
Ui::TechSetViewer *ui;
|
||||||
Ui::TechSetViewer *ui;
|
};
|
||||||
};
|
|
||||||
|
#endif // TECHSETVIEWER_H
|
||||||
#endif // TECHSETVIEWER_H
|
|
||||||
|
|||||||
@ -1,151 +1,77 @@
|
|||||||
<?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>880</width>
|
<width>961</width>
|
||||||
<height>559</height>
|
<height>756</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_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>Technique Set 0</string>
|
<string>Technique Set 0</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox">
|
<widget class="QGroupBox" name="groupBox">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Set Parameters</string>
|
<string>Unknown Pointers:</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<widget class="QListWidget" name="listWidget_Ptrs"/>
|
||||||
<item>
|
</item>
|
||||||
<widget class="QLabel" name="label">
|
</layout>
|
||||||
<property name="text">
|
</widget>
|
||||||
<string>Name:</string>
|
</item>
|
||||||
</property>
|
<item>
|
||||||
</widget>
|
<spacer name="horizontalSpacer">
|
||||||
</item>
|
<property name="orientation">
|
||||||
<item>
|
<enum>Qt::Orientation::Horizontal</enum>
|
||||||
<widget class="QLineEdit" name="lineEdit_Name">
|
</property>
|
||||||
<property name="placeholderText">
|
<property name="sizeHint" stdset="0">
|
||||||
<string>Technique set name</string>
|
<size>
|
||||||
</property>
|
<width>40</width>
|
||||||
</widget>
|
<height>20</height>
|
||||||
</item>
|
</size>
|
||||||
</layout>
|
</property>
|
||||||
</item>
|
</spacer>
|
||||||
<item>
|
</item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
</layout>
|
||||||
<item>
|
</item>
|
||||||
<widget class="QLabel" name="label_2">
|
<item>
|
||||||
<property name="text">
|
<spacer name="verticalSpacer">
|
||||||
<string>World Vertex Format:</string>
|
<property name="orientation">
|
||||||
</property>
|
<enum>Qt::Orientation::Vertical</enum>
|
||||||
</widget>
|
</property>
|
||||||
</item>
|
<property name="sizeHint" stdset="0">
|
||||||
<item>
|
<size>
|
||||||
<widget class="QSpinBox" name="spinBox_WorldVertFormat"/>
|
<width>20</width>
|
||||||
</item>
|
<height>363</height>
|
||||||
</layout>
|
</size>
|
||||||
</item>
|
</property>
|
||||||
<item>
|
</spacer>
|
||||||
<widget class="QListWidget" name="listWidget_Techniques"/>
|
</item>
|
||||||
</item>
|
</layout>
|
||||||
</layout>
|
</widget>
|
||||||
</widget>
|
<resources/>
|
||||||
</item>
|
<connections/>
|
||||||
<item>
|
</ui>
|
||||||
<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>
|
|
||||||
|
|||||||
1647
app/xtreewidget.cpp
1647
app/xtreewidget.cpp
File diff suppressed because it is too large
Load Diff
@ -1,67 +1,64 @@
|
|||||||
#ifndef XTREEWIDGET_H
|
#ifndef XTREEWIDGET_H
|
||||||
#define XTREEWIDGET_H
|
#define XTREEWIDGET_H
|
||||||
|
|
||||||
#include "d3dbsp_structs.h"
|
#include "d3dbsp_structs.h"
|
||||||
#include "ddsfile.h"
|
#include "asset_structs.h"
|
||||||
#include "iwifile.h"
|
#include "ddsfile.h"
|
||||||
#include "fastfile.h"
|
#include "iwifile.h"
|
||||||
#include "xloadedsound.h"
|
#include "fastfile.h"
|
||||||
#include "xtreewidgetitem.h"
|
#include "xtreewidgetitem.h"
|
||||||
#include "zonefile.h"
|
#include "zonefile.h"
|
||||||
#include "xrawfile.h"
|
#include "utils.h"
|
||||||
#include "xgfximage.h"
|
|
||||||
#include "xstringtable.h"
|
#include <QTreeWidget>
|
||||||
#include "xmenudef.h"
|
#include <QFileDialog>
|
||||||
|
|
||||||
#include <QTreeWidget>
|
class XTreeWidget : public QTreeWidget
|
||||||
#include <QFileDialog>
|
{
|
||||||
|
Q_OBJECT
|
||||||
class XTreeWidget : public QTreeWidget
|
public:
|
||||||
{
|
explicit XTreeWidget(QWidget *parent = nullptr);
|
||||||
Q_OBJECT
|
~XTreeWidget();
|
||||||
public:
|
|
||||||
explicit XTreeWidget(QWidget *parent = nullptr);
|
void AddFastFile(std::shared_ptr<FastFile> aFastFile);
|
||||||
~XTreeWidget();
|
void AddZoneFile(std::shared_ptr<ZoneFile> aZoneFile, XTreeWidgetItem *aParentItem = nullptr);
|
||||||
|
void AddIWIFile(std::shared_ptr<IWIFile> aIWIFile);
|
||||||
void AddFastFile(FastFile* aFastFile);
|
void AddDDSFile(std::shared_ptr<DDSFile> aDDSFile);
|
||||||
void AddZoneFile(const ZoneFile *aZoneFile, XTreeWidgetItem *aParentItem = nullptr);
|
|
||||||
void AddIWIFile(IWIFile* aIWIFile);
|
std::shared_ptr<ZoneFile> FindZoneFile(const QString aStem);
|
||||||
void AddDDSFile(DDSFile* aDDSFile);
|
std::shared_ptr<FastFile> FindFastFile(const QString aStem);
|
||||||
|
|
||||||
const ZoneFile *FindZoneFile(const QString aStem);
|
bool HasZoneFile(const QString aStem);
|
||||||
const FastFile* FindFastFile(const QString aStem);
|
bool HasFastFile(const QString aStem);
|
||||||
|
|
||||||
bool HasZoneFile(const QString aStem);
|
void CloseFastFile(const QString aFFName);
|
||||||
bool HasFastFile(const QString aStem);
|
signals:
|
||||||
|
void DDSFileSelected(std::shared_ptr<DDSFile> aDDSFile, const QString aParentName);
|
||||||
void CloseFastFile(const QString aFFName);
|
void IWIFileSelected(std::shared_ptr<IWIFile> aIWIFile, const QString aParentName);
|
||||||
signals:
|
void FastFileSelected(std::shared_ptr<FastFile> aFastFile, const QString aParentName);
|
||||||
void DDSFileSelected(const DDSFile* aDDSFile, const QString aParentName);
|
void ZoneFileSelected(std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName);
|
||||||
void IWIFileSelected(const IWIFile* aIWIFile, const QString aParentName);
|
void LocalStringSelected(std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName);
|
||||||
void FastFileSelected(const FastFile* aFastFile, const QString aParentName);
|
void RawFileSelected(std::shared_ptr<RawFile> aRawFile, const QString aParentName);
|
||||||
void ZoneFileSelected(const ZoneFile* aZoneFile, const QString aParentName);
|
void ImageSelected(std::shared_ptr<Image> aImage, const QString aParentName);
|
||||||
void LocalStringSelected(const ZoneFile* aZoneFile, const QString aParentName);
|
void TechSetSelected(std::shared_ptr<TechSet> aZoneFile, const QString aParentName);
|
||||||
void RawFileSelected(const XRawFile* aRawFile, const QString aParentName);
|
void StrTableSelected(std::shared_ptr<StringTable> aStrTable, const QString aParentName);
|
||||||
void ImageSelected(const XGfxImage* aImage, const QString aParentName);
|
void MenuSelected(std::shared_ptr<Menu> aMenu, const QString aParentName);
|
||||||
void TechSetSelected(const XMaterialTechniqueSet* aZoneFile, const QString aParentName);
|
void SoundSelected(std::shared_ptr<Sound> aSound, const QString aParentName);
|
||||||
void StrTableSelected(const XStringTable* aStrTable, const QString aParentName);
|
void MaterialSelected(std::shared_ptr<Material> aMaterial, const QString aParentName);
|
||||||
void MenuSelected(const XMenuDef* aMenu, const QString aParentName);
|
void ItemSelected(const QString itemText);
|
||||||
void SoundSelected(const XLoadedSound* aSound, const QString aParentName);
|
|
||||||
void MaterialSelected(const XMaterial* aMaterial, const QString aParentName);
|
void ItemClosed(const QString itemText);
|
||||||
void ItemSelected(const QString itemText);
|
void Cleared();
|
||||||
|
|
||||||
void ItemClosed(const QString itemText);
|
protected:
|
||||||
void Cleared();
|
void ItemSelectionChanged();
|
||||||
|
void PrepareContextMenu(const QPoint &pos);
|
||||||
protected:
|
|
||||||
void ItemSelectionChanged();
|
private:
|
||||||
void PrepareContextMenu(const QPoint &pos);
|
QMap<QString, std::shared_ptr<FastFile>> mFastFiles;
|
||||||
|
QMap<QString, std::shared_ptr<ZoneFile>> mZoneFiles;
|
||||||
private:
|
QMap<QString, std::shared_ptr<DDSFile>> mDDSFiles;
|
||||||
QMap<QString, const FastFile*> mFastFiles;
|
QMap<QString, std::shared_ptr<IWIFile>> mIWIFiles;
|
||||||
QMap<QString, const ZoneFile*> mZoneFiles;
|
};
|
||||||
QMap<QString, const DDSFile*> mDDSFiles;
|
|
||||||
QMap<QString, const IWIFile*> mIWIFiles;
|
#endif // XTREEWIDGET_H
|
||||||
};
|
|
||||||
|
|
||||||
#endif // XTREEWIDGET_H
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -1,156 +1,158 @@
|
|||||||
#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(const ZoneFile* aZoneFile) {
|
void ZoneFileViewer::SetZoneFile(std::shared_ptr<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<XAssetType, int> recordCounts = QMap<XAssetType, int>();
|
QMap<QString, int> recordCounts = QMap<QString, int>();
|
||||||
QVector<QPair<XAssetType, int>> assetOccurances = QVector<QPair<XAssetType, int>>();
|
QVector<QPair<QString, int>> assetOccurances = QVector<QPair<QString, int>>();
|
||||||
for (XAssetType type : mZoneFile->GetTypes()) {
|
for (const QString &record : mZoneFile->GetRecords()) {
|
||||||
if (!recordCounts.contains(type)) {
|
if (!recordCounts.contains(record)) {
|
||||||
recordCounts[type] = 0;
|
recordCounts[record] = 0;
|
||||||
}
|
}
|
||||||
recordCounts[type]++;
|
recordCounts[record]++;
|
||||||
|
|
||||||
if (!assetOccurances.isEmpty() && assetOccurances.last().first == type) {
|
if (!assetOccurances.isEmpty() && assetOccurances.last().first == record) {
|
||||||
assetOccurances.last().second++;
|
assetOccurances.last().second++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
QPair<XAssetType, int> assetOccurance(type, 1);
|
QPair<QString, int> assetOccurance(record, 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) {
|
||||||
XAssetType assetType = assetOccurance.first;
|
const QString record = assetOccurance.first;
|
||||||
int assetCount = assetOccurance.second;
|
AssetType assetType = mZoneFile->AssetStrToEnum(record);
|
||||||
|
int assetCount = assetOccurance.second;
|
||||||
QIcon assetIcon = Utils::CreateAssetIcon(assetType);
|
|
||||||
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;
|
||||||
|
}
|
||||||
QTableWidgetItem *recordItem = new QTableWidgetItem(QString::number(assetType, 16));
|
|
||||||
QTableWidgetItem *recordStrItem = new QTableWidgetItem(XAsset::XAssetTypeToString(assetType));
|
QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper());
|
||||||
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(assetCount));
|
QTableWidgetItem *recordStrItem = new QTableWidgetItem(mZoneFile->AssetEnumToStr(assetType));
|
||||||
recordItem->setIcon(assetIcon);
|
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(assetCount));
|
||||||
|
recordItem->setIcon(assetIcon);
|
||||||
ui->tableWidget_RecordOrder->setItem(assetIndex, 0, recordItem);
|
|
||||||
ui->tableWidget_RecordOrder->setItem(assetIndex, 1, recordStrItem);
|
ui->tableWidget_RecordOrder->setItem(assetIndex, 0, recordItem);
|
||||||
ui->tableWidget_RecordOrder->setItem(assetIndex, 2, recordCountItem);
|
ui->tableWidget_RecordOrder->setItem(assetIndex, 1, recordStrItem);
|
||||||
|
ui->tableWidget_RecordOrder->setItem(assetIndex, 2, recordCountItem);
|
||||||
assetIndex++;
|
|
||||||
}
|
assetIndex++;
|
||||||
|
}
|
||||||
int recordIndex = 0;
|
|
||||||
for (XAssetType assetType : recordCounts.keys()) {
|
int recordIndex = 0;
|
||||||
int recordCount = recordCounts[assetType];
|
for (const QString &record : recordCounts.keys()) {
|
||||||
|
int recordCount = recordCounts[record];
|
||||||
QIcon assetIcon = Utils::CreateAssetIcon(assetType);
|
|
||||||
if (assetIcon.isNull()) {
|
AssetType assetType = mZoneFile->AssetStrToEnum(record);
|
||||||
qDebug() << "Icon is null for record: " << assetType;
|
QIcon assetIcon = mZoneFile->AssetTypeToIcon(assetType);
|
||||||
}
|
if (assetIcon.isNull()) {
|
||||||
|
qDebug() << "Icon is null for record: " << record;
|
||||||
ui->tableWidget_RecordCounts->setRowCount(recordIndex + 1);
|
}
|
||||||
|
|
||||||
QTableWidgetItem *recordItem = new QTableWidgetItem(QString::number(assetType, 16));
|
ui->tableWidget_RecordCounts->setRowCount(recordIndex + 1);
|
||||||
QTableWidgetItem *recordCountStrItem = new QTableWidgetItem(XAsset::XAssetTypeToString(assetType));
|
|
||||||
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(recordCount));
|
QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper());
|
||||||
recordItem->setIcon(assetIcon);
|
QTableWidgetItem *recordCountStrItem = new QTableWidgetItem(mZoneFile->AssetEnumToStr(assetType));
|
||||||
|
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(recordCount));
|
||||||
ui->tableWidget_RecordCounts->setItem(recordIndex, 0, recordItem);
|
recordItem->setIcon(assetIcon);
|
||||||
ui->tableWidget_RecordCounts->setItem(recordIndex, 1, recordCountStrItem);
|
|
||||||
ui->tableWidget_RecordCounts->setItem(recordIndex, 2, recordCountItem);
|
ui->tableWidget_RecordCounts->setItem(recordIndex, 0, recordItem);
|
||||||
|
ui->tableWidget_RecordCounts->setItem(recordIndex, 1, recordCountStrItem);
|
||||||
recordIndex++;
|
ui->tableWidget_RecordCounts->setItem(recordIndex, 2, recordCountItem);
|
||||||
}
|
|
||||||
|
recordIndex++;
|
||||||
ui->tableWidget_RecordOrder->resizeColumnsToContents();
|
}
|
||||||
ui->tableWidget_RecordCounts->resizeColumnsToContents();
|
|
||||||
}
|
ui->tableWidget_RecordOrder->resizeColumnsToContents();
|
||||||
|
ui->tableWidget_RecordCounts->resizeColumnsToContents();
|
||||||
|
}
|
||||||
|
|||||||
@ -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(const ZoneFile *aZoneFile);
|
void SetZoneFile(std::shared_ptr<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;
|
||||||
const ZoneFile* mZoneFile;
|
std::shared_ptr<ZoneFile> mZoneFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ZONEFILEVIEWER_H
|
#endif // ZONEFILEVIEWER_H
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -1,30 +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_Cut.png</file>
|
<file>icons/Icon_Copy.png</file>
|
||||||
<file>icons/Icon_Find.png</file>
|
<file>icons/Icon_Cut.png</file>
|
||||||
<file>icons/Icon_NewFile.png</file>
|
<file>icons/Icon_Find.png</file>
|
||||||
<file>icons/Icon_Paste.png</file>
|
<file>icons/Icon_NewFile.png</file>
|
||||||
<file>icons/Icon_Save.png</file>
|
<file>icons/Icon_Paste.png</file>
|
||||||
<file>icons/Icon_OpenFile.png</file>
|
<file>icons/Icon_Save.png</file>
|
||||||
</qresource>
|
<file>icons/Icon_OpenFile.png</file>
|
||||||
</RCC>
|
</qresource>
|
||||||
|
</RCC>
|
||||||
|
|||||||
BIN
data/icons/Icon_Copy.png
Normal file
BIN
data/icons/Icon_Copy.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 316 B |
@ -1,10 +1,13 @@
|
|||||||
#include "compression.h"
|
#include "compression.h"
|
||||||
#include "minilzo.h"
|
#include "minilzo.h"
|
||||||
|
|
||||||
|
#define XBOXAPI __declspec(dllimport)
|
||||||
#include "xcompress.h"
|
#include "xcompress.h"
|
||||||
|
|
||||||
#include <QLibrary>
|
#include <QLibrary>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QDataStream>
|
||||||
|
|
||||||
QByteArray Compression::CompressXMem(const QByteArray &data)
|
QByteArray Compression::CompressXMem(const QByteArray &data)
|
||||||
{
|
{
|
||||||
@ -31,8 +34,7 @@ QByteArray Compression::CompressXMem(const QByteArray &data)
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray Compression::DecompressXMem(const QByteArray &data,
|
QByteArray Compression::DecompressXMem(const QByteArray &data, int flags, int windowSize, int partSize)
|
||||||
int flags, int windowSize, int partSize)
|
|
||||||
{
|
{
|
||||||
if (data.isEmpty())
|
if (data.isEmpty())
|
||||||
return {};
|
return {};
|
||||||
@ -42,49 +44,27 @@ QByteArray Compression::DecompressXMem(const QByteArray &data,
|
|||||||
lzxParams.WindowSize = windowSize;
|
lzxParams.WindowSize = windowSize;
|
||||||
lzxParams.CompressionPartitionSize = partSize;
|
lzxParams.CompressionPartitionSize = partSize;
|
||||||
|
|
||||||
QByteArray internalState(0x94933, Qt::Uninitialized);
|
XMEMDECOMPRESSION_CONTEXT ctx = nullptr;
|
||||||
|
if (FAILED(XMemCreateDecompressionContext(XMEMCODEC_LZX, &lzxParams, 0, &ctx)) || !ctx)
|
||||||
|
return {};
|
||||||
|
|
||||||
XMEMDECOMPRESSION_CONTEXT ctx = XMemInitializeDecompressionContext(
|
// Allocate large enough buffer for decompression (16 MB is a safe upper bound)
|
||||||
XMEMCODEC_LZX, &lzxParams, 1,
|
const SIZE_T kMaxOutSize = 16 * 1024 * 1024;
|
||||||
internalState.data(), internalState.size());
|
QByteArray output(static_cast<int>(kMaxOutSize), Qt::Uninitialized);
|
||||||
|
SIZE_T actualSize = kMaxOutSize;
|
||||||
|
|
||||||
if (!ctx || XMemResetDecompressionContext(ctx)) {
|
HRESULT hr = XMemDecompress(ctx,
|
||||||
qWarning() << "Failed to init LZX context";
|
output.data(), &actualSize,
|
||||||
|
data.constData(), data.size() + 16);
|
||||||
|
|
||||||
|
XMemDestroyDecompressionContext(ctx);
|
||||||
|
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
qWarning() << "XMemDecompress failed with HRESULT:" << hr;
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray output;
|
output.resize(static_cast<int>(actualSize));
|
||||||
output.reserve(16 * 1024 * 1024); // rough guess
|
|
||||||
|
|
||||||
const quint8 *nextIn = reinterpret_cast<const quint8*>(data.constData());
|
|
||||||
SIZE_T availIn = data.size();
|
|
||||||
|
|
||||||
QByteArray scratch(0x10000, Qt::Uninitialized); // 64 KB chunks
|
|
||||||
|
|
||||||
while (availIn > 0) {
|
|
||||||
SIZE_T inSize = availIn; // let XMem tell us how much it will consume
|
|
||||||
SIZE_T outSize = scratch.size(); // max 64 KB per call
|
|
||||||
|
|
||||||
HRESULT hr = XMemDecompressStream(ctx,
|
|
||||||
scratch.data(), &outSize,
|
|
||||||
nextIn, &inSize);
|
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
qWarning() << "XMemDecompressStream failed, hr=" << hr;
|
|
||||||
XMemDestroyDecompressionContext(ctx);
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inSize == 0 && outSize == 0)
|
|
||||||
break; // no progress
|
|
||||||
|
|
||||||
output.append(scratch.constData(), static_cast<int>(outSize));
|
|
||||||
|
|
||||||
nextIn += inSize;
|
|
||||||
availIn -= inSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
XMemDestroyDecompressionContext(ctx);
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,18 +80,19 @@ quint32 Compression::CalculateAdler32Checksum(const QByteArray &data) {
|
|||||||
|
|
||||||
qint64 Compression::FindZlibOffset(const QByteArray &bytes)
|
qint64 Compression::FindZlibOffset(const QByteArray &bytes)
|
||||||
{
|
{
|
||||||
QDataStream stream(bytes);
|
static const QByteArray iwffs("IWffs");
|
||||||
|
auto idx = bytes.indexOf(iwffs);
|
||||||
|
if (idx != -1)
|
||||||
|
return idx + 0x4000;
|
||||||
|
|
||||||
while (!stream.atEnd())
|
const char header = 0x78; // z-lib: 0x78 [FLG]
|
||||||
|
int pos = -1;
|
||||||
|
while ((pos = bytes.indexOf(header, pos + 1)) != -1)
|
||||||
{
|
{
|
||||||
QByteArray testSegment = stream.device()->peek(2).toHex().toUpper();
|
QByteArray window = bytes.mid(pos, 0x20);
|
||||||
if (testSegment == "7801" ||
|
if (!window.contains(QByteArray::fromHex("000000")) &&
|
||||||
testSegment == "785E" ||
|
!window.contains(QByteArray::fromHex("FFFFFF")))
|
||||||
testSegment == "789C" ||
|
return pos;
|
||||||
testSegment == "78DA") {
|
|
||||||
return stream.device()->pos();
|
|
||||||
}
|
|
||||||
stream.skipRawData(1);
|
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -314,12 +295,11 @@ QByteArray Compression::CompressDeflateWithSettings(const QByteArray &aData, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
QByteArray Compression::DecompressLZO(const QByteArray &aCompressedData, quint32 aDestSize) {
|
QByteArray Compression::DecompressLZO(const QByteArray &aCompressedData, quint32 aDestSize) {
|
||||||
QByteArray dst;
|
|
||||||
static bool ok = (lzo_init() == LZO_E_OK);
|
static bool ok = (lzo_init() == LZO_E_OK);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
throw std::runtime_error("lzo_init failed");
|
throw std::runtime_error("lzo_init failed");
|
||||||
|
|
||||||
dst = QByteArray(aDestSize, Qt::Uninitialized);
|
QByteArray dst(aDestSize, Qt::Uninitialized);
|
||||||
lzo_uint out = aDestSize;
|
lzo_uint out = aDestSize;
|
||||||
|
|
||||||
int rc = lzo1x_decompress_safe(
|
int rc = lzo1x_decompress_safe(
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "QtZlib/zlib.h"
|
#include "QtZlib/zlib.h"
|
||||||
|
|
||||||
//#include <windows.h>
|
#include <windows.h>
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
|||||||
@ -3,14 +3,20 @@ TEMPLATE = lib
|
|||||||
CONFIG += staticlib c++17
|
CONFIG += staticlib c++17
|
||||||
DEFINES += MINILZO_USE_STATIC
|
DEFINES += MINILZO_USE_STATIC
|
||||||
|
|
||||||
SOURCES += $$files($$PWD/*.cpp, true) \
|
SOURCES += \
|
||||||
$$files($$PWD/*.c, 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 \
|
||||||
-L$$OUT_PWD/../libs/core -lcore \
|
-L$$OUT_PWD/../libs/core -lcore \
|
||||||
-L$$OUT_PWD/../libs/encryption -lencryption
|
-L$$OUT_PWD/../libs/encryption -lencryption
|
||||||
|
|
||||||
INCLUDEPATH += \
|
INCLUDEPATH += \
|
||||||
$$PWD/../../third_party/xbox_sdk/include \
|
$$PWD/../../third_party/xbox_sdk/include \
|
||||||
|
|||||||
@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
/* get OS and architecture defines */
|
/* get OS and architecture defines */
|
||||||
#ifndef __LZODEFS_H_INCLUDED
|
#ifndef __LZODEFS_H_INCLUDED
|
||||||
#include <lzodefs.h>
|
#include <lzo/lzodefs.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ extern "C" {
|
|||||||
# define LZO_INT_MAX 9223372036854775807LL
|
# define LZO_INT_MAX 9223372036854775807LL
|
||||||
# define LZO_INT_MIN (-1LL - LZO_INT_MAX)
|
# define LZO_INT_MIN (-1LL - LZO_INT_MAX)
|
||||||
# elif (LZO_ABI_IP32L64) /* MIPS R5900 */
|
# elif (LZO_ABI_IP32L64) /* MIPS R5900 */
|
||||||
typedef quint32 lzo_uint;
|
typedef unsigned int lzo_uint;
|
||||||
typedef int lzo_int;
|
typedef int lzo_int;
|
||||||
# define LZO_SIZEOF_LZO_INT LZO_SIZEOF_INT
|
# define LZO_SIZEOF_LZO_INT LZO_SIZEOF_INT
|
||||||
# define LZO_TYPEOF_LZO_INT LZO_TYPEOF_INT
|
# define LZO_TYPEOF_LZO_INT LZO_TYPEOF_INT
|
||||||
|
|||||||
@ -2847,7 +2847,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
# define LZO_TYPEOF_LZO_INT16E_T LZO_TYPEOF_LONG
|
# define LZO_TYPEOF_LZO_INT16E_T LZO_TYPEOF_LONG
|
||||||
#elif (LZO_SIZEOF_INT == 2) && !(LZO_CFG_PREFER_TYPEOF_ACC_INT16E_T == LZO_TYPEOF_SHORT)
|
#elif (LZO_SIZEOF_INT == 2) && !(LZO_CFG_PREFER_TYPEOF_ACC_INT16E_T == LZO_TYPEOF_SHORT)
|
||||||
# define lzo_int16e_t int
|
# define lzo_int16e_t int
|
||||||
# define lzo_uint16e_t quint32
|
# define lzo_uint16e_t unsigned int
|
||||||
# define LZO_TYPEOF_LZO_INT16E_T LZO_TYPEOF_INT
|
# define LZO_TYPEOF_LZO_INT16E_T LZO_TYPEOF_INT
|
||||||
#elif (LZO_SIZEOF_SHORT == 2)
|
#elif (LZO_SIZEOF_SHORT == 2)
|
||||||
# define lzo_int16e_t short int
|
# define lzo_int16e_t short int
|
||||||
@ -2856,14 +2856,14 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
#elif 1 && !(LZO_CFG_TYPE_NO_MODE_HI) && (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x025f00ul) || LZO_CC_LLVM)
|
#elif 1 && !(LZO_CFG_TYPE_NO_MODE_HI) && (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x025f00ul) || LZO_CC_LLVM)
|
||||||
# if !(LZO_LANG_ASSEMBLER)
|
# if !(LZO_LANG_ASSEMBLER)
|
||||||
typedef int lzo_int16e_hi_t__ __attribute__((__mode__(__HI__)));
|
typedef int lzo_int16e_hi_t__ __attribute__((__mode__(__HI__)));
|
||||||
typedef quint32 lzo_uint16e_hi_t__ __attribute__((__mode__(__HI__)));
|
typedef unsigned int lzo_uint16e_hi_t__ __attribute__((__mode__(__HI__)));
|
||||||
# endif
|
# endif
|
||||||
# define lzo_int16e_t lzo_int16e_hi_t__
|
# define lzo_int16e_t lzo_int16e_hi_t__
|
||||||
# define lzo_uint16e_t lzo_uint16e_hi_t__
|
# define lzo_uint16e_t lzo_uint16e_hi_t__
|
||||||
# define LZO_TYPEOF_LZO_INT16E_T LZO_TYPEOF___MODE_HI
|
# define LZO_TYPEOF_LZO_INT16E_T LZO_TYPEOF___MODE_HI
|
||||||
#elif (LZO_SIZEOF___INT16 == 2)
|
#elif (LZO_SIZEOF___INT16 == 2)
|
||||||
# define lzo_int16e_t __int16
|
# define lzo_int16e_t __int16
|
||||||
# define lzo_uint16e_t quint32
|
# define lzo_uint16e_t unsigned __int16
|
||||||
# define LZO_TYPEOF_LZO_INT16E_T LZO_TYPEOF___INT16
|
# define LZO_TYPEOF_LZO_INT16E_T LZO_TYPEOF___INT16
|
||||||
#else
|
#else
|
||||||
#endif
|
#endif
|
||||||
@ -2883,7 +2883,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
# define LZO_TYPEOF_LZO_INT32E_T LZO_TYPEOF_LONG
|
# define LZO_TYPEOF_LZO_INT32E_T LZO_TYPEOF_LONG
|
||||||
#elif (LZO_SIZEOF_INT == 4)
|
#elif (LZO_SIZEOF_INT == 4)
|
||||||
# define lzo_int32e_t int
|
# define lzo_int32e_t int
|
||||||
# define lzo_uint32e_t quint32
|
# define lzo_uint32e_t unsigned int
|
||||||
# define LZO_TYPEOF_LZO_INT32E_T LZO_TYPEOF_INT
|
# define LZO_TYPEOF_LZO_INT32E_T LZO_TYPEOF_INT
|
||||||
#elif (LZO_SIZEOF_SHORT == 4)
|
#elif (LZO_SIZEOF_SHORT == 4)
|
||||||
# define lzo_int32e_t short int
|
# define lzo_int32e_t short int
|
||||||
@ -2896,7 +2896,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
#elif 1 && !(LZO_CFG_TYPE_NO_MODE_SI) && (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x025f00ul) || LZO_CC_LLVM) && (__INT_MAX__+0 > 2147483647L)
|
#elif 1 && !(LZO_CFG_TYPE_NO_MODE_SI) && (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x025f00ul) || LZO_CC_LLVM) && (__INT_MAX__+0 > 2147483647L)
|
||||||
# if !(LZO_LANG_ASSEMBLER)
|
# if !(LZO_LANG_ASSEMBLER)
|
||||||
typedef int lzo_int32e_si_t__ __attribute__((__mode__(__SI__)));
|
typedef int lzo_int32e_si_t__ __attribute__((__mode__(__SI__)));
|
||||||
typedef quint32 lzo_uint32e_si_t__ __attribute__((__mode__(__SI__)));
|
typedef unsigned int lzo_uint32e_si_t__ __attribute__((__mode__(__SI__)));
|
||||||
# endif
|
# endif
|
||||||
# define lzo_int32e_t lzo_int32e_si_t__
|
# define lzo_int32e_t lzo_int32e_si_t__
|
||||||
# define lzo_uint32e_t lzo_uint32e_si_t__
|
# define lzo_uint32e_t lzo_uint32e_si_t__
|
||||||
@ -2904,7 +2904,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
#elif 1 && !(LZO_CFG_TYPE_NO_MODE_SI) && (LZO_CC_GNUC >= 0x025f00ul) && defined(__AVR__) && (__LONG_MAX__+0 == 32767L)
|
#elif 1 && !(LZO_CFG_TYPE_NO_MODE_SI) && (LZO_CC_GNUC >= 0x025f00ul) && defined(__AVR__) && (__LONG_MAX__+0 == 32767L)
|
||||||
# if !(LZO_LANG_ASSEMBLER)
|
# if !(LZO_LANG_ASSEMBLER)
|
||||||
typedef int lzo_int32e_si_t__ __attribute__((__mode__(__SI__)));
|
typedef int lzo_int32e_si_t__ __attribute__((__mode__(__SI__)));
|
||||||
typedef quint32 lzo_uint32e_si_t__ __attribute__((__mode__(__SI__)));
|
typedef unsigned int lzo_uint32e_si_t__ __attribute__((__mode__(__SI__)));
|
||||||
# endif
|
# endif
|
||||||
# define lzo_int32e_t lzo_int32e_si_t__
|
# define lzo_int32e_t lzo_int32e_si_t__
|
||||||
# define lzo_uint32e_t lzo_uint32e_si_t__
|
# define lzo_uint32e_t lzo_uint32e_si_t__
|
||||||
@ -2913,7 +2913,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
# define LZO_TYPEOF_LZO_INT32E_T LZO_TYPEOF___MODE_SI
|
# define LZO_TYPEOF_LZO_INT32E_T LZO_TYPEOF___MODE_SI
|
||||||
#elif (LZO_SIZEOF___INT32 == 4)
|
#elif (LZO_SIZEOF___INT32 == 4)
|
||||||
# define lzo_int32e_t __int32
|
# define lzo_int32e_t __int32
|
||||||
# define lzo_uint32e_t quint32
|
# define lzo_uint32e_t unsigned __int32
|
||||||
# define LZO_TYPEOF_LZO_INT32E_T LZO_TYPEOF___INT32
|
# define LZO_TYPEOF_LZO_INT32E_T LZO_TYPEOF___INT32
|
||||||
#else
|
#else
|
||||||
#endif
|
#endif
|
||||||
@ -2937,7 +2937,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
#endif
|
#endif
|
||||||
#if (LZO_SIZEOF_INT == 8) && (LZO_SIZEOF_INT < LZO_SIZEOF_LONG)
|
#if (LZO_SIZEOF_INT == 8) && (LZO_SIZEOF_INT < LZO_SIZEOF_LONG)
|
||||||
# define lzo_int64e_t int
|
# define lzo_int64e_t int
|
||||||
# define lzo_uint64e_t quint32
|
# define lzo_uint64e_t unsigned int
|
||||||
# define LZO_TYPEOF_LZO_INT64E_T LZO_TYPEOF_INT
|
# define LZO_TYPEOF_LZO_INT64E_T LZO_TYPEOF_INT
|
||||||
#elif (LZO_SIZEOF_LONG == 8) && !(LZO_CFG_PREFER_TYPEOF_ACC_INT64E_T == LZO_TYPEOF_LONG_LONG) && !(LZO_CFG_PREFER_TYPEOF_ACC_INT64E_T == LZO_TYPEOF___INT64)
|
#elif (LZO_SIZEOF_LONG == 8) && !(LZO_CFG_PREFER_TYPEOF_ACC_INT64E_T == LZO_TYPEOF_LONG_LONG) && !(LZO_CFG_PREFER_TYPEOF_ACC_INT64E_T == LZO_TYPEOF___INT64)
|
||||||
# define lzo_int64e_t long int
|
# define lzo_int64e_t long int
|
||||||
@ -2984,7 +2984,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
# define LZO_TYPEOF_LZO_INT32L_T LZO_TYPEOF_LZO_INT32E_T
|
# define LZO_TYPEOF_LZO_INT32L_T LZO_TYPEOF_LZO_INT32E_T
|
||||||
#elif (LZO_SIZEOF_INT >= 4) && (LZO_SIZEOF_INT < LZO_SIZEOF_LONG)
|
#elif (LZO_SIZEOF_INT >= 4) && (LZO_SIZEOF_INT < LZO_SIZEOF_LONG)
|
||||||
# define lzo_int32l_t int
|
# define lzo_int32l_t int
|
||||||
# define lzo_uint32l_t quint32
|
# define lzo_uint32l_t unsigned int
|
||||||
# define LZO_SIZEOF_LZO_INT32L_T LZO_SIZEOF_INT
|
# define LZO_SIZEOF_LZO_INT32L_T LZO_SIZEOF_INT
|
||||||
# define LZO_TYPEOF_LZO_INT32L_T LZO_SIZEOF_INT
|
# define LZO_TYPEOF_LZO_INT32L_T LZO_SIZEOF_INT
|
||||||
#elif (LZO_SIZEOF_LONG >= 4)
|
#elif (LZO_SIZEOF_LONG >= 4)
|
||||||
@ -3057,7 +3057,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
#elif (LZO_CC_MSC && (_MSC_VER >= 1300) && (LZO_SIZEOF_VOID_P == 4) && (LZO_SIZEOF_INT == 4))
|
#elif (LZO_CC_MSC && (_MSC_VER >= 1300) && (LZO_SIZEOF_VOID_P == 4) && (LZO_SIZEOF_INT == 4))
|
||||||
# if !(LZO_LANG_ASSEMBLER)
|
# if !(LZO_LANG_ASSEMBLER)
|
||||||
typedef __w64 int lzo_intptr_t;
|
typedef __w64 int lzo_intptr_t;
|
||||||
typedef __w64 quint32 lzo_uintptr_t;
|
typedef __w64 unsigned int lzo_uintptr_t;
|
||||||
# endif
|
# endif
|
||||||
# define lzo_intptr_t lzo_intptr_t
|
# define lzo_intptr_t lzo_intptr_t
|
||||||
# define lzo_uintptr_t lzo_uintptr_t
|
# define lzo_uintptr_t lzo_uintptr_t
|
||||||
@ -3070,7 +3070,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
# define LZO_TYPEOF_LZO_INTPTR_T LZO_TYPEOF_SHORT
|
# define LZO_TYPEOF_LZO_INTPTR_T LZO_TYPEOF_SHORT
|
||||||
#elif (LZO_SIZEOF_INT >= LZO_SIZEOF_VOID_P) && (LZO_SIZEOF_INT < LZO_SIZEOF_LONG)
|
#elif (LZO_SIZEOF_INT >= LZO_SIZEOF_VOID_P) && (LZO_SIZEOF_INT < LZO_SIZEOF_LONG)
|
||||||
# define lzo_intptr_t int
|
# define lzo_intptr_t int
|
||||||
# define lzo_uintptr_t quint32
|
# define lzo_uintptr_t unsigned int
|
||||||
# define LZO_SIZEOF_LZO_INTPTR_T LZO_SIZEOF_INT
|
# define LZO_SIZEOF_LZO_INTPTR_T LZO_SIZEOF_INT
|
||||||
# define LZO_TYPEOF_LZO_INTPTR_T LZO_TYPEOF_INT
|
# define LZO_TYPEOF_LZO_INTPTR_T LZO_TYPEOF_INT
|
||||||
#elif (LZO_SIZEOF_LONG >= LZO_SIZEOF_VOID_P)
|
#elif (LZO_SIZEOF_LONG >= LZO_SIZEOF_VOID_P)
|
||||||
@ -3104,7 +3104,7 @@ LZO_COMPILE_TIME_ASSERT_HEADER(LZO_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
|
|||||||
# define LZO_SIZEOF_LZO_WORD_T LZO_SIZEOF_LONG
|
# define LZO_SIZEOF_LZO_WORD_T LZO_SIZEOF_LONG
|
||||||
# define LZO_TYPEOF_LZO_WORD_T LZO_TYPEOF_LONG
|
# define LZO_TYPEOF_LZO_WORD_T LZO_TYPEOF_LONG
|
||||||
#elif (LZO_WORDSIZE == LZO_SIZEOF_INT)
|
#elif (LZO_WORDSIZE == LZO_SIZEOF_INT)
|
||||||
# define lzo_word_t quint32
|
# define lzo_word_t unsigned int
|
||||||
# define lzo_sword_t int
|
# define lzo_sword_t int
|
||||||
# define LZO_SIZEOF_LZO_WORD_T LZO_SIZEOF_INT
|
# define LZO_SIZEOF_LZO_WORD_T LZO_SIZEOF_INT
|
||||||
# define LZO_TYPEOF_LZO_WORD_T LZO_TYPEOF_INT
|
# define LZO_TYPEOF_LZO_WORD_T LZO_TYPEOF_INT
|
||||||
|
|||||||
@ -25,6 +25,12 @@
|
|||||||
http://www.oberhumer.com/opensource/lzo/
|
http://www.oberhumer.com/opensource/lzo/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE:
|
||||||
|
* the full LZO package can be found at
|
||||||
|
* http://www.oberhumer.com/opensource/lzo/
|
||||||
|
*/
|
||||||
|
|
||||||
#define __LZO_IN_MINILZO 1
|
#define __LZO_IN_MINILZO 1
|
||||||
|
|
||||||
#if defined(LZO_CFG_FREESTANDING)
|
#if defined(LZO_CFG_FREESTANDING)
|
||||||
|
|||||||
@ -25,6 +25,13 @@
|
|||||||
http://www.oberhumer.com/opensource/lzo/
|
http://www.oberhumer.com/opensource/lzo/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE:
|
||||||
|
* the full LZO package can be found at
|
||||||
|
* http://www.oberhumer.com/opensource/lzo/
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __MINILZO_H_INCLUDED
|
#ifndef __MINILZO_H_INCLUDED
|
||||||
#define __MINILZO_H_INCLUDED 1
|
#define __MINILZO_H_INCLUDED 1
|
||||||
|
|
||||||
|
|||||||
@ -2,15 +2,23 @@ QT += core widgets
|
|||||||
TEMPLATE = lib
|
TEMPLATE = lib
|
||||||
CONFIG += staticlib c++17
|
CONFIG += staticlib c++17
|
||||||
|
|
||||||
SOURCES += $$files($$PWD/*.cpp, true) \
|
SOURCES += \
|
||||||
xdatastream.cpp
|
highlighter_cfg.cpp \
|
||||||
HEADERS += $$files($$PWD/*.h, true) \
|
highlighter_shock.cpp \
|
||||||
xdatastream.h
|
highlighter_rumble.cpp \
|
||||||
|
highlighter_gsc.cpp \
|
||||||
|
logmanager.cpp \
|
||||||
|
statusbarmanager.cpp
|
||||||
|
|
||||||
LIBS += -L$$OUT_PWD/../libs/xassets -lxassets
|
HEADERS += \
|
||||||
|
enums.h \
|
||||||
INCLUDEPATH += $$PWD/../xassets
|
highlighter_cfg.h \
|
||||||
|
highlighter_shock.h \
|
||||||
DEPENDPATH += $$PWD/../xassets
|
highlighter_rumble.h \
|
||||||
|
highlighter_gsc.h \
|
||||||
|
logmanager.h \
|
||||||
|
stringutils.h \
|
||||||
|
utils.h \
|
||||||
|
statusbarmanager.h
|
||||||
|
|
||||||
DESTDIR = $$OUT_PWD/../
|
DESTDIR = $$OUT_PWD/../
|
||||||
|
|||||||
@ -3,10 +3,32 @@
|
|||||||
|
|
||||||
#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
|
||||||
IWI_VERSION_COD5 = 0x06, // 06 CoD5
|
IWI_VERSION_COD5 = 0x06, // 06 CoD5
|
||||||
IWI_VERSION_CODMW2 = 0x08, // 08 CoDMW2
|
IWI_VERSION_CODMW2 = 0x08, // 08 CoDMW2
|
||||||
IWI_VERSION_CODMW3 = 0x08, // 08 CoDMW3
|
IWI_VERSION_CODMW3 = 0x08, // 08 CoDMW3
|
||||||
IWI_VERSION_CODBO1 = 0x0D, // 13 CoDBO1
|
IWI_VERSION_CODBO1 = 0x0D, // 13 CoDBO1
|
||||||
@ -16,37 +38,37 @@ enum IWI_VERSION {
|
|||||||
enum IWI_FORMAT {
|
enum IWI_FORMAT {
|
||||||
// IWI Format
|
// IWI Format
|
||||||
IWI_FORMAT_ARGB32 = 0x01, // 01 ARGB32
|
IWI_FORMAT_ARGB32 = 0x01, // 01 ARGB32
|
||||||
IWI_FORMAT_RGB24 = 0x02, // 02 RGB24
|
IWI_FORMAT_RGB24 = 0x02, // 02 RGB24
|
||||||
IWI_FORMAT_GA16 = 0x03, // 03 GA16
|
IWI_FORMAT_GA16 = 0x03, // 03 GA16
|
||||||
IWI_FORMAT_A8 = 0x04, // 04 A8
|
IWI_FORMAT_A8 = 0x04, // 04 A8
|
||||||
IWI_FORMAT_DXT1 = 0x0B, // 11 DXT1
|
IWI_FORMAT_DXT1 = 0x0B, // 11 DXT1
|
||||||
IWI_FORMAT_DXT3 = 0x0C, // 12 DXT3
|
IWI_FORMAT_DXT3 = 0x0C, // 12 DXT3
|
||||||
IWI_FORMAT_DXT5 = 0x0D // 13 DXT5
|
IWI_FORMAT_DXT5 = 0x0D // 13 DXT5
|
||||||
};
|
};
|
||||||
|
|
||||||
enum DDS_FLAGS {
|
enum DDS_FLAGS {
|
||||||
DDSD_CAPS = 0x1,
|
DDSD_CAPS = 0x1,
|
||||||
DDSD_HEIGHT = 0x2,
|
DDSD_HEIGHT = 0x2,
|
||||||
DDSD_WIDTH = 0x4,
|
DDSD_WIDTH = 0x4,
|
||||||
DDSD_PITCH = 0x8,
|
DDSD_PITCH = 0x8,
|
||||||
DDSD_PIXELFORMAT = 0x1000,
|
DDSD_PIXELFORMAT = 0x1000,
|
||||||
DDSD_MIPMAPCOUNT = 0x20000,
|
DDSD_MIPMAPCOUNT = 0x20000,
|
||||||
DDSD_LINEARSIZE = 0x80000,
|
DDSD_LINEARSIZE = 0x80000,
|
||||||
DDSD_DEPTH = 0x800000
|
DDSD_DEPTH = 0x800000
|
||||||
};
|
};
|
||||||
|
|
||||||
enum DDS_PIXELFORMAT_FLAGS {
|
enum DDS_PIXELFORMAT_FLAGS {
|
||||||
DDPF_ALPHAPIXELS = 0x1,
|
DDPF_ALPHAPIXELS = 0x1,
|
||||||
DDPF_ALPHA = 0x2,
|
DDPF_ALPHA = 0x2,
|
||||||
DDPF_FOURCC = 0x4,
|
DDPF_FOURCC = 0x4,
|
||||||
DDPF_RGB = 0x40,
|
DDPF_RGB = 0x40,
|
||||||
DDPF_YUV = 0x200,
|
DDPF_YUV = 0x200,
|
||||||
DDPF_LUMINANCE = 0x20000
|
DDPF_LUMINANCE = 0x20000
|
||||||
};
|
};
|
||||||
|
|
||||||
enum DDS_CAPS_FLAGS {
|
enum DDS_CAPS_FLAGS {
|
||||||
DDSCAPS_COMPLEX = 0x8,
|
DDSCAPS_COMPLEX = 0x8,
|
||||||
DDSCAPS_MIPMAP = 0x400000,
|
DDSCAPS_MIPMAP = 0x400000,
|
||||||
DDSCAPS_TEXTURE = 0x1000
|
DDSCAPS_TEXTURE = 0x1000
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -189,15 +211,15 @@ enum MENU_ITEM_TYPE {
|
|||||||
ITEM_TYPE_RADIOBUTTON = 2, // toggle button, may be grouped
|
ITEM_TYPE_RADIOBUTTON = 2, // toggle button, may be grouped
|
||||||
ITEM_TYPE_CHECKBOX = 3, // check box
|
ITEM_TYPE_CHECKBOX = 3, // check box
|
||||||
ITEM_TYPE_EDITFIELD = 4, // editable text, associated with a dvar
|
ITEM_TYPE_EDITFIELD = 4, // editable text, associated with a dvar
|
||||||
ITEM_TYPE_COMBO = 5, // drop down list
|
ITEM_TYPE_COMBO = 5, // drop down list
|
||||||
ITEM_TYPE_LISTBOX = 6, // scrollable list
|
ITEM_TYPE_LISTBOX = 6, // scrollable list
|
||||||
ITEM_TYPE_MODEL = 7, // model
|
ITEM_TYPE_MODEL = 7, // model
|
||||||
ITEM_TYPE_OWNERDRAW = 8, // owner draw, name specs what it is
|
ITEM_TYPE_OWNERDRAW = 8, // owner draw, name specs what it is
|
||||||
ITEM_TYPE_NUMERICFIELD = 9, // editable text, associated with a dvar
|
ITEM_TYPE_NUMERICFIELD = 9, // editable text, associated with a dvar
|
||||||
ITEM_TYPE_SLIDER = 10, // mouse speed, volume, etc.
|
ITEM_TYPE_SLIDER = 10, // mouse speed, volume, etc.
|
||||||
ITEM_TYPE_YESNO = 11, // yes no dvar setting
|
ITEM_TYPE_YESNO = 11, // yes no dvar setting
|
||||||
ITEM_TYPE_MULTI = 12, // multiple list setting, enumerated
|
ITEM_TYPE_MULTI = 12, // multiple list setting, enumerated
|
||||||
ITEM_TYPE_DVARENUM = 13, // multiple list setting, enumerated from a dvar
|
ITEM_TYPE_DVARENUM = 13, // multiple list setting, enumerated from a dvar
|
||||||
ITEM_TYPE_BIND = 14, // bind
|
ITEM_TYPE_BIND = 14, // bind
|
||||||
ITEM_TYPE_MENUMODEL = 15, // special menu model
|
ITEM_TYPE_MENUMODEL = 15, // special menu model
|
||||||
ITEM_TYPE_VALIDFILEFIELD = 16, // text must be valid for use in a dos filename
|
ITEM_TYPE_VALIDFILEFIELD = 16, // text must be valid for use in a dos filename
|
||||||
@ -410,7 +432,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_GameFontMALL = 3,
|
UI_FONT_SMALL = 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,
|
||||||
|
|||||||
@ -2,19 +2,15 @@
|
|||||||
#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 <QMetaEnum>
|
#include <QString>
|
||||||
|
#include <QtZlib/zlib.h>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QMessageBox>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QCryptographicHash>
|
#include <QCryptographicHash>
|
||||||
|
|
||||||
class Utils : public QObject {
|
class Utils {
|
||||||
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();
|
||||||
@ -34,29 +30,6 @@ 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;
|
||||||
@ -223,7 +196,7 @@ public:
|
|||||||
|
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
static bool ReadUntilString(XDataStream* stream, const QString& targetString) {
|
static bool ReadUntilString(QDataStream* stream, const QString& targetString) {
|
||||||
if (!stream || targetString.isEmpty()) {
|
if (!stream || targetString.isEmpty()) {
|
||||||
return false; // Invalid input
|
return false; // Invalid input
|
||||||
}
|
}
|
||||||
@ -257,7 +230,7 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ReadUntilHex(XDataStream* stream, const QString& hexString) {
|
static bool ReadUntilHex(QDataStream* stream, const QString& hexString) {
|
||||||
if (!stream || hexString.isEmpty() || hexString.size() % 2 != 0) {
|
if (!stream || hexString.isEmpty() || hexString.size() % 2 != 0) {
|
||||||
return false; // Invalid input
|
return false; // Invalid input
|
||||||
}
|
}
|
||||||
@ -407,6 +380,34 @@ 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:
|
||||||
|
|||||||
@ -1,243 +0,0 @@
|
|||||||
#include "xdatastream.h"
|
|
||||||
|
|
||||||
#include <QIODevice>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
XDataStream::XDataStream(QIODevice *aDevice)
|
|
||||||
: QDataStream(aDevice)
|
|
||||||
, mDebug(false)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
XDataStream::XDataStream()
|
|
||||||
: QDataStream()
|
|
||||||
, mDebug(false)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
XDataStream::XDataStream(const QByteArray &aData)
|
|
||||||
: QDataStream(aData)
|
|
||||||
, mDebug(false)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
XDataStream::XDataStream(QByteArray *aData, OpenMode aFlags)
|
|
||||||
: QDataStream(aData, aFlags)
|
|
||||||
, mDebug(false)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
XDataStream::~XDataStream()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void XDataStream::SetDebug(bool aDebug)
|
|
||||||
{
|
|
||||||
mDebug = aDebug;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint8 XDataStream::ParseInt8(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
qint8 val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
quint8 XDataStream::ParseUInt8(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
quint8 val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint16 XDataStream::ParseInt16(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
qint16 val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
quint16 XDataStream::ParseUInt16(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
quint16 val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint32 XDataStream::ParseInt32(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
qint32 val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
quint32 XDataStream::ParseUInt32(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
quint32 val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 XDataStream::ParseInt64(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
qint64 val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
quint64 XDataStream::ParseUInt64(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
quint64 val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
float XDataStream::ParseSingle(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
|
|
||||||
float val;
|
|
||||||
quint32 rawVal;
|
|
||||||
*this >> rawVal;
|
|
||||||
memcpy(&val, &rawVal, sizeof(val));
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
double XDataStream::ParseDouble(const QString& aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
float val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool XDataStream::ParseBool(const QString &aDebugString)
|
|
||||||
{
|
|
||||||
qint64 start = this->device()->pos();
|
|
||||||
|
|
||||||
char val;
|
|
||||||
*this >> val;
|
|
||||||
|
|
||||||
if (mDebug)
|
|
||||||
{
|
|
||||||
qDebug() << QString("[%1-%2] Parsed %3: %4")
|
|
||||||
.arg(start, 10, 10, QChar('0'))
|
|
||||||
.arg(this->device()->pos(), 10, 10, QChar('0'))
|
|
||||||
.arg(aDebugString)
|
|
||||||
.arg(val);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
#ifndef XDATASTREAM_H
|
|
||||||
#define XDATASTREAM_H
|
|
||||||
|
|
||||||
#include <QDataStream>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
class XDataStream : public QDataStream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit XDataStream(QIODevice* aDevice);
|
|
||||||
XDataStream();
|
|
||||||
XDataStream(const QByteArray& aData);
|
|
||||||
XDataStream(QByteArray* aData, OpenMode aFlags);
|
|
||||||
~XDataStream();
|
|
||||||
|
|
||||||
void SetDebug(bool aDebug = true);
|
|
||||||
|
|
||||||
qint8 ParseInt8(const QString& aDebugString = "");
|
|
||||||
quint8 ParseUInt8(const QString& aDebugString = "");
|
|
||||||
qint16 ParseInt16(const QString& aDebugString = "");
|
|
||||||
quint16 ParseUInt16(const QString& aDebugString = "");
|
|
||||||
qint32 ParseInt32(const QString& aDebugString = "");
|
|
||||||
quint32 ParseUInt32(const QString& aDebugString = "");
|
|
||||||
qint64 ParseInt64(const QString& aDebugString = "");
|
|
||||||
quint64 ParseUInt64(const QString& aDebugString = "");
|
|
||||||
float ParseSingle(const QString& aDebugString = "");
|
|
||||||
double ParseDouble(const QString& aDebugString = "");
|
|
||||||
bool ParseBool(const QString& aDebugString = "");
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool mDebug;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // XDATASTREAM_H
|
|
||||||
@ -35,7 +35,7 @@ DDSPixelFormat DDSFile::CalculatePixelFormat(quint8 aIWIFormat) {
|
|||||||
return ddsPixelFormat;
|
return ddsPixelFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DDSFile::SetupExportDirs() const {
|
void DDSFile::SetupExportDirs() {
|
||||||
QDir dir = QDir::currentPath();
|
QDir dir = QDir::currentPath();
|
||||||
if (!dir.exists("exports/")) {
|
if (!dir.exists("exports/")) {
|
||||||
dir.mkdir("exports/");
|
dir.mkdir("exports/");
|
||||||
@ -89,92 +89,92 @@ DDSFile::DDSFile(const QString &aFilePath)
|
|||||||
}
|
}
|
||||||
|
|
||||||
DDSFile::DDSFile(const QByteArray aDDSData, const QString aFileStem) {
|
DDSFile::DDSFile(const QByteArray aDDSData, const QString aFileStem) {
|
||||||
// QDataStream ddsIn(aDDSData);
|
QDataStream ddsIn(aDDSData);
|
||||||
// ddsIn.setByteOrder(QDataStream::LittleEndian);
|
ddsIn.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
|
||||||
// DDSHeader ddsHeader;
|
DDSHeader ddsHeader;
|
||||||
// if (ddsIn.readRawData(reinterpret_cast<char*>(&ddsHeader), sizeof(DDSHeader)) != sizeof(DDSHeader)) {
|
if (ddsIn.readRawData(reinterpret_cast<char*>(&ddsHeader), sizeof(DDSHeader)) != sizeof(DDSHeader)) {
|
||||||
// qDebug() << "Error: Failed to read DDSHeader from QByteArray!";
|
qDebug() << "Error: Failed to read DDSHeader from QByteArray!";
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// fileStem = aFileStem;
|
fileStem = aFileStem;
|
||||||
// header = ddsHeader;
|
header = ddsHeader;
|
||||||
|
|
||||||
// // Ensure DevIL is initialized once globally
|
// Ensure DevIL is initialized once globally
|
||||||
// static bool devilInitialized = false;
|
static bool devilInitialized = false;
|
||||||
// if (!devilInitialized) {
|
if (!devilInitialized) {
|
||||||
// ilInit();
|
ilInit();
|
||||||
// devilInitialized = true;
|
devilInitialized = true;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // Generate and bind an image
|
// Generate and bind an image
|
||||||
// ILuint imageID;
|
ILuint imageID;
|
||||||
// ilGenImages(1, &imageID);
|
ilGenImages(1, &imageID);
|
||||||
// ilBindImage(imageID);
|
ilBindImage(imageID);
|
||||||
|
|
||||||
// ilEnable(IL_ORIGIN_SET);
|
ilEnable(IL_ORIGIN_SET);
|
||||||
// ilOriginFunc(IL_ORIGIN_UPPER_LEFT);
|
ilOriginFunc(IL_ORIGIN_UPPER_LEFT);
|
||||||
|
|
||||||
// // Load DDS file
|
// Load DDS file
|
||||||
// if (!ilLoadL(IL_DDS, aDDSData.constData(), aDDSData.size())) {
|
if (!ilLoadL(IL_DDS, aDDSData.constData(), aDDSData.size())) {
|
||||||
// ILuint devilError = ilGetError();
|
ILuint devilError = ilGetError();
|
||||||
// qDebug() << "DevIL Error while loading DDS: " << devilError;
|
qDebug() << "DevIL Error while loading DDS: " << devilError;
|
||||||
// ilDeleteImages(1, &imageID);
|
ilDeleteImages(1, &imageID);
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // Get mipmap count
|
// Get mipmap count
|
||||||
// ILint numMipmaps = ilGetInteger(IL_NUM_MIPMAPS);
|
ILint numMipmaps = ilGetInteger(IL_NUM_MIPMAPS);
|
||||||
// qDebug() << "Number of mipmaps: " << numMipmaps;
|
qDebug() << "Number of mipmaps: " << numMipmaps;
|
||||||
|
|
||||||
// // Loop over all mipmap levels (0 is the base image)
|
// Loop over all mipmap levels (0 is the base image)
|
||||||
// for (ILint level = 0; level <= numMipmaps; ++level) {
|
for (ILint level = 0; level <= numMipmaps; ++level) {
|
||||||
// ilBindImage(imageID);
|
ilBindImage(imageID);
|
||||||
// if (!ilActiveMipmap(level)) {
|
if (!ilActiveMipmap(level)) {
|
||||||
// qDebug() << "DevIL failed to activate mipmap level" << level;
|
qDebug() << "DevIL failed to activate mipmap level" << level;
|
||||||
// continue;
|
continue;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // Get mipmap properties
|
// Get mipmap properties
|
||||||
// int width = ilGetInteger(IL_IMAGE_WIDTH);
|
int width = ilGetInteger(IL_IMAGE_WIDTH);
|
||||||
// int height = ilGetInteger(IL_IMAGE_HEIGHT);
|
int height = ilGetInteger(IL_IMAGE_HEIGHT);
|
||||||
// int depth = ilGetInteger(IL_IMAGE_DEPTH);
|
int depth = ilGetInteger(IL_IMAGE_DEPTH);
|
||||||
// int format = ilGetInteger(IL_IMAGE_FORMAT);
|
int format = ilGetInteger(IL_IMAGE_FORMAT);
|
||||||
// int bpp = 0;
|
int bpp = 0;
|
||||||
|
|
||||||
// switch (format) {
|
switch (format) {
|
||||||
// case IL_RGB:
|
case IL_RGB:
|
||||||
// bpp = 3;
|
bpp = 3;
|
||||||
// break;
|
break;
|
||||||
// case IL_RGBA:
|
case IL_RGBA:
|
||||||
// bpp = 4;
|
bpp = 4;
|
||||||
// break;
|
break;
|
||||||
// default:
|
default:
|
||||||
// qDebug() << "Unsupported image format.";
|
qDebug() << "Unsupported image format.";
|
||||||
// continue;
|
continue;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// int dataSize = width * height * depth * bpp;
|
int dataSize = width * height * depth * bpp;
|
||||||
|
|
||||||
// ILubyte *data = ilGetData();
|
ILubyte *data = ilGetData();
|
||||||
// if (!data) {
|
if (!data) {
|
||||||
// qDebug() << "Error: DevIL returned null data for mipmap level" << level;
|
qDebug() << "Error: DevIL returned null data for mipmap level" << level;
|
||||||
// continue;
|
continue;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // Create a mipmap structure
|
// Create a mipmap structure
|
||||||
// DDSMipmap mipmap;
|
DDSMipmap mipmap;
|
||||||
// mipmap.width = width;
|
mipmap.width = width;
|
||||||
// mipmap.height = height;
|
mipmap.height = height;
|
||||||
// mipmap.data = QByteArray(reinterpret_cast<const char*>(data), dataSize);
|
mipmap.data = QByteArray(reinterpret_cast<const char*>(data), dataSize);
|
||||||
// mipmap.size = dataSize;
|
mipmap.size = dataSize;
|
||||||
|
|
||||||
// // Store in DDS file
|
// Store in DDS file
|
||||||
// mipmaps.append(mipmap);
|
mipmaps.append(mipmap);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// ilDeleteImages(1, &imageID);
|
ilDeleteImages(1, &imageID);
|
||||||
}
|
}
|
||||||
|
|
||||||
DDSFile::DDSFile(const DDSFile &ddsFile) :
|
DDSFile::DDSFile(const DDSFile &ddsFile) :
|
||||||
@ -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() const {
|
bool DDSFile::SaveDDS() {
|
||||||
SetupExportDirs();
|
SetupExportDirs();
|
||||||
|
|
||||||
QFile file("exports/dds/" + fileStem + ".dds");
|
QFile file("exports/dds/" + fileStem + ".dds");
|
||||||
@ -268,7 +268,7 @@ bool DDSFile::SaveDDS() const {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DDSFile::SaveIWI() const {
|
bool DDSFile::SaveIWI() {
|
||||||
SetupExportDirs();
|
SetupExportDirs();
|
||||||
|
|
||||||
IWIFile iwiFile(*this);
|
IWIFile iwiFile(*this);
|
||||||
@ -279,7 +279,7 @@ bool DDSFile::SaveIWI() const {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DDSFile::SavePNG() const {
|
bool DDSFile::SavePNG() {
|
||||||
SetupExportDirs();
|
SetupExportDirs();
|
||||||
|
|
||||||
int mipmapIndex = 1;
|
int mipmapIndex = 1;
|
||||||
@ -311,7 +311,7 @@ bool DDSFile::SavePNG() const {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DDSFile::SaveJPG() const {
|
bool DDSFile::SaveJPG() {
|
||||||
SetupExportDirs();
|
SetupExportDirs();
|
||||||
|
|
||||||
int mipmapIndex = 1;
|
int mipmapIndex = 1;
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
//#include <IL/il.h>
|
#include <IL/il.h>
|
||||||
|
|
||||||
struct DDSPixelFormat {
|
struct DDSPixelFormat {
|
||||||
quint32 size;
|
quint32 size;
|
||||||
@ -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() const;
|
bool SaveDDS();
|
||||||
bool SaveIWI() const;
|
bool SaveIWI();
|
||||||
bool SavePNG() const;
|
bool SavePNG();
|
||||||
bool SaveJPG() const;
|
bool SaveJPG();
|
||||||
|
|
||||||
void SetupExportDirs() const;
|
void SetupExportDirs();
|
||||||
static DDSPixelFormat CalculatePixelFormat(quint8 aIWIFormat);
|
static DDSPixelFormat CalculatePixelFormat(quint8 aIWIFormat);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -2,21 +2,26 @@ QT += core
|
|||||||
TEMPLATE = lib
|
TEMPLATE = lib
|
||||||
CONFIG += staticlib c++17
|
CONFIG += staticlib c++17
|
||||||
|
|
||||||
SOURCES += $$files($$PWD/*.cpp, true)
|
SOURCES += \
|
||||||
HEADERS += $$files($$PWD/*.h, true)
|
ddsfile.cpp
|
||||||
|
|
||||||
|
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 \
|
||||||
#-L$$PWD/../../third_party/devil_sdk/lib/ -lILU \
|
-L$$PWD/../../third_party/devil_sdk/lib/ -lILU \
|
||||||
#-L$$PWD/../../third_party/devil_sdk/lib/ -lILUT \
|
-L$$PWD/../../third_party/devil_sdk/lib/ -lILUT \
|
||||||
-L$$OUT_PWD/../libs/iwifile -liwifile
|
-L$$OUT_PWD/../libs/iwifile -liwifile
|
||||||
|
|
||||||
INCLUDEPATH += \
|
INCLUDEPATH += \
|
||||||
$$PWD/../iwifile/ \
|
$$PWD/../iwifile/ \
|
||||||
#$$PWD/../../third_party/devil_sdk/include/
|
$$PWD/../../third_party/devil_sdk/include/
|
||||||
|
|
||||||
DEPENDPATH += \
|
DEPENDPATH += \
|
||||||
$$PWD/../iwifile/ \
|
$$PWD/../iwifile/ \
|
||||||
#$$PWD/../../third_party/devil_sdk/include/
|
$$PWD/../../third_party/devil_sdk/include/
|
||||||
|
|
||||||
DESTDIR = $$OUT_PWD/../
|
DESTDIR = $$OUT_PWD/../
|
||||||
|
|||||||
@ -24,9 +24,9 @@ enum FF_GAME {
|
|||||||
};
|
};
|
||||||
|
|
||||||
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
|
||||||
IWI_VERSION_COD5 = 0x06, // 06 CoD5
|
IWI_VERSION_COD5 = 0x06, // 06 CoD5
|
||||||
IWI_VERSION_CODMW2 = 0x08, // 08 CoDMW2
|
IWI_VERSION_CODMW2 = 0x08, // 08 CoDMW2
|
||||||
IWI_VERSION_CODMW3 = 0x08, // 08 CoDMW3
|
IWI_VERSION_CODMW3 = 0x08, // 08 CoDMW3
|
||||||
IWI_VERSION_CODBO1 = 0x0D, // 13 CoDBO1
|
IWI_VERSION_CODBO1 = 0x0D, // 13 CoDBO1
|
||||||
@ -36,37 +36,37 @@ enum IWI_VERSION {
|
|||||||
enum IWI_FORMAT {
|
enum IWI_FORMAT {
|
||||||
// IWI Format
|
// IWI Format
|
||||||
IWI_FORMAT_ARGB32 = 0x01, // 01 ARGB32
|
IWI_FORMAT_ARGB32 = 0x01, // 01 ARGB32
|
||||||
IWI_FORMAT_RGB24 = 0x02, // 02 RGB24
|
IWI_FORMAT_RGB24 = 0x02, // 02 RGB24
|
||||||
IWI_FORMAT_GA16 = 0x03, // 03 GA16
|
IWI_FORMAT_GA16 = 0x03, // 03 GA16
|
||||||
IWI_FORMAT_A8 = 0x04, // 04 A8
|
IWI_FORMAT_A8 = 0x04, // 04 A8
|
||||||
IWI_FORMAT_DXT1 = 0x0B, // 11 DXT1
|
IWI_FORMAT_DXT1 = 0x0B, // 11 DXT1
|
||||||
IWI_FORMAT_DXT3 = 0x0C, // 12 DXT3
|
IWI_FORMAT_DXT3 = 0x0C, // 12 DXT3
|
||||||
IWI_FORMAT_DXT5 = 0x0D // 13 DXT5
|
IWI_FORMAT_DXT5 = 0x0D // 13 DXT5
|
||||||
};
|
};
|
||||||
|
|
||||||
enum DDS_FLAGS {
|
enum DDS_FLAGS {
|
||||||
DDSD_CAPS = 0x1,
|
DDSD_CAPS = 0x1,
|
||||||
DDSD_HEIGHT = 0x2,
|
DDSD_HEIGHT = 0x2,
|
||||||
DDSD_WIDTH = 0x4,
|
DDSD_WIDTH = 0x4,
|
||||||
DDSD_PITCH = 0x8,
|
DDSD_PITCH = 0x8,
|
||||||
DDSD_PIXELFORMAT = 0x1000,
|
DDSD_PIXELFORMAT = 0x1000,
|
||||||
DDSD_MIPMAPCOUNT = 0x20000,
|
DDSD_MIPMAPCOUNT = 0x20000,
|
||||||
DDSD_LINEARSIZE = 0x80000,
|
DDSD_LINEARSIZE = 0x80000,
|
||||||
DDSD_DEPTH = 0x800000
|
DDSD_DEPTH = 0x800000
|
||||||
};
|
};
|
||||||
|
|
||||||
enum DDS_PIXELFORMAT_FLAGS {
|
enum DDS_PIXELFORMAT_FLAGS {
|
||||||
DDPF_ALPHAPIXELS = 0x1,
|
DDPF_ALPHAPIXELS = 0x1,
|
||||||
DDPF_ALPHA = 0x2,
|
DDPF_ALPHA = 0x2,
|
||||||
DDPF_FOURCC = 0x4,
|
DDPF_FOURCC = 0x4,
|
||||||
DDPF_RGB = 0x40,
|
DDPF_RGB = 0x40,
|
||||||
DDPF_YUV = 0x200,
|
DDPF_YUV = 0x200,
|
||||||
DDPF_LUMINANCE = 0x20000
|
DDPF_LUMINANCE = 0x20000
|
||||||
};
|
};
|
||||||
|
|
||||||
enum DDS_CAPS_FLAGS {
|
enum DDS_CAPS_FLAGS {
|
||||||
DDSCAPS_COMPLEX = 0x8,
|
DDSCAPS_COMPLEX = 0x8,
|
||||||
DDSCAPS_MIPMAP = 0x400000,
|
DDSCAPS_MIPMAP = 0x400000,
|
||||||
DDSCAPS_TEXTURE = 0x1000
|
DDSCAPS_TEXTURE = 0x1000
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -209,15 +209,15 @@ enum MENU_ITEM_TYPE {
|
|||||||
ITEM_TYPE_RADIOBUTTON = 2, // toggle button, may be grouped
|
ITEM_TYPE_RADIOBUTTON = 2, // toggle button, may be grouped
|
||||||
ITEM_TYPE_CHECKBOX = 3, // check box
|
ITEM_TYPE_CHECKBOX = 3, // check box
|
||||||
ITEM_TYPE_EDITFIELD = 4, // editable text, associated with a dvar
|
ITEM_TYPE_EDITFIELD = 4, // editable text, associated with a dvar
|
||||||
ITEM_TYPE_COMBO = 5, // drop down list
|
ITEM_TYPE_COMBO = 5, // drop down list
|
||||||
ITEM_TYPE_LISTBOX = 6, // scrollable list
|
ITEM_TYPE_LISTBOX = 6, // scrollable list
|
||||||
ITEM_TYPE_MODEL = 7, // model
|
ITEM_TYPE_MODEL = 7, // model
|
||||||
ITEM_TYPE_OWNERDRAW = 8, // owner draw, name specs what it is
|
ITEM_TYPE_OWNERDRAW = 8, // owner draw, name specs what it is
|
||||||
ITEM_TYPE_NUMERICFIELD = 9, // editable text, associated with a dvar
|
ITEM_TYPE_NUMERICFIELD = 9, // editable text, associated with a dvar
|
||||||
ITEM_TYPE_SLIDER = 10, // mouse speed, volume, etc.
|
ITEM_TYPE_SLIDER = 10, // mouse speed, volume, etc.
|
||||||
ITEM_TYPE_YESNO = 11, // yes no dvar setting
|
ITEM_TYPE_YESNO = 11, // yes no dvar setting
|
||||||
ITEM_TYPE_MULTI = 12, // multiple list setting, enumerated
|
ITEM_TYPE_MULTI = 12, // multiple list setting, enumerated
|
||||||
ITEM_TYPE_DVARENUM = 13, // multiple list setting, enumerated from a dvar
|
ITEM_TYPE_DVARENUM = 13, // multiple list setting, enumerated from a dvar
|
||||||
ITEM_TYPE_BIND = 14, // bind
|
ITEM_TYPE_BIND = 14, // bind
|
||||||
ITEM_TYPE_MENUMODEL = 15, // special menu model
|
ITEM_TYPE_MENUMODEL = 15, // special menu model
|
||||||
ITEM_TYPE_VALIDFILEFIELD = 16, // text must be valid for use in a dos filename
|
ITEM_TYPE_VALIDFILEFIELD = 16, // text must be valid for use in a dos filename
|
||||||
@ -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_GameFontMALL = 3,
|
UI_FONT_SMALL = 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,
|
||||||
|
|||||||
@ -1,5 +1,15 @@
|
|||||||
/* ecrypt-portable.h */
|
/* ecrypt-portable.h */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WARNING: the conversions defined below are implemented as macros,
|
||||||
|
* and should be used carefully. They should NOT be used with
|
||||||
|
* parameters which perform some action. E.g., the following two lines
|
||||||
|
* are not equivalent:
|
||||||
|
*
|
||||||
|
* 1) ++x; y = ROTL32(x, n);
|
||||||
|
* 2) y = ROTL32(++x, n);
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* *** Please do not edit this file. ***
|
* *** Please do not edit this file. ***
|
||||||
*
|
*
|
||||||
@ -17,10 +27,10 @@
|
|||||||
/*
|
/*
|
||||||
* The following types are defined (if available):
|
* The following types are defined (if available):
|
||||||
*
|
*
|
||||||
* u8: quint32eger type, at least 8 bits
|
* u8: unsigned integer type, at least 8 bits
|
||||||
* u16: quint32eger type, at least 16 bits
|
* u16: unsigned integer type, at least 16 bits
|
||||||
* u32: quint32eger type, at least 32 bits
|
* u32: unsigned integer type, at least 32 bits
|
||||||
* u64: quint32eger type, at least 64 bits
|
* u64: unsigned integer type, at least 64 bits
|
||||||
*
|
*
|
||||||
* s8, s16, s32, s64 -> signed counterparts of u8, u16, u32, u64
|
* s8, s16, s32, s64 -> signed counterparts of u8, u16, u32, u64
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,35 +1,27 @@
|
|||||||
#include <QtCore>
|
#include "encryption.h"
|
||||||
#include "QtZlib/zlib.h"
|
#include "QtZlib/zlib.h"
|
||||||
#include "ecrypt-sync.h"
|
#include "ecrypt-sync.h"
|
||||||
#include "sha1.h"
|
|
||||||
#include "encryption.h"
|
|
||||||
#include "compression.h"
|
#include "compression.h"
|
||||||
|
|
||||||
static QVector<quint32> ivCounter(4, 1); // start all counters at 1
|
void Encryption::Convert32BitTo8Bit(quint32 value, quint8 *array) {
|
||||||
|
|
||||||
void Encryption::Convert32BitTo8Bit(quint32 value, quint8 *array)
|
|
||||||
{
|
|
||||||
array[0] = static_cast<quint8>(value >> 0);
|
array[0] = static_cast<quint8>(value >> 0);
|
||||||
array[1] = static_cast<quint8>(value >> 8);
|
array[1] = static_cast<quint8>(value >> 8);
|
||||||
array[2] = static_cast<quint8>(value >> 16);
|
array[2] = static_cast<quint8>(value >> 16);
|
||||||
array[3] = static_cast<quint8>(value >> 24);
|
array[3] = static_cast<quint8>(value >> 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
quint32 Encryption::ConvertArrayTo32Bit(const QByteArray &array)
|
quint32 Encryption::ConvertArrayTo32Bit(const QByteArray &array) {
|
||||||
{
|
|
||||||
return ((static_cast<quint32>(static_cast<uchar>(array[0])) << 0) |
|
return ((static_cast<quint32>(static_cast<uchar>(array[0])) << 0) |
|
||||||
(static_cast<quint32>(static_cast<uchar>(array[1])) << 8) |
|
(static_cast<quint32>(static_cast<uchar>(array[1])) << 8) |
|
||||||
(static_cast<quint32>(static_cast<uchar>(array[2])) << 16) |
|
(static_cast<quint32>(static_cast<uchar>(array[2])) << 16) |
|
||||||
(static_cast<quint32>(static_cast<uchar>(array[3])) << 24));
|
(static_cast<quint32>(static_cast<uchar>(array[3])) << 24));
|
||||||
}
|
}
|
||||||
|
|
||||||
quint32 Encryption::Rotate(quint32 value, quint32 numBits)
|
quint32 Encryption::Rotate(quint32 value, quint32 numBits) {
|
||||||
{
|
|
||||||
return (value << numBits) | (value >> (32 - numBits));
|
return (value << numBits) | (value >> (32 - numBits));
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray Encryption::InitIVTable(const QByteArray &feed)
|
QByteArray Encryption::InitIVTable(const QByteArray &feed) {
|
||||||
{
|
|
||||||
const int tableSize = 0xFB0;
|
const int tableSize = 0xFB0;
|
||||||
QByteArray table;
|
QByteArray table;
|
||||||
table.resize(tableSize);
|
table.resize(tableSize);
|
||||||
@ -39,7 +31,7 @@ QByteArray Encryption::InitIVTable(const QByteArray &feed)
|
|||||||
if (static_cast<uchar>(feed.at(ptr)) == 0x00)
|
if (static_cast<uchar>(feed.at(ptr)) == 0x00)
|
||||||
ptr = 0;
|
ptr = 0;
|
||||||
int base = i * 20 + x * 4;
|
int base = i * 20 + x * 4;
|
||||||
table[base] = feed.at(ptr);
|
table[base] = feed.at(ptr);
|
||||||
table[base + 1] = feed.at(ptr);
|
table[base + 1] = feed.at(ptr);
|
||||||
table[base + 2] = feed.at(ptr);
|
table[base + 2] = feed.at(ptr);
|
||||||
table[base + 3] = feed.at(ptr);
|
table[base + 3] = feed.at(ptr);
|
||||||
@ -56,23 +48,22 @@ QByteArray Encryption::InitIVTable(const QByteArray &feed)
|
|||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Encryption::unk(quint64 arg1, quint8 arg2)
|
int Encryption::unk(quint64 arg1, quint8 arg2) {
|
||||||
{
|
|
||||||
if (arg2 >= 0x40)
|
if (arg2 >= 0x40)
|
||||||
return 0;
|
return 0;
|
||||||
return static_cast<int>(arg1 >> arg2);
|
return static_cast<int>(arg1 >> arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray Encryption::GetIV(const QByteArray &table, int index)
|
QByteArray Encryption::GetIV(const QByteArray &table, int index) {
|
||||||
{
|
int num1 = 0xFA0 + index;
|
||||||
int num1 = (4 * index % 4 + 0xFA0) + index % 4 + (index - (index % 4));
|
|
||||||
int num2 = unk(0x51EB851FLL * num1, 0x20);
|
int num2 = unk(0x51EB851FLL * num1, 0x20);
|
||||||
int startIndex = 20 * (num1 - 200 * ((num2 >> 6) + (num2 >> 31)));
|
int adjust = ((num2 >> 6) + (num2 >> 31));
|
||||||
|
int startIndex = 20 * (num1 - 200 * adjust);
|
||||||
|
// Return 8 bytes from that location.
|
||||||
return table.mid(startIndex, 8);
|
return table.mid(startIndex, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Encryption::UpdateIVTable(QByteArray &table, int index, const QByteArray §ionHash)
|
void Encryption::UpdateIVTable(QByteArray &table, int index, const QByteArray §ionHash) {
|
||||||
{
|
|
||||||
int blockNumIndex = index % 4;
|
int blockNumIndex = index % 4;
|
||||||
int baseOffset = 0xFA0 + blockNumIndex * 4;
|
int baseOffset = 0xFA0 + blockNumIndex * 4;
|
||||||
quint32 blockNumVal = (static_cast<uchar>(table.at(baseOffset)) ) |
|
quint32 blockNumVal = (static_cast<uchar>(table.at(baseOffset)) ) |
|
||||||
@ -86,7 +77,7 @@ void Encryption::UpdateIVTable(QByteArray &table, int index, const QByteArray &s
|
|||||||
int hashIndex = 0;
|
int hashIndex = 0;
|
||||||
for (int x = 0; x < 4; ++x) {
|
for (int x = 0; x < 4; ++x) {
|
||||||
table[startIndex - 1] = table.at(startIndex - 1) ^ sectionHash.at(hashIndex);
|
table[startIndex - 1] = table.at(startIndex - 1) ^ sectionHash.at(hashIndex);
|
||||||
table[startIndex] = table.at(startIndex) ^ sectionHash.at(hashIndex + 1);
|
table[startIndex] = table.at(startIndex) ^ sectionHash.at(hashIndex + 1);
|
||||||
table[startIndex + 1] = table.at(startIndex + 1) ^ sectionHash.at(hashIndex + 2);
|
table[startIndex + 1] = table.at(startIndex + 1) ^ sectionHash.at(hashIndex + 2);
|
||||||
table[startIndex + 2] = table.at(startIndex + 2) ^ sectionHash.at(hashIndex + 3);
|
table[startIndex + 2] = table.at(startIndex + 2) ^ sectionHash.at(hashIndex + 3);
|
||||||
table[startIndex + 3] = table.at(startIndex + 3) ^ sectionHash.at(hashIndex + 4);
|
table[startIndex + 3] = table.at(startIndex + 3) ^ sectionHash.at(hashIndex + 4);
|
||||||
@ -95,9 +86,8 @@ void Encryption::UpdateIVTable(QByteArray &table, int index, const QByteArray &s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
quint32 Encryption::ToUInt32(const QByteArray &data, int offset)
|
quint32 Encryption::ToUInt32(const QByteArray &data, int offset) {
|
||||||
{
|
// Converts 4 bytes (starting at offset) from data into a 32-bit unsigned integer (little-endian)
|
||||||
// Converts 4 bytes (starting at offset) from data into a 32-bit quint32eger (little-endian)
|
|
||||||
return ((static_cast<quint32>(static_cast<uchar>(data[offset])) ) |
|
return ((static_cast<quint32>(static_cast<uchar>(data[offset])) ) |
|
||||||
(static_cast<quint32>(static_cast<uchar>(data[offset+1])) << 8 ) |
|
(static_cast<quint32>(static_cast<uchar>(data[offset+1])) << 8 ) |
|
||||||
(static_cast<quint32>(static_cast<uchar>(data[offset+2])) << 16) |
|
(static_cast<quint32>(static_cast<uchar>(data[offset+2])) << 16) |
|
||||||
@ -361,8 +351,96 @@ void Encryption::generateNewIV(int index, const QByteArray &hash, QByteArray &iv
|
|||||||
ivCounter[index]++;
|
ivCounter[index]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray Encryption::decryptFastFile_BO3(const QByteArray &fastFileData)
|
QByteArray Encryption::decryptFastFile_BO2(const QByteArray &fastFileData)
|
||||||
{
|
{
|
||||||
|
const QByteArray bo2_salsa20_key = QByteArray::fromHex("641D8A2FE31D3AA63622BBC9CE8587229D42B0F8ED9B924130BF88B65EDC50BE");
|
||||||
|
|
||||||
|
QByteArray fileData = fastFileData;
|
||||||
|
QByteArray finalFastFile;
|
||||||
|
|
||||||
|
QByteArray ivTable(16000, 0);
|
||||||
|
fillIVTable(fileData, ivTable, 16000 - 1);
|
||||||
|
|
||||||
|
QVector<quint32> ivCounter(4, 1);
|
||||||
|
QDataStream stream(fileData);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream.skipRawData(0x138);
|
||||||
|
|
||||||
|
QByteArray sha1Hash(20, 0);
|
||||||
|
QByteArray ivPtr(8, 0);
|
||||||
|
int chunkIndex = 0;
|
||||||
|
|
||||||
|
while (!stream.atEnd()) {
|
||||||
|
quint32 dataLength;
|
||||||
|
stream >> dataLength;
|
||||||
|
|
||||||
|
if (dataLength == 0 || dataLength > fileData.size() - stream.device()->pos()) {
|
||||||
|
qWarning() << "Invalid data length at offset: " << stream.device()->pos();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
fillIV(chunkIndex % 4, ivPtr, ivTable, ivCounter);
|
||||||
|
|
||||||
|
ECRYPT_ctx x;
|
||||||
|
ECRYPT_keysetup(&x, reinterpret_cast<const u8*>(bo2_salsa20_key.constData()), 256, 0);
|
||||||
|
ECRYPT_ivsetup(&x, reinterpret_cast<const u8*>(ivPtr.constData()));
|
||||||
|
|
||||||
|
QByteArray encryptedBlock = fileData.mid(stream.device()->pos(), dataLength);
|
||||||
|
QByteArray decryptedBlock;
|
||||||
|
decryptedBlock.resize(dataLength);
|
||||||
|
|
||||||
|
ECRYPT_decrypt_bytes(&x, reinterpret_cast<const u8*>(encryptedBlock.constData()),
|
||||||
|
reinterpret_cast<u8*>(decryptedBlock.data()), dataLength);
|
||||||
|
|
||||||
|
QCryptographicHash sha1(QCryptographicHash::Sha1);
|
||||||
|
sha1.addData(decryptedBlock);
|
||||||
|
sha1Hash = sha1.result();
|
||||||
|
|
||||||
|
z_stream strm = {};
|
||||||
|
strm.zalloc = Z_NULL;
|
||||||
|
strm.zfree = Z_NULL;
|
||||||
|
strm.opaque = Z_NULL;
|
||||||
|
strm.avail_in = static_cast<uInt>(decryptedBlock.size());
|
||||||
|
strm.next_in = reinterpret_cast<Bytef*>(decryptedBlock.data());
|
||||||
|
|
||||||
|
QByteArray decompressedData;
|
||||||
|
decompressedData.resize(fmax(dataLength * 2, 4096));
|
||||||
|
strm.avail_out = decompressedData.size();
|
||||||
|
strm.next_out = reinterpret_cast<Bytef*>(decompressedData.data());
|
||||||
|
|
||||||
|
int zReturn = inflateInit2(&strm, -15);
|
||||||
|
if (zReturn != Z_OK) {
|
||||||
|
qWarning() << "inflateInit2 failed with error code" << zReturn;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
zReturn = inflate(&strm, Z_FINISH);
|
||||||
|
inflateEnd(&strm);
|
||||||
|
|
||||||
|
if (zReturn != Z_STREAM_END) {
|
||||||
|
qDebug() << "Error decompressing at offset: " << stream.device()->pos() << " : " << zReturn;
|
||||||
|
decompressedData.clear();
|
||||||
|
} else {
|
||||||
|
decompressedData.resize(strm.total_out);
|
||||||
|
}
|
||||||
|
|
||||||
|
finalFastFile.append(decompressedData);
|
||||||
|
|
||||||
|
generateNewIV(chunkIndex % 4, sha1Hash, ivTable, ivCounter);
|
||||||
|
|
||||||
|
if (stream.device()->pos() + static_cast<qint64>(dataLength) > fileData.size()) {
|
||||||
|
qWarning() << "Skipping past file size!";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.skipRawData(dataLength);
|
||||||
|
chunkIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return finalFastFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray Encryption::decryptFastFile_BO3(const QByteArray &fastFileData) {
|
||||||
const QByteArray salsaKey = QByteArray::fromHex("0E50F49F412317096038665622DD091332A209BA0A05A00E1377CEDB0A3CB1D3");
|
const QByteArray salsaKey = QByteArray::fromHex("0E50F49F412317096038665622DD091332A209BA0A05A00E1377CEDB0A3CB1D3");
|
||||||
|
|
||||||
QByteArray ivTable(0xFB0, 0);
|
QByteArray ivTable(0xFB0, 0);
|
||||||
@ -426,71 +504,3 @@ QByteArray Encryption::decryptFastFile_BO3(const QByteArray &fastFileData)
|
|||||||
|
|
||||||
return finalFastFile;
|
return finalFastFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray Encryption::DecryptFile(const QByteArray &fastFileData, const QString &aFileName, const QByteArray &aKey)
|
|
||||||
{
|
|
||||||
Q_UNUSED(aFileName);
|
|
||||||
|
|
||||||
const QByteArray salsaKey = QByteArray::fromHex(aKey);
|
|
||||||
|
|
||||||
QByteArray ivTable(0xFB0, 0);
|
|
||||||
fillIVTable(fastFileData, ivTable, 0xFB0 - 1);
|
|
||||||
|
|
||||||
QVector<quint32> ivCounter(4, 1);
|
|
||||||
QDataStream stream(fastFileData);
|
|
||||||
stream.setByteOrder(QDataStream::LittleEndian);
|
|
||||||
|
|
||||||
QByteArray finalFastFile;
|
|
||||||
QByteArray sha1Hash(20, 0);
|
|
||||||
QByteArray ivPtr(8, 0);
|
|
||||||
int chunkIndex = 0;
|
|
||||||
|
|
||||||
while (!stream.atEnd()) {
|
|
||||||
if (stream.device()->bytesAvailable() < 4) {
|
|
||||||
qWarning() << "No sufficient data for chunk size at offset:" << stream.device()->pos();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
quint32 dataLength;
|
|
||||||
stream >> dataLength;
|
|
||||||
|
|
||||||
if (dataLength == 0 || dataLength > fastFileData.size() - stream.device()->pos()) {
|
|
||||||
qWarning() << "Invalid data length at offset:" << stream.device()->pos();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fillIV(chunkIndex % 4, ivPtr, ivTable, ivCounter);
|
|
||||||
|
|
||||||
ECRYPT_ctx x;
|
|
||||||
ECRYPT_keysetup(&x, reinterpret_cast<const u8*>(salsaKey.constData()), 256, 0);
|
|
||||||
ECRYPT_ivsetup(&x, reinterpret_cast<const u8*>(ivPtr.constData()));
|
|
||||||
|
|
||||||
QByteArray encryptedBlock = fastFileData.mid(stream.device()->pos(), dataLength);
|
|
||||||
QByteArray decryptedBlock(dataLength, Qt::Uninitialized);
|
|
||||||
|
|
||||||
ECRYPT_decrypt_bytes(&x,
|
|
||||||
reinterpret_cast<const u8*>(encryptedBlock.constData()),
|
|
||||||
reinterpret_cast<u8*>(decryptedBlock.data()),
|
|
||||||
dataLength);
|
|
||||||
|
|
||||||
// SHA1 hash update
|
|
||||||
sha1Hash = QCryptographicHash::hash(decryptedBlock, QCryptographicHash::Sha1);
|
|
||||||
|
|
||||||
// Decompress (ZLIB raw DEFLATE)
|
|
||||||
QByteArray decompressedData = Compression::DecompressDeflate(decryptedBlock);
|
|
||||||
if (decompressedData.isEmpty()) {
|
|
||||||
qWarning() << "Failed decompression at chunk index:" << chunkIndex;
|
|
||||||
return QByteArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
finalFastFile.append(decompressedData);
|
|
||||||
|
|
||||||
// Update IV table using SHA1
|
|
||||||
generateNewIV(chunkIndex % 4, sha1Hash, ivTable, ivCounter);
|
|
||||||
|
|
||||||
stream.skipRawData(dataLength);
|
|
||||||
chunkIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return finalFastFile;
|
|
||||||
}
|
|
||||||
|
|||||||
@ -46,9 +46,8 @@ public:
|
|||||||
|
|
||||||
static void generateNewIV(int index, const QByteArray& hash, QByteArray& ivTable, QVector<quint32>& ivCounter);
|
static void generateNewIV(int index, const QByteArray& hash, QByteArray& ivTable, QVector<quint32>& ivCounter);
|
||||||
|
|
||||||
//static QByteArray decryptFastFile_BO2(const QByteArray& fastFileData);
|
static QByteArray decryptFastFile_BO2(const QByteArray& fastFileData);
|
||||||
static QByteArray decryptFastFile_BO3(const QByteArray& fastFileData);
|
static QByteArray decryptFastFile_BO3(const QByteArray& fastFileData);
|
||||||
static QByteArray DecryptFile(const QByteArray& fastFileData, const QString& aFileName, const QByteArray& aKey);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ENCRYPTION_H
|
#endif // ENCRYPTION_H
|
||||||
|
|||||||
@ -2,8 +2,20 @@ QT += core
|
|||||||
TEMPLATE = lib
|
TEMPLATE = lib
|
||||||
CONFIG += staticlib c++17
|
CONFIG += staticlib c++17
|
||||||
|
|
||||||
SOURCES += $$files($$PWD/*.cpp, true)
|
SOURCES += \
|
||||||
HEADERS += $$files($$PWD/*.h, true)
|
salsa20.cpp \
|
||||||
|
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
|
||||||
|
|||||||
@ -59,7 +59,7 @@ void ECRYPT_encrypt_bytes(ECRYPT_ctx *x,const u8 *m,u8 *c,u32 bytes)
|
|||||||
u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
|
u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
|
||||||
u8 *ctarget;
|
u8 *ctarget;
|
||||||
u8 tmp[64];
|
u8 tmp[64];
|
||||||
u32 i;
|
unsigned int i;
|
||||||
|
|
||||||
if (!bytes) return;
|
if (!bytes) return;
|
||||||
|
|
||||||
@ -82,10 +82,7 @@ void ECRYPT_encrypt_bytes(ECRYPT_ctx *x,const u8 *m,u8 *c,u32 bytes)
|
|||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (bytes < 64) {
|
if (bytes < 64) {
|
||||||
for (i = 0; i < bytes; ++i)
|
for (i = 0;i < bytes;++i) tmp[i] = m[i];
|
||||||
{
|
|
||||||
tmp[i] = m[i];
|
|
||||||
}
|
|
||||||
m = tmp;
|
m = tmp;
|
||||||
ctarget = c;
|
ctarget = c;
|
||||||
c = tmp;
|
c = tmp;
|
||||||
|
|||||||
@ -10,7 +10,7 @@ Still 100% Public Domain
|
|||||||
|
|
||||||
Corrected a problem which generated improper hash values on 16 bit machines
|
Corrected a problem which generated improper hash values on 16 bit machines
|
||||||
Routine SHA1Update changed from
|
Routine SHA1Update changed from
|
||||||
void SHA1Update(SHA1_CTX* context, unsigned char* data, quint32
|
void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int
|
||||||
len)
|
len)
|
||||||
to
|
to
|
||||||
void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned
|
void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned
|
||||||
@ -27,7 +27,7 @@ be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million
|
|||||||
"a"s).
|
"a"s).
|
||||||
|
|
||||||
I also changed the declaration of variables i & j in SHA1Update to
|
I also changed the declaration of variables i & j in SHA1Update to
|
||||||
unsigned long from quint32 for the same reason.
|
unsigned long from unsigned int for the same reason.
|
||||||
|
|
||||||
These changes should make no difference to any 32 bit implementations since
|
These changes should make no difference to any 32 bit implementations since
|
||||||
an
|
an
|
||||||
@ -94,6 +94,7 @@ void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]);
|
|||||||
|
|
||||||
/* blk0() and blk() perform the initial expand. */
|
/* blk0() and blk() perform the initial expand. */
|
||||||
/* I got the idea of expanding during the round function from SSLeay */
|
/* I got the idea of expanding during the round function from SSLeay */
|
||||||
|
/* FIXME: can we do this in an endian-proof way? */
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
#define blk0(i) block->l[i]
|
#define blk0(i) block->l[i]
|
||||||
#else
|
#else
|
||||||
|
|||||||
@ -36,7 +36,7 @@ FastFile_COD10_360::~FastFile_COD10_360() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray FastFile_COD10_360::GetBinaryData() const {
|
QByteArray FastFile_COD10_360::GetBinaryData() {
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,9 +69,15 @@ bool FastFile_COD10_360::Load(const QString aFilePath) {
|
|||||||
bool FastFile_COD10_360::Load(const QByteArray aData) {
|
bool FastFile_COD10_360::Load(const QByteArray aData) {
|
||||||
QByteArray decompressedData;
|
QByteArray decompressedData;
|
||||||
|
|
||||||
// Create a XDataStream on the input data.
|
// Create a QDataStream on the input data.
|
||||||
XDataStream fastFileStream(aData);
|
QDataStream fastFileStream(aData);
|
||||||
fastFileStream.setByteOrder(XDataStream::LittleEndian);
|
fastFileStream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
|
||||||
|
// For COD7/COD9, use BigEndian.
|
||||||
|
fastFileStream.setByteOrder(QDataStream::BigEndian);
|
||||||
|
|
||||||
|
// Select key based on game.
|
||||||
|
QByteArray key = QByteArray::fromHex("0E50F49F412317096038665622DD091332A209BA0A05A00E1377CEDB0A3CB1D3");
|
||||||
|
|
||||||
// Read the 8-byte magic.
|
// Read the 8-byte magic.
|
||||||
QByteArray fileMagic(8, Qt::Uninitialized);
|
QByteArray fileMagic(8, Qt::Uninitialized);
|
||||||
@ -90,7 +96,7 @@ bool FastFile_COD10_360::Load(const QByteArray aData) {
|
|||||||
QByteArray rsaSignature(256, Qt::Uninitialized);
|
QByteArray rsaSignature(256, Qt::Uninitialized);
|
||||||
fastFileStream.readRawData(rsaSignature.data(), 256);
|
fastFileStream.readRawData(rsaSignature.data(), 256);
|
||||||
|
|
||||||
decompressedData = Encryption::DecryptFile(aData, fileName, "0E50F49F412317096038665622DD091332A209BA0A05A00E1377CEDB0A3CB1D3");
|
decompressedData = Encryption::decryptFastFile_BO2(aData);
|
||||||
|
|
||||||
// For COD9, write out the complete decompressed zone for testing.
|
// For COD9, write out the complete decompressed zone for testing.
|
||||||
QFile testFile("exports/" + GetBaseStem() + ".zone");
|
QFile testFile("exports/" + GetBaseStem() + ".zone");
|
||||||
@ -98,16 +104,12 @@ bool FastFile_COD10_360::Load(const QByteArray aData) {
|
|||||||
testFile.write(decompressedData);
|
testFile.write(decompressedData);
|
||||||
testFile.close();
|
testFile.close();
|
||||||
}
|
}
|
||||||
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_COD10_360* zoneFile = new ZoneFile_COD10_360();
|
ZoneFile_COD10_360 zoneFile;
|
||||||
zoneFile->SetStem(GetBaseStem() + ".zone");
|
zoneFile.SetStem(GetBaseStem() + ".zone");
|
||||||
if (!zoneFile->Load(decompressedData)) {
|
zoneFile.Load(decompressedData);
|
||||||
qWarning() << "Failed to load ZoneFile!";
|
SetZoneFile(std::make_shared<ZoneFile_COD10_360>(zoneFile));
|
||||||
return false;
|
|
||||||
}
|
|
||||||
SetZoneFile(zoneFile);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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() const override;
|
QByteArray GetBinaryData() 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;
|
||||||
|
|||||||
@ -38,7 +38,7 @@ FastFile_COD11_360::~FastFile_COD11_360() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray FastFile_COD11_360::GetBinaryData() const {
|
QByteArray FastFile_COD11_360::GetBinaryData() {
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,84 +68,40 @@ bool FastFile_COD11_360::Load(const QString aFilePath) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum DB_CompressorType : qint32
|
|
||||||
{
|
|
||||||
DB_COMPRESSOR_INVALID = 0x0,
|
|
||||||
DB_COMPRESSOR_ZLIB = 0x1,
|
|
||||||
DB_COMPRESSOR_LZX = 0x2,
|
|
||||||
DB_COMPRESSOR_PASSTHROUGH = 0x3,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool FastFile_COD11_360::Load(const QByteArray aData) {
|
bool FastFile_COD11_360::Load(const QByteArray aData) {
|
||||||
QByteArray decompressedData;
|
QByteArray decompressedData;
|
||||||
|
|
||||||
// Prepare data stream for parsing
|
// Prepare data stream for parsing
|
||||||
XDataStream fastFileStream(aData);
|
QDataStream fastFileStream(aData);
|
||||||
fastFileStream.setByteOrder(XDataStream::BigEndian);
|
fastFileStream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
|
||||||
// Verify magic header
|
// Verify magic header
|
||||||
QByteArray fileMagic(8, Qt::Uninitialized);
|
QByteArray fileMagic(8, Qt::Uninitialized);
|
||||||
fastFileStream.readRawData(fileMagic.data(), 8);
|
fastFileStream.readRawData(fileMagic.data(), 8);
|
||||||
quint32 version = fastFileStream.ParseUInt32();
|
if (fileMagic != "TAff0000") {
|
||||||
|
qWarning() << "Invalid fast file magic for COD12!";
|
||||||
fastFileStream.skipRawData(1);
|
|
||||||
|
|
||||||
DB_CompressorType compressorType = (DB_CompressorType)fastFileStream.ParseInt8();
|
|
||||||
|
|
||||||
fastFileStream.skipRawData(10);
|
|
||||||
|
|
||||||
qint32 blockCount = fastFileStream.ParseInt32();
|
|
||||||
|
|
||||||
if (version != 1838)
|
|
||||||
{
|
|
||||||
qWarning() << "Invalid fast file version:" << version << "!";
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blockCount > 17280)
|
// Skip: File size (4 bytes), flags/version (4 bytes), unknown (8 bytes), build tag (32 bytes), RSA signature (256 bytes)
|
||||||
{
|
fastFileStream.skipRawData(4 + 4 + 8 + 32 + 256); // total 304 bytes skipped so far + 8 bytes magic = 312 bytes at correct position.
|
||||||
qWarning() << "Fast file has too many blocks:" << blockCount << "> 17280!";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
fastFileStream.skipRawData(12 * blockCount);
|
|
||||||
|
|
||||||
qint32 startPos = fastFileStream.ParseInt32();
|
// Correctly positioned at 0x138
|
||||||
Q_UNUSED(startPos);
|
QByteArray encryptedData = aData.mid(0x138);
|
||||||
|
decompressedData = Encryption::decryptFastFile_BO3(encryptedData);
|
||||||
|
|
||||||
qint32 endPos = fastFileStream.ParseInt32();
|
// Output for verification/testing
|
||||||
Q_UNUSED(endPos);
|
|
||||||
|
|
||||||
if (fileMagic == "S1ffu100")
|
|
||||||
{
|
|
||||||
QByteArray compressedData = aData.mid(fastFileStream.device()->pos());
|
|
||||||
if (compressorType == DB_COMPRESSOR_ZLIB)
|
|
||||||
{
|
|
||||||
decompressedData = Compression::DecompressZLIB(compressedData);
|
|
||||||
}
|
|
||||||
else if (compressorType == DB_COMPRESSOR_LZX)
|
|
||||||
{
|
|
||||||
decompressedData = Compression::DecompressXMem(compressedData, 0, 0x80000, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (fileMagic == "S1ff0100")
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning() << "Invalid fast file magic:" << fileMagic << "!";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
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 = new ZoneFile_COD11_360();
|
ZoneFile_COD11_360 zoneFile;
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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() const override;
|
QByteArray GetBinaryData() 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;
|
||||||
|
|||||||
@ -38,7 +38,7 @@ FastFile_COD12_360::~FastFile_COD12_360() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray FastFile_COD12_360::GetBinaryData() const {
|
QByteArray FastFile_COD12_360::GetBinaryData() {
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,80 +72,36 @@ bool FastFile_COD12_360::Load(const QByteArray aData) {
|
|||||||
QByteArray decompressedData;
|
QByteArray decompressedData;
|
||||||
|
|
||||||
// Prepare data stream for parsing
|
// Prepare data stream for parsing
|
||||||
XDataStream fastFileStream(aData);
|
QDataStream fastFileStream(aData);
|
||||||
fastFileStream.setByteOrder(XDataStream::LittleEndian);
|
fastFileStream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
|
||||||
// Skip header magic
|
// Verify magic header
|
||||||
fastFileStream.skipRawData(8);
|
QByteArray fileMagic(8, Qt::Uninitialized);
|
||||||
|
fastFileStream.readRawData(fileMagic.data(), 8);
|
||||||
quint32 version;
|
if (fileMagic != "TAff0000") {
|
||||||
fastFileStream >> version;
|
qWarning() << "Invalid fast file magic for COD12!";
|
||||||
|
|
||||||
quint8 unknownFlag, compressionFlag, platformFlag, encryptionFlag;
|
|
||||||
fastFileStream >> unknownFlag >> compressionFlag >> platformFlag >> encryptionFlag;
|
|
||||||
|
|
||||||
if (compressionFlag != 1) {
|
|
||||||
qDebug() << "Invalid fastfile compression: " << compressionFlag;
|
|
||||||
return false;
|
|
||||||
} else if (platformFlag != 4) {
|
|
||||||
qDebug() << "Invalid platform: " << platformFlag;
|
|
||||||
return false;
|
|
||||||
} else if (encryptionFlag != 0) {
|
|
||||||
qDebug() << "Decryption not supported yet!";
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
fastFileStream.skipRawData(128);
|
// Skip: File size (4 bytes), flags/version (4 bytes), unknown (8 bytes), build tag (32 bytes), RSA signature (256 bytes)
|
||||||
|
fastFileStream.skipRawData(4 + 4 + 8 + 32 + 256); // total 304 bytes skipped so far + 8 bytes magic = 312 bytes at correct position.
|
||||||
|
|
||||||
quint64 size;
|
// Correctly positioned at 0x138
|
||||||
fastFileStream >> size;
|
QByteArray encryptedData = aData.mid(0x138);
|
||||||
|
decompressedData = Encryption::decryptFastFile_BO3(encryptedData);
|
||||||
|
|
||||||
fastFileStream.skipRawData(432);
|
|
||||||
|
|
||||||
int consumed = 0;
|
|
||||||
while(consumed < size)
|
|
||||||
{
|
|
||||||
// Read Block Header
|
|
||||||
quint32 compressedSize, decompressedSize, blockSize, blockPosition;
|
|
||||||
fastFileStream >> compressedSize >> decompressedSize >> blockSize >> blockPosition;
|
|
||||||
|
|
||||||
// Validate the block position, it should match
|
|
||||||
if(blockPosition != fastFileStream.device()->pos() - 16)
|
|
||||||
{
|
|
||||||
qDebug() << "Block Position does not match Stream Position.";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for padding blocks
|
|
||||||
if(decompressedSize == 0)
|
|
||||||
{
|
|
||||||
fastFileStream.device()->read((((fastFileStream.device()->pos()) + ((0x800000) - 1)) & ~((0x800000) - 1)) - fastFileStream.device()->pos());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
fastFileStream.device()->read(2);
|
|
||||||
|
|
||||||
QByteArray compressedData(compressedSize - 2, Qt::Uninitialized);
|
|
||||||
qDebug() << "Data position: " << fastFileStream.device()->pos() << " - Size: " << compressedSize;
|
|
||||||
fastFileStream.readRawData(compressedData.data(), compressedSize - 2);
|
|
||||||
decompressedData.append(Compression::DecompressDeflate(compressedData));
|
|
||||||
|
|
||||||
consumed += decompressedSize;
|
|
||||||
|
|
||||||
// Sinze Fast Files are aligns, we must skip the full block
|
|
||||||
fastFileStream.device()->seek(blockPosition + 16 + blockSize);
|
|
||||||
}
|
|
||||||
// Output for verification/testing
|
// Output for verification/testing
|
||||||
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 = new ZoneFile_COD12_360();
|
ZoneFile_COD12_360 zoneFile;
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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() const override;
|
QByteArray GetBinaryData() 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;
|
||||||
|
|||||||
@ -38,7 +38,7 @@ FastFile_COD2_360::~FastFile_COD2_360() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray FastFile_COD2_360::GetBinaryData() const {
|
QByteArray FastFile_COD2_360::GetBinaryData() {
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,9 +68,9 @@ bool FastFile_COD2_360::Load(const QString aFilePath) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool FastFile_COD2_360::Load(const QByteArray aData) {
|
bool FastFile_COD2_360::Load(const QByteArray aData) {
|
||||||
// Create a XDataStream on the input data.
|
// Create a QDataStream on the input data.
|
||||||
XDataStream fastFileStream(aData);
|
QDataStream fastFileStream(aData);
|
||||||
fastFileStream.setByteOrder(XDataStream::LittleEndian);
|
fastFileStream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
|
||||||
Utils::ReadUntilHex(&fastFileStream, "78");
|
Utils::ReadUntilHex(&fastFileStream, "78");
|
||||||
QByteArray compressedData = aData.mid(fastFileStream.device()->pos());
|
QByteArray compressedData = aData.mid(fastFileStream.device()->pos());
|
||||||
@ -79,13 +79,10 @@ 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 = new ZoneFile_COD2_360();
|
ZoneFile_COD2_360 zoneFile;
|
||||||
zoneFile->SetStem(GetBaseStem() + ".zone");
|
zoneFile.SetStem(GetBaseStem() + ".zone");
|
||||||
if (!zoneFile->Load(decompressedData)) {
|
zoneFile.Load(decompressedData);
|
||||||
qWarning() << "Failed to load ZoneFile!";
|
SetZoneFile(std::make_shared<ZoneFile_COD2_360>(zoneFile));
|
||||||
return false;
|
|
||||||
}
|
|
||||||
SetZoneFile(zoneFile);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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() const override;
|
QByteArray GetBinaryData() 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;
|
||||||
|
|||||||
@ -39,7 +39,7 @@ FastFile_COD4_360::~FastFile_COD4_360() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray FastFile_COD4_360::GetBinaryData() const {
|
QByteArray FastFile_COD4_360::GetBinaryData() {
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,9 +80,9 @@ bool FastFile_COD4_360::Load(const QByteArray aData) {
|
|||||||
// For COD5, simply decompress from offset 12.
|
// For COD5, simply decompress from offset 12.
|
||||||
decompressedData = Compression::DecompressZLIB(aData.mid(12));
|
decompressedData = Compression::DecompressZLIB(aData.mid(12));
|
||||||
} else if (header == "IWff0100") {
|
} else if (header == "IWff0100") {
|
||||||
// Create a XDataStream on the input data.
|
// Create a QDataStream on the input data.
|
||||||
XDataStream fastFileStream(aData.mid(12));
|
QDataStream fastFileStream(aData.mid(12));
|
||||||
fastFileStream.setByteOrder(XDataStream::LittleEndian);
|
fastFileStream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
|
||||||
QByteArray magic(8, Qt::Uninitialized);
|
QByteArray magic(8, Qt::Uninitialized);
|
||||||
fastFileStream.readRawData(magic.data(), 8);
|
fastFileStream.readRawData(magic.data(), 8);
|
||||||
@ -126,15 +126,14 @@ 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 = new ZoneFile_COD4_360();
|
ZoneFile_COD4_360 zoneFile;
|
||||||
zoneFile->SetStem(GetBaseStem() + ".zone");
|
zoneFile.SetStem(GetBaseStem() + ".zone");
|
||||||
if (!zoneFile->Load(decompressedData)) {
|
zoneFile.Load(decompressedData);
|
||||||
qWarning() << "Failed to load ZoneFile!";
|
SetZoneFile(std::make_shared<ZoneFile_COD4_360>(zoneFile));
|
||||||
return false;
|
|
||||||
}
|
|
||||||
SetZoneFile(zoneFile);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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() const override;
|
QByteArray GetBinaryData() 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;
|
||||||
|
|||||||
@ -39,7 +39,7 @@ FastFile_COD5_360::~FastFile_COD5_360() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray FastFile_COD5_360::GetBinaryData() const {
|
QByteArray FastFile_COD5_360::GetBinaryData() {
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,13 +80,10 @@ bool FastFile_COD5_360::Load(const QByteArray aData) {
|
|||||||
|
|
||||||
Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
|
Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
|
||||||
|
|
||||||
ZoneFile_COD5_360* zoneFile = new ZoneFile_COD5_360();
|
ZoneFile_COD5_360 zoneFile;
|
||||||
zoneFile->SetStem(GetBaseStem() + ".zone");
|
zoneFile.SetStem(GetBaseStem() + ".zone");
|
||||||
if (!zoneFile->Load(decompressedData)) {
|
zoneFile.Load(decompressedData);
|
||||||
qWarning() << "Failed to load ZoneFile!";
|
SetZoneFile(std::make_shared<ZoneFile_COD5_360>(zoneFile));
|
||||||
return false;
|
|
||||||
}
|
|
||||||
SetZoneFile(zoneFile);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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() const override;
|
QByteArray GetBinaryData() 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;
|
||||||
|
|||||||
@ -39,7 +39,7 @@ FastFile_COD6_360::~FastFile_COD6_360() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray FastFile_COD6_360::GetBinaryData() const {
|
QByteArray FastFile_COD6_360::GetBinaryData() {
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,55 +70,39 @@ bool FastFile_COD6_360::Load(const QString aFilePath) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool FastFile_COD6_360::Load(const QByteArray aData) {
|
bool FastFile_COD6_360::Load(const QByteArray aData) {
|
||||||
XDataStream fastFileStream(aData);
|
const qint64 zlibOffset = Compression::FindZlibOffset(aData);
|
||||||
fastFileStream.setByteOrder(XDataStream::BigEndian);
|
if (zlibOffset == -1)
|
||||||
|
|
||||||
QByteArray magic(8, Qt::Uninitialized);
|
|
||||||
fastFileStream.readRawData(magic.data(), 8);
|
|
||||||
|
|
||||||
quint32 version = fastFileStream.ParseUInt32();
|
|
||||||
|
|
||||||
if (version != 269)
|
|
||||||
{
|
{
|
||||||
qDebug() << QString("Invalid version: %1!").arg(version);
|
qWarning() << "Z-Lib stream not found";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
QByteArray compressed = aData.mid(zlibOffset);
|
||||||
|
|
||||||
|
// 2. Try plain decompression first ------------------------------
|
||||||
|
QByteArray decompressed = Compression::DecompressZLIB(compressed);
|
||||||
|
|
||||||
|
// 3. If that failed or looks too small, try stripping hash blocks
|
||||||
|
if (decompressed.isEmpty() || decompressed.size() < 1024)
|
||||||
|
{
|
||||||
|
QByteArray stripped = Compression::StripHashBlocks(compressed);
|
||||||
|
QByteArray retry = Compression::DecompressZLIB(stripped);
|
||||||
|
if (!retry.isEmpty())
|
||||||
|
decompressed.swap(retry);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (decompressed.isEmpty())
|
||||||
|
{
|
||||||
|
qWarning() << "Unable to decompress fast-file";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool localPatch = fastFileStream.ParseBool();
|
// Optional – keep a copy on disk for quick inspection
|
||||||
Q_UNUSED(localPatch);
|
Utils::ExportData(GetBaseStem() + ".zone", decompressed);
|
||||||
|
|
||||||
quint8 compressor = fastFileStream.ParseUInt8();
|
// 4. Forward to zone-file loader --------------------------------
|
||||||
Q_UNUSED(compressor);
|
auto zoneFile = std::make_shared<ZoneFile_COD6_360>();
|
||||||
|
zoneFile->SetStem(GetStem());
|
||||||
// Skip fastfile date/time
|
zoneFile->Load(decompressed);
|
||||||
fastFileStream.skipRawData(11);
|
|
||||||
|
|
||||||
quint32 hashCount = fastFileStream.ParseUInt32();
|
|
||||||
fastFileStream.skipRawData(12 * hashCount);
|
|
||||||
|
|
||||||
fastFileStream.skipRawData(8);
|
|
||||||
|
|
||||||
QByteArray decompressedData;
|
|
||||||
if (magic == "IWff0100")
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (magic == "IWffu100")
|
|
||||||
{
|
|
||||||
quint32 zlibSize = aData.size() - fastFileStream.device()->pos();
|
|
||||||
QByteArray zlibData(zlibSize, Qt::Uninitialized);
|
|
||||||
fastFileStream.readRawData(zlibData.data(), zlibSize);
|
|
||||||
|
|
||||||
decompressedData = Compression::DecompressZLIB(zlibData);
|
|
||||||
}
|
|
||||||
Utils::ExportData(GetBaseStem() + ".zone", decompressedData);
|
|
||||||
|
|
||||||
ZoneFile_COD6_360* zoneFile = new ZoneFile_COD6_360();
|
|
||||||
zoneFile->SetStem(GetBaseStem() + ".zone");
|
|
||||||
if (!zoneFile->Load(decompressedData)) {
|
|
||||||
qWarning() << "Failed to load ZoneFile!";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
SetZoneFile(zoneFile);
|
SetZoneFile(zoneFile);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@ -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() const override;
|
QByteArray GetBinaryData() 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;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user