Qt: Add texture replacement settings dialog

This commit is contained in:
Connor McLaughlin 2021-06-05 22:20:23 +10:00
parent 9d3ed39432
commit df6aab2163
9 changed files with 588 additions and 33 deletions

View File

@ -131,6 +131,9 @@ set(SRCS
settingsdialog.h
settingsdialog.ui
settingwidgetbinder.h
texturereplacementssettingswidget.cpp
texturereplacementssettingswidget.h
texturereplacementssettingswidget.ui
)
if(ENABLE_CHEEVOS)

View File

@ -258,21 +258,6 @@ void AdvancedSettingsWidget::addTweakOptions()
Settings::GetCPUFastmemModeDisplayName, "CPUFastmemMode",
static_cast<u32>(CPUFastmemMode::Count), Settings::DEFAULT_CPU_FASTMEM_MODE);
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Enable VRAM Write Texture Replacement"),
"TextureReplacements", "EnableVRAMWriteReplacements", false);
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Preload Texture Replacements"), "TextureReplacements",
"PreloadTextures", false);
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Dump Replaceable VRAM Writes"), "TextureReplacements",
"DumpVRAMWrites", false);
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Set Dumped VRAM Write Alpha Channel"),
"TextureReplacements", "DumpVRAMWriteForceAlphaChannel", true);
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Minimum Dumped VRAM Write Width"), "TextureReplacements",
"DumpVRAMWriteWidthThreshold", 1, VRAM_WIDTH,
Settings::DEFAULT_VRAM_WRITE_DUMP_WIDTH_THRESHOLD);
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Minimum Dumped VRAM Write Height"), "TextureReplacements",
"DumpVRAMWriteHeightThreshold", 1, VRAM_HEIGHT,
Settings::DEFAULT_VRAM_WRITE_DUMP_HEIGHT_THRESHOLD);
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("DMA Max Slice Ticks"), "Hacks", "DMAMaxSliceTicks", 100,
10000, Settings::DEFAULT_DMA_MAX_SLICE_TICKS);
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("DMA Halt Ticks"), "Hacks", "DMAHaltTicks", 100, 10000,
@ -313,14 +298,6 @@ void AdvancedSettingsWidget::onResetToDefaultClicked()
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Recompiler memory exceptions
setBooleanTweakOption(m_ui.tweakOptionTable, i++, true); // Recompiler block linking
setChoiceTweakOption(m_ui.tweakOptionTable, i++, Settings::DEFAULT_CPU_FASTMEM_MODE); // Recompiler fastmem mode
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // VRAM write texture replacement
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Preload texture replacements
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Dump replacable VRAM writes
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Set dumped VRAM write alpha channel
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
Settings::DEFAULT_VRAM_WRITE_DUMP_WIDTH_THRESHOLD); // Minimum dumped VRAM width
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
Settings::DEFAULT_VRAM_WRITE_DUMP_HEIGHT_THRESHOLD); // Minimum dumped VRAm height
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
static_cast<int>(Settings::DEFAULT_DMA_MAX_SLICE_TICKS)); // DMA max slice ticks
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
@ -356,12 +333,6 @@ void AdvancedSettingsWidget::onResetToDefaultClicked()
sif->DeleteValue("CPU", "RecompilerMemoryExceptions");
sif->DeleteValue("CPU", "RecompilerBlockLinking");
sif->DeleteValue("CPU", "FastmemMode");
sif->DeleteValue("TextureReplacements", "EnableVRAMWriteReplacements");
sif->DeleteValue("TextureReplacements", "PreloadTextures");
sif->DeleteValue("TextureReplacements", "DumpVRAMWrites");
sif->DeleteValue("TextureReplacements", "DumpVRAMWriteForceAlphaChannel");
sif->DeleteValue("TextureReplacements", "DumpVRAMWriteWidthThreshold");
sif->DeleteValue("TextureReplacements", "DumpVRAMWriteHeightThreshold");
sif->DeleteValue("Hacks", "DMAMaxSliceTicks");
sif->DeleteValue("Hacks", "DMAHaltTicks");
sif->DeleteValue("Hacks", "GPUFIFOSize");

