input-rec: begin achieving parity in Qt

This commit is contained in:
Tyler Wilding 2022-04-03 20:06:59 -04:00 committed by Tyler Wilding
parent 655939147a
commit 2e8076d909
13 changed files with 547 additions and 17 deletions

View File

@ -35,6 +35,7 @@
#include "pcsx2/HostDisplay.h" #include "pcsx2/HostDisplay.h"
#include "pcsx2/PAD/Host/PAD.h" #include "pcsx2/PAD/Host/PAD.h"
#include "pcsx2/PerformanceMetrics.h" #include "pcsx2/PerformanceMetrics.h"
#include "pcsx2/Recording/InputRecordingControls.h"
#include "pcsx2/VMManager.h" #include "pcsx2/VMManager.h"
#include "DisplayWidget.h" #include "DisplayWidget.h"
@ -968,4 +969,20 @@ DEFINE_HOTKEY("ToggleFullscreen", "General", "Toggle Fullscreen", [](bool presse
if (!pressed) if (!pressed)
g_emu_thread->toggleFullscreen(); g_emu_thread->toggleFullscreen();
}) })
// Input Recording Hot Keys
DEFINE_HOTKEY("InputRecToggleMode", "Input Recording", "Toggle Recording Mode", [](bool pressed) {
if (!pressed) // ?? - not pressed so it is on key up?
{
g_InputRecordingControls.RecordModeToggle();
}
})
// TODO - Vaser - the way the pause/resuming used to work is broken on Qt, needs a rewrite.
// - Currently if you frame advance you can't get out of frame advancing!
DEFINE_HOTKEY("InputRecFrameAdvance", "Input Recording", "Frame Advance", [](bool pressed) {
if (!pressed) // ?? - not pressed so it is on key up?
{
g_InputRecordingControls.FrameAdvance();
g_InputRecordingControls.ResumeCoreThreadIfStarted();
}
})
END_HOTKEY_LIST() END_HOTKEY_LIST()

View File

@ -31,6 +31,7 @@
#include "pcsx2/GSDumpReplayer.h" #include "pcsx2/GSDumpReplayer.h"
#include "pcsx2/HostDisplay.h" #include "pcsx2/HostDisplay.h"
#include "pcsx2/PerformanceMetrics.h" #include "pcsx2/PerformanceMetrics.h"
#include "pcsx2/Recording/InputRecording.h"
#include "AboutDialog.h" #include "AboutDialog.h"
#include "AutoUpdaterDialog.h" #include "AutoUpdaterDialog.h"
@ -38,6 +39,7 @@
#include "EmuThread.h" #include "EmuThread.h"
#include "GameList/GameListRefreshThread.h" #include "GameList/GameListRefreshThread.h"
#include "GameList/GameListWidget.h" #include "GameList/GameListWidget.h"
#include "input-rec/NewInputRecordingDlg.h"
#include "MainWindow.h" #include "MainWindow.h"
#include "QtHost.h" #include "QtHost.h"
#include "QtUtils.h" #include "QtUtils.h"
@ -45,6 +47,8 @@
#include "Settings/GameListSettingsWidget.h" #include "Settings/GameListSettingsWidget.h"
#include "Settings/InterfaceSettingsWidget.h" #include "Settings/InterfaceSettingsWidget.h"
#include "SettingWidgetBinder.h" #include "SettingWidgetBinder.h"
#include "svnrev.h"
static constexpr char DISC_IMAGE_FILTER[] = static constexpr char DISC_IMAGE_FILTER[] =
QT_TRANSLATE_NOOP("MainWindow", "All File Types (*.bin *.iso *.cue *.chd *.cso *.gz *.elf *.irx *.m3u *.gs *.gs.xz *.gs.zst);;" QT_TRANSLATE_NOOP("MainWindow", "All File Types (*.bin *.iso *.cue *.chd *.cso *.gz *.elf *.irx *.m3u *.gs *.gs.xz *.gs.zst);;"
@ -213,6 +217,15 @@ void MainWindow::connectSignals()
connect(m_ui.actionSaveGSDump, &QAction::triggered, this, &MainWindow::onSaveGSDumpActionTriggered); connect(m_ui.actionSaveGSDump, &QAction::triggered, this, &MainWindow::onSaveGSDumpActionTriggered);
// Input Recording
connect(m_ui.actionInputRecNew, &QAction::triggered, this, &MainWindow::onInputRecNewActionTriggered);
connect(m_ui.actionInputRecPlay, &QAction::triggered, this, &MainWindow::onInputRecPlayActionTriggered);
connect(m_ui.actionInputRecStop, &QAction::triggered, this, &MainWindow::onInputRecStopActionTriggered);
SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionInputRecConsoleLogs, "Logging", "EnableInputRecordingLogs", false);
connect(m_ui.actionInputRecConsoleLogs, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged);
SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionInputRecControllerLogs, "Logging", "EnableControllerLogs", false);
connect(m_ui.actionInputRecControllerLogs, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged);
// These need to be queued connections to stop crashing due to menus opening/closing and switching focus. // These need to be queued connections to stop crashing due to menus opening/closing and switching focus.
connect(m_game_list_widget, &GameListWidget::refreshProgress, this, &MainWindow::onGameListRefreshProgress); connect(m_game_list_widget, &GameListWidget::refreshProgress, this, &MainWindow::onGameListRefreshProgress);
connect(m_game_list_widget, &GameListWidget::refreshComplete, this, &MainWindow::onGameListRefreshComplete); connect(m_game_list_widget, &GameListWidget::refreshComplete, this, &MainWindow::onGameListRefreshComplete);
@ -1179,6 +1192,85 @@ void MainWindow::onLoggingOptionChanged()
QtHost::UpdateLogging(); QtHost::UpdateLogging();
} }
void MainWindow::onInputRecNewActionTriggered()
{
const bool wasPaused = VMManager::GetState() == VMState::Paused;
const bool wasRunning = VMManager::GetState() == VMState::Running;
if (wasRunning && !wasPaused)
{
VMManager::SetPaused(true);
}
NewInputRecordingDlg dlg(this);
const auto result = dlg.exec();
if (result == QDialog::Accepted)
{
if (g_InputRecording.Create(
dlg.getFilePath(),
dlg.getInputRecType() == InputRecording::Type::FROM_SAVESTATE,
dlg.getAuthorName()))
{
return;
}
}
if (wasRunning && !wasPaused)
{
VMManager::SetPaused(false);
}
}
#include "pcsx2/Recording/InputRecordingControls.h"
void MainWindow::onInputRecPlayActionTriggered()
{
const bool wasPaused = VMManager::GetState() == VMState::Paused;
if (!wasPaused)
g_InputRecordingControls.PauseImmediately();
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::ExistingFile);
dialog.setWindowTitle("Select a File");
dialog.setNameFilter(tr("Input Recording Files (*.p2m2)"));
QStringList fileNames;
if (dialog.exec())
{
fileNames = dialog.selectedFiles();
}
if (fileNames.length() > 0)
{
if (g_InputRecording.IsActive())
{
g_InputRecording.Stop();
}
if (g_InputRecording.Play(fs::path(fileNames.first().toStdString())))
{
return;
}
}
if (!wasPaused)
{
g_InputRecordingControls.Resume();
}
}
void MainWindow::onInputRecStopActionTriggered()
{
if (g_InputRecording.IsActive())
{
g_InputRecording.Stop();
}
}
void MainWindow::onInputRecOpenSettingsTriggered()
{
// TODO - Vaser - Implement
}
void MainWindow::onVMStarting() void MainWindow::onVMStarting()
{ {
m_vm_valid = true; m_vm_valid = true;

View File

@ -137,6 +137,12 @@ private Q_SLOTS:
void onScreenshotActionTriggered(); void onScreenshotActionTriggered();
void onSaveGSDumpActionTriggered(); void onSaveGSDumpActionTriggered();
// Input Recording
void onInputRecNewActionTriggered();
void onInputRecPlayActionTriggered();
void onInputRecStopActionTriggered();
void onInputRecOpenSettingsTriggered();
void onVMStarting(); void onVMStarting();
void onVMStarted(); void onVMStarted();
void onVMPaused(); void onVMPaused();

View File

@ -182,7 +182,21 @@
<property name="title"> <property name="title">
<string>&amp;Tools</string> <string>&amp;Tools</string>
</property> </property>
<widget class="QMenu" name="menuInput_Recording">
<property name="title">
<string>Input Recording</string>
</property>
<addaction name="actionInputRecNew"/>
<addaction name="actionInputRecPlay"/>
<addaction name="actionInputRecStop"/>
<addaction name="separator"/>
<addaction name="actionInputRecOpenSettings"/>
<addaction name="separator"/>
<addaction name="actionInputRecConsoleLogs"/>
<addaction name="actionInputRecControllerLogs"/>
</widget>
<addaction name="actionOpenDataDirectory"/> <addaction name="actionOpenDataDirectory"/>
<addaction name="menuInput_Recording"/>
</widget> </widget>
<addaction name="menuSystem"/> <addaction name="menuSystem"/>
<addaction name="menuSettings"/> <addaction name="menuSettings"/>
@ -745,6 +759,47 @@
<string>Save Single Frame GS Dump</string> <string>Save Single Frame GS Dump</string>
</property> </property>
</action> </action>
<action name="actionInputRecNew">
<property name="text">
<string>New</string>
</property>
</action>
<action name="actionInputRecPlay">
<property name="text">
<string>Play</string>
</property>
</action>
<action name="actionInputRecStop">
<property name="text">
<string>Stop</string>
</property>
</action>
<action name="actionInputRecOpenSettings">
<property name="text">
<string>Settings</string>
</property>
</action>
<action name="actionRecording_Console_Logs">
<property name="text">
<string>Input Recording Logs</string>
</property>
</action>
<action name="actionInputRecControllerLogs">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Controller Logs</string>
</property>
</action>
<action name="actionInputRecConsoleLogs">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Input Recording Logs</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="resources/resources.qrc"/> <include location="resources/resources.qrc"/>

View File

@ -770,6 +770,10 @@ void QtHost::UpdateLogging()
DevConWriterEnabled = any_logging_sinks && QtHost::GetBaseBoolSettingValue("Logging", "EnableVerbose", false); DevConWriterEnabled = any_logging_sinks && QtHost::GetBaseBoolSettingValue("Logging", "EnableVerbose", false);
SysConsole.eeConsole.Enabled = any_logging_sinks && QtHost::GetBaseBoolSettingValue("Logging", "EnableEEConsole", true); SysConsole.eeConsole.Enabled = any_logging_sinks && QtHost::GetBaseBoolSettingValue("Logging", "EnableEEConsole", true);
SysConsole.iopConsole.Enabled = any_logging_sinks && QtHost::GetBaseBoolSettingValue("Logging", "EnableIOPConsole", true); SysConsole.iopConsole.Enabled = any_logging_sinks && QtHost::GetBaseBoolSettingValue("Logging", "EnableIOPConsole", true);
// Input Recording Logs
SysConsole.recordingConsole.Enabled = system_console_enabled && QtHost::GetBaseBoolSettingValue("Logging", "EnableInputRecordingLogs", true);
SysConsole.controlInfo.Enabled = system_console_enabled && QtHost::GetBaseBoolSettingValue("Logging", "EnableControllerLogs", true);
SetSystemConsoleEnabled(system_console_enabled); SetSystemConsoleEnabled(system_console_enabled);
} }