View File

@ -49,6 +49,7 @@
<ClCompile Include="qtprogresscallback.cpp" />
<ClCompile Include="qtutils.cpp" />
<ClCompile Include="settingsdialog.cpp" />
<ClCompile Include="texturereplacementssettingswidget.cpp" />
</ItemGroup>
<ItemGroup>
<QtMoc Include="aboutdialog.h" />
@ -99,6 +100,7 @@
<QtMoc Include="foldersettingswidget.h" />
<ClInclude Include="qtutils.h" />
<QtMoc Include="settingsdialog.h" />
<QtMoc Include="texturereplacementssettingswidget.h" />
</ItemGroup>
<ItemGroup>
<QtUi Include="aboutdialog.ui">
@ -215,6 +217,9 @@
<QtUi Include="coverdownloaddialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="texturereplacementssettingswidget.ui">
<FileType>Document</FileType>
</QtUi>
</ItemGroup>
<ItemGroup>
<QtResource Include="resources\resources.qrc">
@ -266,6 +271,7 @@
<ClCompile Include="$(IntDir)moc_qthost.cpp" />
<ClCompile Include="$(IntDir)moc_qtprogresscallback.cpp" />
<ClCompile Include="$(IntDir)moc_settingsdialog.cpp" />
<ClCompile Include="$(IntDir)moc_texturereplacementssettingswidget.cpp" />
<ClCompile Include="$(IntDir)qrc_resources.cpp" />
</ItemGroup>
<ItemGroup>

View File

@ -91,6 +91,10 @@
<ClCompile Include="$(IntDir)moc_foldersettingswidget.cpp" />
<ClCompile Include="$(IntDir)moc_gamesummarywidget.cpp" />
<ClCompile Include="qttranslations.cpp" />
<ClCompile Include="coverdownloaddialog.cpp" />
<ClCompile Include="texturereplacementssettingswidget.cpp" />
<ClCompile Include="$(IntDir)moc_coverdownloaddialog.cpp" />
<ClCompile Include="$(IntDir)moc_texturereplacementssettingswidget.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="qtutils.h" />
@ -150,6 +154,8 @@
<QtMoc Include="gamelistrefreshthread.h" />
<QtMoc Include="gamesummarywidget.h" />
<QtMoc Include="foldersettingswidget.h" />
<QtMoc Include="coverdownloaddialog.h" />
<QtMoc Include="texturereplacementssettingswidget.h" />
</ItemGroup>
<ItemGroup>
<QtUi Include="consolesettingswidget.ui" />
@ -189,6 +195,8 @@
<QtUi Include="controllermacrowidget.ui" />
<QtUi Include="controllermacroeditwidget.ui" />
<QtUi Include="controllerbindingwidget_mouse.ui" />
<QtUi Include="coverdownloaddialog.ui" />
<QtUi Include="texturereplacementssettingswidget.ui" />
</ItemGroup>
<ItemGroup>
<Natvis Include="qt5.natvis" />

View File

@ -18,6 +18,7 @@
#include "memorycardsettingswidget.h"
#include "postprocessingsettingswidget.h"
#include "qthost.h"
#include "texturereplacementssettingswidget.h"
#include "util/ini_settings_interface.h"
#include <QtWidgets/QMessageBox>
#include <QtWidgets/QTextEdit>
@ -103,6 +104,11 @@ void SettingsDialog::addPages()
QStringLiteral("paint-fill"),
tr("<strong>Enhancement Settings</strong><hr>These options control enhancements which can improve visuals compared "
"to the original console. Mouse over each option for additional information."));
addWidget(
m_texture_replacement_settings = new TextureReplacementSettingsWidget(this, m_ui.settingsContainer),
tr("Texture Replacements"), QStringLiteral("pantone-line"),
tr(
"<strong>Texture Replacement Settings</strong><hr>WRITE ME! Mouse over each option for additional information."));
if (!isPerGameSettings())
{
addWidget(

View File

@ -22,6 +22,7 @@ class EmulationSettingsWidget;
class MemoryCardSettingsWidget;
class DisplaySettingsWidget;
class EnhancementSettingsWidget;
class TextureReplacementSettingsWidget;
class PostProcessingSettingsWidget;
class AudioSettingsWidget;
class AchievementSettingsWidget;
@ -51,6 +52,7 @@ public:
ALWAYS_INLINE MemoryCardSettingsWidget* getMemoryCardSettingsWidget() const { return m_memory_card_settings; }
ALWAYS_INLINE DisplaySettingsWidget* getDisplaySettingsWidget() const { return m_display_settings; }
ALWAYS_INLINE EnhancementSettingsWidget* getEnhancementSettingsWidget() const { return m_enhancement_settings; }
ALWAYS_INLINE TextureReplacementSettingsWidget* getTextureReplacementSettingsWidget() const { return m_texture_replacement_settings; }
ALWAYS_INLINE AudioSettingsWidget* getAudioSettingsWidget() const { return m_audio_settings; }
ALWAYS_INLINE AchievementSettingsWidget* getAchievementSettingsWidget() const { return m_achievement_settings; }
ALWAYS_INLINE AdvancedSettingsWidget* getAdvancedSettingsWidget() const { return m_advanced_settings; }
@ -92,7 +94,7 @@ private Q_SLOTS:
private:
enum : u32
{
MAX_SETTINGS_WIDGETS = 13
MAX_SETTINGS_WIDGETS = 14
};
void addPages();
@ -110,6 +112,7 @@ private:
MemoryCardSettingsWidget* m_memory_card_settings = nullptr;
DisplaySettingsWidget* m_display_settings = nullptr;
EnhancementSettingsWidget* m_enhancement_settings = nullptr;
TextureReplacementSettingsWidget* m_texture_replacement_settings = nullptr;
PostProcessingSettingsWidget* m_post_processing_settings = nullptr;
AudioSettingsWidget* m_audio_settings = nullptr;
AchievementSettingsWidget* m_achievement_settings = nullptr;

View File

@ -0,0 +1,160 @@
#include "texturereplacementssettingswidget.h"
#include "core/settings.h"
#include "core/texture_dumper.h"
#include "core/texture_replacements.h"
#include "qtutils.h"
#include "settingwidgetbinder.h"
#include <QtCore/QUrl>
#include <cmath>
TextureReplacementSettingsWidget::TextureReplacementSettingsWidget(SettingsDialog* dialog, QWidget* parent)
: QWidget(parent), m_dialog(dialog)
{
m_ui.setupUi(this);
connectUi();
updateOptionsEnabled();
updateVRAMUsage();
}
TextureReplacementSettingsWidget::~TextureReplacementSettingsWidget() = default;
void TextureReplacementSettingsWidget::connectUi()
{
SettingsInterface* sif = m_dialog->getSettingsInterface();
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableVRAMWriteReplacement, "TextureReplacements",
"EnableVRAMWriteReplacements", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableTextureReplacement, "TextureReplacements",
"EnableTextureReplacements", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.preloadTextureReplacements, "TextureReplacements",
"PreloadTextures", false);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.textureReplacementScale, "TextureReplacements",
"TextureReplacementScale", 1);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableVRAMWriteDumping, "TextureReplacements",
"DumpVRAMWrites", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.VRAMWriteDumpingClearMaskBit, "TextureReplacements",
"DumpVRAMWriteForceAlphaChannel", true);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.VRAMWriteDumpingWidthThreshold, "TextureReplacements",
"DumpVRAMWriteWidthThreshold",
Settings::DEFAULT_VRAM_WRITE_DUMP_WIDTH_THRESHOLD);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.VRAMWriteDumpingWidthThreshold, "TextureReplacements",
"DumpVRAMWriteHeightThreshold",
Settings::DEFAULT_VRAM_WRITE_DUMP_HEIGHT_THRESHOLD);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.textureDumpVRAMWriteGroups, "TextureReplacements",
"DumpTexturesByVRAMWrite", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.textureDumpCLUTGroups, "TextureReplacements",
"DumpTexturesByPalette", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.textureDumpForceOpaque, "TextureReplacements",
"DumpTexturesForceAlphaChannel", false);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.textureDumpMaxMergeWidth, "TextureReplacements",
"DumpTexturesMaxMergeWidth",
Settings::DEFAULT_TEXTURE_DUMP_MAX_MERGE_WIDTH);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.textureDumpMaxMergeHeight, "TextureReplacements",
"DumpTexturesMaxMergeHeight",
Settings::DEFAULT_TEXTURE_DUMP_MAX_MERGE_HEIGHT);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.textureDumpMaxMergeeWidth, "TextureReplacements",
"DumpTexturesMaxMergeeWidth",
Settings::DEFAULT_TEXTURE_DUMP_MAX_MERGEE_WIDTH);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.textureDumpMaxMergeeHeight, "TextureReplacements",
"DumpTexturesMaxMergeeHeight",
Settings::DEFAULT_TEXTURE_DUMP_MAX_MERGEE_HEIGHT);
connect(m_ui.enableVRAMWriteReplacement, &QCheckBox::stateChanged, this,
&TextureReplacementSettingsWidget::updateOptionsEnabled);
connect(m_ui.enableTextureReplacement, &QCheckBox::stateChanged, this,
&TextureReplacementSettingsWidget::updateOptionsEnabled);
connect(m_ui.enableVRAMWriteDumping, &QCheckBox::stateChanged, this,
&TextureReplacementSettingsWidget::updateOptionsEnabled);
connect(m_ui.textureDumpVRAMWriteGroups, &QCheckBox::stateChanged, this,
&TextureReplacementSettingsWidget::updateOptionsEnabled);
connect(m_ui.textureDumpCLUTGroups, &QCheckBox::stateChanged, this,
&TextureReplacementSettingsWidget::updateOptionsEnabled);
connect(m_ui.enableTextureReplacement, &QCheckBox::stateChanged, this,
&TextureReplacementSettingsWidget::updateVRAMUsage);
connect(m_ui.textureReplacementScale, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&TextureReplacementSettingsWidget::updateVRAMUsage);
connect(m_ui.resetToDefaults, &QPushButton::clicked, this, &TextureReplacementSettingsWidget::setDefaults);
connect(m_ui.openDumpDirectory, &QPushButton::clicked, this, &TextureReplacementSettingsWidget::openDumpDirectory);
}
void TextureReplacementSettingsWidget::setDefaults()
{
m_ui.enableVRAMWriteReplacement->setChecked(false);
m_ui.enableTextureReplacement->setChecked(false);
m_ui.preloadTextureReplacements->setChecked(false);
m_ui.textureReplacementScale->setCurrentIndex(0);
m_ui.enableVRAMWriteDumping->setChecked(false);
m_ui.VRAMWriteDumpingClearMaskBit->setChecked(true);
m_ui.VRAMWriteDumpingWidthThreshold->setValue(Settings::DEFAULT_VRAM_WRITE_DUMP_WIDTH_THRESHOLD);
m_ui.VRAMWriteDumpingWidthThreshold->setValue(Settings::DEFAULT_VRAM_WRITE_DUMP_HEIGHT_THRESHOLD);
m_ui.textureDumpVRAMWriteGroups->setChecked(false);
m_ui.textureDumpCLUTGroups->setChecked(false);
m_ui.textureDumpForceOpaque->setChecked(false);
m_ui.textureDumpMaxMergeWidth->setValue(Settings::DEFAULT_TEXTURE_DUMP_MAX_MERGE_WIDTH);
m_ui.textureDumpMaxMergeHeight->setValue(Settings::DEFAULT_TEXTURE_DUMP_MAX_MERGE_HEIGHT);
m_ui.textureDumpMaxMergeeWidth->setValue(Settings::DEFAULT_TEXTURE_DUMP_MAX_MERGEE_WIDTH);
m_ui.textureDumpMaxMergeeHeight->setValue(Settings::DEFAULT_TEXTURE_DUMP_MAX_MERGEE_HEIGHT);
}
void TextureReplacementSettingsWidget::updateOptionsEnabled()
{
m_ui.preloadTextureReplacements->setEnabled(m_ui.enableVRAMWriteReplacement->isChecked() ||
m_ui.enableTextureReplacement->isChecked());
m_ui.textureReplacementScale->setEnabled(m_ui.enableTextureReplacement->isChecked());
const bool vram_write_dumping_enabled = m_ui.enableVRAMWriteDumping->isChecked();
m_ui.VRAMWriteDumpingClearMaskBit->setEnabled(vram_write_dumping_enabled);
m_ui.VRAMWriteDumpingWidthThreshold->setEnabled(vram_write_dumping_enabled);
m_ui.VRAMWriteDumpingHeightThreshold->setEnabled(vram_write_dumping_enabled);
m_ui.dumpingThreshold->setEnabled(vram_write_dumping_enabled);
const bool texture_dumping_enabled =
(m_ui.textureDumpVRAMWriteGroups->isChecked() || m_ui.textureDumpCLUTGroups->isChecked());
m_ui.textureDumpForceOpaque->setEnabled(texture_dumping_enabled);
m_ui.maxMergeSize->setEnabled(texture_dumping_enabled);
m_ui.textureDumpMaxMergeWidth->setEnabled(texture_dumping_enabled);
m_ui.textureDumpMaxMergeHeight->setEnabled(texture_dumping_enabled);
m_ui.maxMergeeSize->setEnabled(texture_dumping_enabled);
m_ui.textureDumpMaxMergeeWidth->setEnabled(texture_dumping_enabled);
m_ui.textureDumpMaxMergeeHeight->setEnabled(texture_dumping_enabled);
}
void TextureReplacementSettingsWidget::openDumpDirectory()
{
const std::string dump_directory(TextureDumper::GetDumpDirectory());
if (dump_directory.empty())
return;
QtUtils::OpenURL(this, QUrl::fromLocalFile(QString::fromStdString(dump_directory)));
}
void TextureReplacementSettingsWidget::updateVRAMUsage()
{
if (!m_ui.enableTextureReplacement->isChecked())
{
m_ui.vramUsage->setText(tr("Texture replacements are not enabled."));
return;
}
u32 scale = static_cast<u32>(m_dialog->getEffectiveIntValue("TextureReplacements", "TextureReplacementScale", 0));
if (scale == 0)
scale = static_cast<u32>(m_dialog->getEffectiveIntValue("GPU", "ResolutionScale", 1));
const u32 replacement_width = TextureReplacements::TEXTURE_REPLACEMENT_PAGE_WIDTH * scale;
const u32 replacement_height = TextureReplacements::TEXTURE_REPLACEMENT_PAGE_HEIGHT * scale;
const u32 vram_usage =
(replacement_width * replacement_height * sizeof(u32)) * TextureReplacements::TEXTURE_REPLACEMENT_PAGE_COUNT;
const u32 vram_usage_mb = static_cast<u32>(std::ceil(static_cast<float>(vram_usage) / 1024576.0f));
m_ui.vramUsage->setText(tr("Texture replacements will be up to %1x%2, and use %3MB of video memory.")
.arg(replacement_width)
.arg(replacement_height)
.arg(vram_usage_mb));
}