View File

@ -0,0 +1,113 @@
/* PCSX2 - PS2 Emulator for PCs
* Copyright (C) 2002-2022 PCSX2 Dev Team
*
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCSX2.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "PrecompiledHeader.h"
#include "NewInputRecordingDlg.h"
#include "QtUtils.h"
#include <QtCore/QString>
#include <QtWidgets/QDialog>
#include <QtWidgets/qfiledialog.h>
NewInputRecordingDlg::NewInputRecordingDlg(QWidget* parent)
: QDialog(parent)
{
m_ui.setupUi(this);
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
setFixedSize(geometry().width(), geometry().height());
// Default State
m_ui.m_recTypeWarning->hide();
m_ui.m_dlgBtns->button(QDialogButtonBox::Ok)->setEnabled(false);
m_ui.m_filePathInput->setDisabled(true);
connect(m_ui.m_recTypePowerOn, &QRadioButton::clicked, this, &NewInputRecordingDlg::onRecordingTypePowerOnChecked);
connect(m_ui.m_recTypeSaveState, &QRadioButton::clicked, this, &NewInputRecordingDlg::onRecordingTypeSaveStateChecked);
connect(m_ui.m_filePathBrowseBtn, &QPushButton::clicked, this, &NewInputRecordingDlg::onBrowseForPathClicked);
connect(m_ui.m_authorInput, &QLineEdit::textEdited, this, &NewInputRecordingDlg::onAuthorNameChanged);
}
NewInputRecordingDlg::~NewInputRecordingDlg() = default;
InputRecording::Type NewInputRecordingDlg::getInputRecType()
{
return m_recType;
}
std::string NewInputRecordingDlg::getFilePath()
{
return m_filePath.toStdString();
}
std::string NewInputRecordingDlg::getAuthorName()
{
return m_authorName.toStdString();
}
void NewInputRecordingDlg::onRecordingTypePowerOnChecked(bool checked)
{
if (checked)
{
m_recType = InputRecording::Type::POWER_ON;
m_ui.m_recTypeWarning->hide();
}
}
void NewInputRecordingDlg::onRecordingTypeSaveStateChecked(bool checked)
{
if (checked)
{
m_recType = InputRecording::Type::FROM_SAVESTATE;
m_ui.m_recTypeWarning->show();
}
}
void NewInputRecordingDlg::onBrowseForPathClicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setWindowTitle("Select a File");
dialog.setNameFilter(tr("Input Recording Files (*.p2m2)"));
QStringList fileNames;
if (dialog.exec())
{
fileNames = dialog.selectedFiles();
}
if (fileNames.length() > 0)
{
m_filePath = fileNames.first();
m_ui.m_filePathInput->setText(m_filePath);
updateFormStatus();
}
}
void NewInputRecordingDlg::onAuthorNameChanged(const QString& text)
{
m_authorName = text;
updateFormStatus();
}
bool NewInputRecordingDlg::isFormValid()
{
return !m_filePath.isEmpty() && !m_authorName.isEmpty();
}
void NewInputRecordingDlg::updateFormStatus()
{
m_ui.m_dlgBtns->button(QDialogButtonBox::Ok)->setEnabled(isFormValid());
}

View File

@ -15,31 +15,38 @@
#pragma once #pragma once
#include "ui_NewInputRecordingDlg.h"
#include "pcsx2/Recording/InputRecording.h"
#include <QtWidgets/QDialog> #include <QtWidgets/QDialog>
#include "ui_CreateMemoryCardDialog.h" class NewInputRecordingDlg final : public QDialog
#include "pcsx2/Config.h"
class CreateMemoryCardDialog final : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit CreateMemoryCardDialog(QWidget* parent = nullptr); explicit NewInputRecordingDlg(QWidget* parent = nullptr);
~CreateMemoryCardDialog(); ~NewInputRecordingDlg();
InputRecording::Type getInputRecType();
std::string getFilePath();
std::string getAuthorName();
private Q_SLOTS: private Q_SLOTS:
void nameTextChanged(); void onRecordingTypePowerOnChecked(bool checked);
void createCard(); void onRecordingTypeSaveStateChecked(bool checked);
void onBrowseForPathClicked();
void onAuthorNameChanged(const QString& text);
private: private:
void setType(MemoryCardType type, MemoryCardFileType fileType); Ui::NewInputRecordingDlg m_ui;
void restoreDefaults();
void updateState();
Ui::CreateMemoryCardDialog m_ui; InputRecording::Type m_recType = InputRecording::Type::POWER_ON;
QString m_filePath = "";
QString m_authorName = "";
MemoryCardType m_type = MemoryCardType::File; bool isFormValid();
MemoryCardFileType m_fileType = MemoryCardFileType::PS2_8MB; void updateFormStatus();
}; };

View File

@ -0,0 +1,163 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>NewInputRecordingDlg</class>
<widget class="QDialog" name="NewInputRecordingDlg">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>424</width>
<height>305</height>
</rect>
</property>
<property name="windowTitle">
<string>New Input Recording</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>12</number>
</property>
<item>
<layout class="QVBoxLayout" name="m_mainLayout">
<property name="spacing">
<number>12</number>
</property>
<item>
<widget class="QGroupBox" name="m_recTypeGroup">
<property name="title">
<string>Select Recording Type</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<layout class="QHBoxLayout" name="m_recTypeLayout">
<item>
<widget class="QRadioButton" name="m_recTypePowerOn">
<property name="text">
<string>Power On</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="m_recTypeSaveState">
<property name="text">
<string>Save State</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="m_recTypeWarning">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;Be Warned! Making an input recording that starts from a save-state will fail to work on future versions due to save-state versioning.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="m_filePathLabel">
<property name="text">
<string>Select File Path</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="m_filePathLayout">
<item>
<widget class="QLineEdit" name="m_filePathInput"/>
</item>
<item>
<widget class="QPushButton" name="m_filePathBrowseBtn">
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="m_authorLabel">
<property name="text">
<string>Enter Author Name</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="m_authorInput"/>
</item>
<item>
<widget class="QDialogButtonBox" name="m_dlgBtns">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
<property name="centerButtons">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>m_dlgBtns</sender>
<signal>accepted()</signal>
<receiver>NewInputRecordingDlg</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>m_dlgBtns</sender>
<signal>rejected()</signal>
<receiver>NewInputRecordingDlg</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -45,7 +45,7 @@
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\lzma\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)3rdparty\lzma\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(ProjectDir);$(SolutionDir)pcsx2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(ProjectDir);$(SolutionDir)pcsx2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<!-- Needed for moc pch --> <!-- Needed for moc pch -->
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(ProjectDir)\Settings;$(ProjectDir)\GameList</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(ProjectDir)\Settings;$(ProjectDir)\GameList;$(ProjectDir)\input-rec</AdditionalIncludeDirectories>
<ExceptionHandling>Async</ExceptionHandling> <ExceptionHandling>Async</ExceptionHandling>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>PrecompiledHeader.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>PrecompiledHeader.h</PrecompiledHeaderFile>
@ -134,6 +134,7 @@
<Manifest Include="..\pcsx2\windows\PCSX2.manifest" /> <Manifest Include="..\pcsx2\windows\PCSX2.manifest" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="input-rec\NewInputRecordingDlg.cpp" />
<ClCompile Include="Settings\BIOSSettingsWidget.cpp" /> <ClCompile Include="Settings\BIOSSettingsWidget.cpp" />
<ClCompile Include="Settings\ControllerBindingWidgets.cpp" /> <ClCompile Include="Settings\ControllerBindingWidgets.cpp" />
<ClCompile Include="Settings\ControllerGlobalSettingsWidget.cpp" /> <ClCompile Include="Settings\ControllerGlobalSettingsWidget.cpp" />
@ -194,6 +195,7 @@
<QtMoc Include="GameList\GameListModel.h" /> <QtMoc Include="GameList\GameListModel.h" />
<QtMoc Include="GameList\GameListWidget.h" /> <QtMoc Include="GameList\GameListWidget.h" />
<QtMoc Include="GameList\GameListRefreshThread.h" /> <QtMoc Include="GameList\GameListRefreshThread.h" />
<QtMoc Include="input-rec\NewInputRecordingDlg.h" />
<ClInclude Include="QtUtils.h" /> <ClInclude Include="QtUtils.h" />
<QtMoc Include="Settings\ControllerBindingWidgets.h" /> <QtMoc Include="Settings\ControllerBindingWidgets.h" />
<QtMoc Include="Settings\ControllerGlobalSettingsWidget.h" /> <QtMoc Include="Settings\ControllerGlobalSettingsWidget.h" />
@ -240,6 +242,7 @@
<ClCompile Include="$(IntDir)moc_DisplayWidget.cpp" /> <ClCompile Include="$(IntDir)moc_DisplayWidget.cpp" />
<ClCompile Include="$(IntDir)moc_EmuThread.cpp" /> <ClCompile Include="$(IntDir)moc_EmuThread.cpp" />
<ClCompile Include="$(IntDir)moc_MainWindow.cpp" /> <ClCompile Include="$(IntDir)moc_MainWindow.cpp" />
<ClCompile Include="$(IntDir)input-rec\moc_NewInputRecordingDlg.cpp" />
<ClCompile Include="$(IntDir)qrc_resources.cpp"> <ClCompile Include="$(IntDir)qrc_resources.cpp">
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile> </ClCompile>
@ -312,6 +315,9 @@
<FileType>Document</FileType> <FileType>Document</FileType>
</QtUi> </QtUi>
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="input-rec\NewInputRecordingDlg.ui" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Import Project="$(SolutionDir)common\vsprops\QtCompile.targets" /> <Import Project="$(SolutionDir)common\vsprops\QtCompile.targets" />
<ImportGroup Label="ExtensionTargets" /> <ImportGroup Label="ExtensionTargets" />

View File

@ -13,6 +13,12 @@
<Filter Include="GameList"> <Filter Include="GameList">
<UniqueIdentifier>{aff229ec-39ea-40d4-b1c9-b5c4a932a2e0}</UniqueIdentifier> <UniqueIdentifier>{aff229ec-39ea-40d4-b1c9-b5c4a932a2e0}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Tools">
<UniqueIdentifier>{9ec02647-68e6-4894-9c97-d3347997cae6}</UniqueIdentifier>
</Filter>
<Filter Include="Tools\Input Recording">
<UniqueIdentifier>{d5c14016-9690-4e49-bcb9-a634a937951a}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="..\pcsx2\PCSX2.rc"> <ResourceCompile Include="..\pcsx2\PCSX2.rc">
@ -192,6 +198,12 @@
<ClCompile Include="$(IntDir)moc_AutoUpdaterDialog.cpp"> <ClCompile Include="$(IntDir)moc_AutoUpdaterDialog.cpp">
<Filter>moc</Filter> <Filter>moc</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="$(IntDir)input-rec\moc_NewInputRecordingDlg.cpp">
<Filter>moc</Filter>
</ClCompile>
<ClCompile Include="input-rec\NewInputRecordingDlg.cpp">
<Filter>Tools\Input Recording</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Manifest Include="..\pcsx2\windows\PCSX2.manifest"> <Manifest Include="..\pcsx2\windows\PCSX2.manifest">
@ -282,6 +294,9 @@
<Filter>Settings</Filter> <Filter>Settings</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="AutoUpdaterDialog.h" /> <QtMoc Include="AutoUpdaterDialog.h" />
<QtMoc Include="input-rec\NewInputRecordingDlg.h">
<Filter>Tools\Input Recording</Filter>
</QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtResource Include="resources\resources.qrc"> <QtResource Include="resources\resources.qrc">
@ -352,4 +367,9 @@
</QtUi> </QtUi>
<QtUi Include="AutoUpdaterDialog.ui" /> <QtUi Include="AutoUpdaterDialog.ui" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="input-rec\NewInputRecordingDlg.ui">
<Filter>Tools\Input Recording</Filter>
</None>
</ItemGroup>
</Project> </Project>

View File

@ -1005,6 +1005,7 @@ Pcsx2Config::Pcsx2Config()
McdEnableEjection = true; McdEnableEjection = true;
McdFolderAutoManage = true; McdFolderAutoManage = true;
EnablePatches = true; EnablePatches = true;
EnableRecordingTools = true;
#ifdef PCSX2_CORE #ifdef PCSX2_CORE
EnableGameFixes = true; EnableGameFixes = true;
#endif #endif

View File

@ -54,7 +54,7 @@
<ForcedIncludeFiles>PrecompiledHeader.h;%(ForcedIncludeFiles)</ForcedIncludeFiles> <ForcedIncludeFiles>PrecompiledHeader.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet> <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
<AdditionalOptions>/Zc:externConstexpr %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/Zc:externConstexpr %(AdditionalOptions)</AdditionalOptions>
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;ZIP_STATIC;LZMA_API_STATIC;BUILD_DX=1;ENABLE_OPENGL;ENABLE_VULKAN;SPU2X_CUBEB;SDL_BUILD;PCSX2_CORE;DISABLE_RECORDING;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;ZIP_STATIC;LZMA_API_STATIC;BUILD_DX=1;ENABLE_OPENGL;ENABLE_VULKAN;SPU2X_CUBEB;SDL_BUILD;PCSX2_CORE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="$(Configuration.Contains(Debug))">PCSX2_DEBUG;PCSX2_DEVBUILD;_SECURE_SCL_=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="$(Configuration.Contains(Debug))">PCSX2_DEBUG;PCSX2_DEVBUILD;_SECURE_SCL_=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="$(Configuration.Contains(Devel))">PCSX2_DEVEL;PCSX2_DEVBUILD;NDEBUG;_SECURE_SCL_=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="$(Configuration.Contains(Devel))">PCSX2_DEVEL;PCSX2_DEVBUILD;NDEBUG;_SECURE_SCL_=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="$(Configuration.Contains(Release))">NDEBUG;_SECURE_SCL_=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="$(Configuration.Contains(Release))">NDEBUG;_SECURE_SCL_=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -223,6 +223,11 @@
<ClCompile Include="MemoryCardFile.cpp" /> <ClCompile Include="MemoryCardFile.cpp" />
<ClCompile Include="MemoryCardFolder.cpp" /> <ClCompile Include="MemoryCardFolder.cpp" />
<ClCompile Include="PerformanceMetrics.cpp" /> <ClCompile Include="PerformanceMetrics.cpp" />
<ClCompile Include="Recording\InputRecording.cpp" />
<ClCompile Include="Recording\InputRecordingControls.cpp" />
<ClCompile Include="Recording\InputRecordingFile.cpp" />
<ClCompile Include="Recording\PadData.cpp" />
<ClCompile Include="Recording\Utilities\InputRecordingLogger.cpp" />
<ClCompile Include="SPU2\DplIIdecoder.cpp" /> <ClCompile Include="SPU2\DplIIdecoder.cpp" />
<ClCompile Include="SPU2\debug.cpp" /> <ClCompile Include="SPU2\debug.cpp" />
<ClCompile Include="SPU2\Host\Config.cpp" /> <ClCompile Include="SPU2\Host\Config.cpp" />
@ -536,6 +541,11 @@
<ClInclude Include="MemoryCardFile.h" /> <ClInclude Include="MemoryCardFile.h" />
<ClInclude Include="MemoryCardFolder.h" /> <ClInclude Include="MemoryCardFolder.h" />
<ClInclude Include="PerformanceMetrics.h" /> <ClInclude Include="PerformanceMetrics.h" />
<ClInclude Include="Recording\InputRecording.h" />
<ClInclude Include="Recording\InputRecordingControls.h" />
<ClInclude Include="Recording\InputRecordingFile.h" />
<ClInclude Include="Recording\PadData.h" />
<ClInclude Include="Recording\Utilities\InputRecordingLogger.h" />
<ClInclude Include="SPU2\Config.h" /> <ClInclude Include="SPU2\Config.h" />
<ClInclude Include="SPU2\Global.h" /> <ClInclude Include="SPU2\Global.h" />
<ClInclude Include="SPU2\Host\Config.h" /> <ClInclude Include="SPU2\Host\Config.h" />

View File

@ -232,6 +232,12 @@
<Filter Include="System\Ps2\GS\Shaders\Direct3D"> <Filter Include="System\Ps2\GS\Shaders\Direct3D">
<UniqueIdentifier>{eb697f5b-85f5-424a-a7e4-8d8b73d3426e}</UniqueIdentifier> <UniqueIdentifier>{eb697f5b-85f5-424a-a7e4-8d8b73d3426e}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Tools">
<UniqueIdentifier>{9153e32b-e1e3-49ac-b490-b56adfd1692f}</UniqueIdentifier>
</Filter>
<Filter Include="Tools\Input Recording">
<UniqueIdentifier>{03ba2aa7-2cd9-48cb-93c6-fc93d5bdc938}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Utilities\folderdesc.txt"> <None Include="Utilities\folderdesc.txt">
@ -1248,6 +1254,21 @@
<ClCompile Include="Frontend\imgui_impl_vulkan.cpp"> <ClCompile Include="Frontend\imgui_impl_vulkan.cpp">
<Filter>Host</Filter> <Filter>Host</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Recording\InputRecording.cpp">
<Filter>Tools\Input Recording</Filter>
</ClCompile>
<ClCompile Include="Recording\InputRecordingControls.cpp">
<Filter>Tools\Input Recording</Filter>
</ClCompile>
<ClCompile Include="Recording\InputRecordingFile.cpp">
<Filter>Tools\Input Recording</Filter>
</ClCompile>
<ClCompile Include="Recording\Utilities\InputRecordingLogger.cpp">
<Filter>Tools\Input Recording</Filter>
</ClCompile>
<ClCompile Include="Recording\PadData.cpp">
<Filter>Tools\Input Recording</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Patch.h"> <ClInclude Include="Patch.h">
@ -2071,6 +2092,21 @@
<ClInclude Include="Frontend\imgui_impl_vulkan.h"> <ClInclude Include="Frontend\imgui_impl_vulkan.h">
<Filter>Host</Filter> <Filter>Host</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Recording\InputRecording.h">
<Filter>Tools\Input Recording</Filter>
</ClInclude>
<ClInclude Include="Recording\InputRecordingControls.h">
<Filter>Tools\Input Recording</Filter>
</ClInclude>
<ClInclude Include="Recording\InputRecordingFile.h">
<Filter>Tools\Input Recording</Filter>
</ClInclude>
<ClInclude Include="Recording\Utilities\InputRecordingLogger.h">
<Filter>Tools\Input Recording</Filter>
</ClInclude>
<ClInclude Include="Recording\PadData.h">
<Filter>Tools\Input Recording</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<CustomBuildStep Include="rdebug\deci2.h"> <CustomBuildStep Include="rdebug\deci2.h">