View File

@ -0,0 +1,30 @@
#pragma once
#include "ui_texturereplacementssettingswidget.h"
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtWidgets/QDialog>
#include <array>
class SettingsDialog;
class TextureReplacementSettingsWidget final : public QWidget
{
Q_OBJECT
public:
TextureReplacementSettingsWidget(SettingsDialog* dialog, QWidget* parent);
~TextureReplacementSettingsWidget();
private Q_SLOTS:
void setDefaults();
void updateOptionsEnabled();
void openDumpDirectory();
void updateVRAMUsage();
private:
void connectUi();
SettingsDialog* m_dialog;
Ui::TextureReplacementSettingsWidget m_ui;
};

View File

@ -0,0 +1,368 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TextureReplacementSettingsWidget</class>
<widget class="QWidget" name="TextureReplacementSettingsWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>442</width>
<height>500</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Texture Replacement</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QCheckBox" name="enableTextureReplacement">
<property name="text">
<string>Enable Texture Replacement</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="enableVRAMWriteReplacement">
<property name="text">
<string>Enable VRAM Write Replacements (backgrounds in supported games)</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Texture Replacement Resolution:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="textureReplacementScale">
<item>
<property name="text">
<string>Auto (Match Rendering Resolution)</string>
</property>
</item>
<item>
<property name="text">
<string>1x (256x256)</string>
</property>
</item>
<item>
<property name="text">
<string>2x (512x512)</string>
</property>
</item>
<item>
<property name="text">
<string>3x (768x768)</string>
</property>
</item>
<item>
<property name="text">
<string>4x (1024x1024)</string>
</property>
</item>
<item>
<property name="text">
<string>5x (1280x1280)</string>
</property>
</item>
<item>
<property name="text">
<string>6x (1536x1536)</string>
</property>
</item>
<item>
<property name="text">
<string>7x (1792x1792)</string>
</property>
</item>
<item>
<property name="text">
<string>8x (2048x2048)</string>
</property>
</item>
<item>
<property name="text">
<string>9x (2304x2304)</string>
</property>
</item>
<item>
<property name="text">
<string>10x (2560x2560)</string>
</property>
</item>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="vramUsage">
<property name="text">
<string>Texture replacements will be up to 1024x1024, and use 8MB of video memory.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="preloadTextureReplacements">
<property name="text">
<string>Preload Texture Replacements</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>VRAM Write Dumping</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QCheckBox" name="enableVRAMWriteDumping">
<property name="text">
<string>Enable VRAM Write Dumping</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="VRAMWriteDumpingClearMaskBit">
<property name="text">
<string>Clear Mask Bit (make opaque)</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="dumpingThreshold">
<property name="text">
<string>Dumping Threshold:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0,1">
<item>
<widget class="QSpinBox" name="VRAMWriteDumpingWidthThreshold">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1024</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>x</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="VRAMWriteDumpingHeightThreshold">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>512</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Texture Dumping</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QCheckBox" name="textureDumpForceOpaque">
<property name="text">
<string>Clear Transparency (make opaque)</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="textureDumpCLUTGroups">
<property name="text">
<string>Dump Textures By Palette/CLUT</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>&lt;b&gt;WARNING: &lt;/b&gt;Texture dumping can create a large number of files on your disk, slowing down emulation and increasing wear on SSDs.</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="maxMergeeSize">
<property name="text">
<string>Maximum VRAM Write Mergee Size:</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="maxMergeSize">
<property name="text">
<string>Maximum VRAM Write Merge Size:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3" stretch="1,0,1">
<item>
<widget class="QSpinBox" name="textureDumpMaxMergeWidth">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1024</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>x</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="textureDumpMaxMergeHeight">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>512</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_4" stretch="1,0,1">
<item>
<widget class="QSpinBox" name="textureDumpMaxMergeeWidth">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1024</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>x</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="textureDumpMaxMergeeHeight">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>512</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="openDumpDirectory">
<property name="text">
<string>Open Dump Directory</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="resetToDefaults">
<property name="text">
<string>Reset to Defaults</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="textureDumpVRAMWriteGroups">
<property name="text">
<string>Dump Merged Textures</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources>
<include location="resources/resources.qrc"/>
</resources>
<connections/>
</ui>