mirror of https://github.com/PCSX2/pcsx2.git
recording: Internalize VirtualPad Windows
* Hold virtualPad window pointers solely in the g_inputRecording object * Only inits the windows once per session and only if recording options are enabled
This commit is contained in:
parent
acb61a3cf2
commit
a6b2d30bd0
|
@ -63,16 +63,26 @@ void SaveStateBase::InputRecordingFreeze()
|
|||
|
||||
InputRecording g_InputRecording;
|
||||
|
||||
InputRecording::InputRecording()
|
||||
InputRecording::InputRecordingPad::InputRecordingPad()
|
||||
{
|
||||
// NOTE - No multi-tap support, only two controllers
|
||||
padData[CONTROLLER_PORT_ONE] = new PadData();
|
||||
padData[CONTROLLER_PORT_TWO] = new PadData();
|
||||
padData = new PadData;
|
||||
}
|
||||
|
||||
void InputRecording::setVirtualPadPtr(VirtualPad* ptr, int const port)
|
||||
InputRecording::InputRecordingPad::~InputRecordingPad()
|
||||
{
|
||||
virtualPads[port] = ptr;
|
||||
delete padData;
|
||||
}
|
||||
|
||||
void InputRecording::InitVirtualPadWindows(wxWindow* parent)
|
||||
{
|
||||
for (int port = 0; port < 2; ++port)
|
||||
if (!pads[port].virtualPad)
|
||||
pads[port].virtualPad = new VirtualPad(parent, port, g_Conf->inputRecording);
|
||||
}
|
||||
|
||||
void InputRecording::ShowVirtualPad(const int port)
|
||||
{
|
||||
pads[port].virtualPad->Show();
|
||||
}
|
||||
|
||||
void InputRecording::RecordingReset()
|
||||
|
@ -114,16 +124,16 @@ void InputRecording::ControllerInterrupt(u8& data, u8& port, u16& bufCount, u8 b
|
|||
inputRec::consoleLog(fmt::format("Failed to read input data at frame {}", frameCounter));
|
||||
|
||||
// Update controller data state for future VirtualPad / logging usage.
|
||||
padData[port]->UpdateControllerData(bufIndex, bufVal);
|
||||
pads[port].padData->UpdateControllerData(bufIndex, bufVal);
|
||||
|
||||
if (virtualPads[port]->IsShown())
|
||||
virtualPads[port]->UpdateControllerData(bufIndex, padData[port]);
|
||||
if (pads[port].virtualPad->IsShown())
|
||||
pads[port].virtualPad->UpdateControllerData(bufIndex, pads[port].padData);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Update controller data state for future VirtualPad / logging usage.
|
||||
padData[port]->UpdateControllerData(bufIndex, bufVal);
|
||||
pads[port].padData->UpdateControllerData(bufIndex, bufVal);
|
||||
|
||||
// Commit the byte to the movie file if we are recording
|
||||
if (state == InputRecordingMode::Recording)
|
||||
|
@ -132,8 +142,8 @@ void InputRecording::ControllerInterrupt(u8& data, u8& port, u16& bufCount, u8 b
|
|||
{
|
||||
// If the VirtualPad updated the PadData, we have to update the buffer
|
||||
// before committing it to the recording / sending it to the game
|
||||
if (virtualPads[port]->IsShown() && virtualPads[port]->UpdateControllerData(bufIndex, padData[port]))
|
||||
bufVal = padData[port]->PollControllerData(bufIndex);
|
||||
if (pads[port].virtualPad->IsShown() && pads[port].virtualPad->UpdateControllerData(bufIndex, pads[port].padData))
|
||||
bufVal = pads[port].padData->PollControllerData(bufIndex);
|
||||
|
||||
if (incrementUndo)
|
||||
{
|
||||
|
@ -147,8 +157,8 @@ void InputRecording::ControllerInterrupt(u8& data, u8& port, u16& bufCount, u8 b
|
|||
}
|
||||
// If the VirtualPad updated the PadData, we have to update the buffer
|
||||
// before sending it to the game
|
||||
else if (virtualPads[port]->IsShown() && virtualPads[port]->UpdateControllerData(bufIndex, padData[port]))
|
||||
bufVal = padData[port]->PollControllerData(bufIndex);
|
||||
else if (pads[port].virtualPad->IsShown() && pads[port].virtualPad->UpdateControllerData(bufIndex, pads[port].padData))
|
||||
bufVal = pads[port].padData->PollControllerData(bufIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -190,11 +200,11 @@ void InputRecording::LogAndRedraw()
|
|||
{
|
||||
for (u8 port = 0; port < 2; port++)
|
||||
{
|
||||
padData[port]->LogPadData(port);
|
||||
pads[port].padData->LogPadData(port);
|
||||
// As well as re-render the virtual pad UI, if applicable
|
||||
// - Don't render if it's minimized
|
||||
if (virtualPads[port]->IsShown() && !virtualPads[port]->IsIconized())
|
||||
virtualPads[port]->Redraw();
|
||||
if (pads[port].virtualPad->IsShown() && !pads[port].virtualPad->IsIconized())
|
||||
pads[port].virtualPad->Redraw();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -239,16 +249,16 @@ wxString InputRecording::RecordingModeTitleSegment()
|
|||
void InputRecording::SetToRecordMode()
|
||||
{
|
||||
state = InputRecordingMode::Recording;
|
||||
virtualPads[CONTROLLER_PORT_ONE]->SetReadOnlyMode(false);
|
||||
virtualPads[CONTROLLER_PORT_TWO]->SetReadOnlyMode(false);
|
||||
pads[CONTROLLER_PORT_ONE].virtualPad->SetReadOnlyMode(false);
|
||||
pads[CONTROLLER_PORT_TWO].virtualPad->SetReadOnlyMode(false);
|
||||
inputRec::log("Record mode ON");
|
||||
}
|
||||
|
||||
void InputRecording::SetToReplayMode()
|
||||
{
|
||||
state = InputRecordingMode::Replaying;
|
||||
virtualPads[CONTROLLER_PORT_ONE]->SetReadOnlyMode(true);
|
||||
virtualPads[CONTROLLER_PORT_TWO]->SetReadOnlyMode(true);
|
||||
pads[CONTROLLER_PORT_ONE].virtualPad->SetReadOnlyMode(true);
|
||||
pads[CONTROLLER_PORT_TWO].virtualPad->SetReadOnlyMode(true);
|
||||
inputRec::log("Replay mode ON");
|
||||
}
|
||||
|
||||
|
@ -327,25 +337,25 @@ void InputRecording::FailedSavestate()
|
|||
void InputRecording::Stop()
|
||||
{
|
||||
state = InputRecordingMode::NotActive;
|
||||
virtualPads[CONTROLLER_PORT_ONE]->SetReadOnlyMode(false);
|
||||
virtualPads[CONTROLLER_PORT_TWO]->SetReadOnlyMode(false);
|
||||
pads[CONTROLLER_PORT_ONE].virtualPad->SetReadOnlyMode(false);
|
||||
pads[CONTROLLER_PORT_TWO].virtualPad->SetReadOnlyMode(false);
|
||||
incrementUndo = false;
|
||||
if (inputRecordingData.Close())
|
||||
inputRec::log("Input recording stopped");
|
||||
}
|
||||
|
||||
bool InputRecording::Create(wxString FileName, bool fromSaveState, wxString authorName)
|
||||
bool InputRecording::Create(wxString fileName, const bool fromSaveState, wxString authorName)
|
||||
{
|
||||
if (!inputRecordingData.OpenNew(FileName, fromSaveState))
|
||||
if (!inputRecordingData.OpenNew(fileName, fromSaveState))
|
||||
return false;
|
||||
|
||||
initialLoad = true;
|
||||
state = InputRecordingMode::Recording;
|
||||
if (fromSaveState)
|
||||
{
|
||||
if (wxFileExists(FileName + "_SaveState.p2s"))
|
||||
wxCopyFile(FileName + "_SaveState.p2s", FileName + "_SaveState.p2s.bak", true);
|
||||
StateCopy_SaveToFile(FileName + "_SaveState.p2s");
|
||||
if (wxFileExists(fileName + "_SaveState.p2s"))
|
||||
wxCopyFile(fileName + "_SaveState.p2s", fileName + "_SaveState.p2s.bak", true);
|
||||
StateCopy_SaveToFile(fileName + "_SaveState.p2s");
|
||||
}
|
||||
else
|
||||
sApp.SysExecute(g_Conf->CdvdSource);
|
||||
|
|
|
@ -18,12 +18,13 @@
|
|||
#ifndef DISABLE_RECORDING
|
||||
|
||||
#include "Recording/InputRecordingFile.h"
|
||||
|
||||
#include "Recording/VirtualPad/VirtualPad.h"
|
||||
|
||||
class InputRecording
|
||||
{
|
||||
public:
|
||||
InputRecording();
|
||||
// Initializes all VirtualPad windows with "parent" as their base
|
||||
void InitVirtualPadWindows(wxWindow* parent);
|
||||
|
||||
// Save or load PCSX2's global frame counter (g_FrameCount) along with each full/fast boot
|
||||
//
|
||||
|
@ -82,13 +83,13 @@ public:
|
|||
/// Functions called from GUI
|
||||
|
||||
// Create a new input recording file
|
||||
bool Create(wxString filename, bool fromSaveState, wxString authorName);
|
||||
bool Create(wxString filename, const bool fromSaveState, wxString authorName);
|
||||
// Play an existing input recording from a file
|
||||
bool Play(wxString filename);
|
||||
// Stop the active input recording
|
||||
void Stop();
|
||||
// Initialze VirtualPad window
|
||||
void setVirtualPadPtr(VirtualPad* ptr, int const port);
|
||||
// Displays the VirtualPad window for the chosen pad
|
||||
void ShowVirtualPad(const int port);
|
||||
// Logs the padData and redraws the virtualPad windows of active pads
|
||||
void LogAndRedraw();
|
||||
// Resets a recording if the base savestate could not be loaded at the start
|
||||
|
@ -121,11 +122,16 @@ private:
|
|||
bool incrementUndo = false;
|
||||
InputRecordingMode state = InputRecording::InputRecordingMode::NotActive;
|
||||
|
||||
// Controller Data
|
||||
PadData* padData[2];
|
||||
|
||||
// VirtualPads
|
||||
VirtualPad* virtualPads[2];
|
||||
// Array of usable pads (currently, only 2)
|
||||
struct InputRecordingPad
|
||||
{
|
||||
// Controller Data
|
||||
PadData* padData;
|
||||
// VirtualPad
|
||||
VirtualPad* virtualPad;
|
||||
InputRecordingPad();
|
||||
~InputRecordingPad();
|
||||
} pads[2];
|
||||
|
||||
// Resolve the name and region of the game currently loaded using the GameDB
|
||||
// If the game cannot be found in the DB, the fallback is the ISO filename
|
||||
|
|
|
@ -128,7 +128,7 @@ bool InputRecordingFile::open(const wxString path, bool newRecording)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool InputRecordingFile::OpenNew(const wxString path, bool fromSavestate)
|
||||
bool InputRecordingFile::OpenNew(const wxString& path, bool fromSavestate)
|
||||
{
|
||||
if (fromSavestate)
|
||||
{
|
||||
|
@ -152,7 +152,7 @@ bool InputRecordingFile::OpenNew(const wxString path, bool fromSavestate)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool InputRecordingFile::OpenExisting(const wxString path)
|
||||
bool InputRecordingFile::OpenExisting(const wxString& path)
|
||||
{
|
||||
return open(path, false);
|
||||
}
|
||||
|
|
|
@ -69,10 +69,10 @@ public:
|
|||
// Increment the number of undo actions and commit it to the recording file
|
||||
void IncrementUndoCount();
|
||||
// Open an existing recording file
|
||||
bool OpenExisting(const wxString path);
|
||||
bool OpenExisting(const wxString& path);
|
||||
// Create and open a brand new input recording, either starting from a save-state or from
|
||||
// booting the game
|
||||
bool OpenNew(const wxString path, bool fromSaveState);
|
||||
bool OpenNew(const wxString& path, bool fromSaveState);
|
||||
// Reads the current frame's input data from the file in order to intercept and overwrite
|
||||
// the current frame's value from the emulator
|
||||
bool ReadKeyBuffer(u8 &result, const uint &frame, const uint port, const uint bufIndex);
|
||||
|
|
|
@ -29,8 +29,7 @@
|
|||
#include "DriveList.h"
|
||||
|
||||
#ifndef DISABLE_RECORDING
|
||||
# include "Recording/VirtualPad/VirtualPad.h"
|
||||
# include "Recording/NewRecordingFrame.h"
|
||||
#include "Recording/NewRecordingFrame.h"
|
||||
#endif
|
||||
|
||||
class DisassemblyDialog;
|
||||
|
@ -551,7 +550,6 @@ protected:
|
|||
wxWindowID m_id_Disassembler;
|
||||
|
||||
#ifndef DISABLE_RECORDING
|
||||
wxWindowID m_id_VirtualPad[2];
|
||||
wxWindowID m_id_NewRecordingFrame;
|
||||
#endif
|
||||
|
||||
|
@ -580,7 +578,6 @@ public:
|
|||
DisassemblyDialog* GetDisassemblyPtr() const { return (DisassemblyDialog*)wxWindow::FindWindowById(m_id_Disassembler); }
|
||||
|
||||
#ifndef DISABLE_RECORDING
|
||||
VirtualPad* GetVirtualPadPtr(int port) const { return (VirtualPad*)wxWindow::FindWindowById(m_id_VirtualPad[port]); }
|
||||
NewRecordingFrame* GetNewRecordingFramePtr() const { return (NewRecordingFrame*)wxWindow::FindWindowById(m_id_NewRecordingFrame); }
|
||||
#endif
|
||||
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
|
||||
#ifndef DISABLE_RECORDING
|
||||
#include "Recording/InputRecording.h"
|
||||
#include "Recording/VirtualPad/VirtualPad.h"
|
||||
#endif
|
||||
|
||||
#include <wx/cmdline.h>
|
||||
|
@ -80,16 +79,10 @@ void Pcsx2App::OpenMainFrame()
|
|||
m_id_Disassembler = disassembly->GetId();
|
||||
|
||||
#ifndef DISABLE_RECORDING
|
||||
VirtualPad* virtualPad0 = new VirtualPad(mainFrame, 0, g_Conf->inputRecording);
|
||||
g_InputRecording.setVirtualPadPtr(virtualPad0, 0);
|
||||
m_id_VirtualPad[0] = virtualPad0->GetId();
|
||||
|
||||
VirtualPad* virtualPad1 = new VirtualPad(mainFrame, 1, g_Conf->inputRecording);
|
||||
g_InputRecording.setVirtualPadPtr(virtualPad1, 1);
|
||||
m_id_VirtualPad[1] = virtualPad1->GetId();
|
||||
|
||||
NewRecordingFrame* newRecordingFrame = new NewRecordingFrame(mainFrame);
|
||||
m_id_NewRecordingFrame = newRecordingFrame->GetId();
|
||||
if (g_Conf->EmuOptions.EnableRecordingTools)
|
||||
g_InputRecording.InitVirtualPadWindows(mainFrame);
|
||||
#endif
|
||||
|
||||
if (g_Conf->EmuOptions.Debugger.ShowDebuggerOnStart)
|
||||
|
|
|
@ -599,6 +599,7 @@ void MainEmuFrame::Menu_EnableRecordingTools_Click(wxCommandEvent& event)
|
|||
if (checked)
|
||||
{
|
||||
GetMenuBar()->Insert(TopLevelMenu_InputRecording, &m_menuRecording, _("&Input Record"));
|
||||
g_InputRecording.InitVirtualPadWindows(this);
|
||||
SysConsole.recordingConsole.Enabled = true;
|
||||
// Enable Recording Keybindings
|
||||
if (GSFrame* gsFrame = wxGetApp().GetGsFramePtr())
|
||||
|
@ -948,8 +949,10 @@ void MainEmuFrame::Menu_Capture_Screenshot_Screenshot_As_Click(wxCommandEvent &e
|
|||
void MainEmuFrame::Menu_Recording_New_Click(wxCommandEvent& event)
|
||||
{
|
||||
const bool initiallyPaused = g_InputRecordingControls.IsPaused();
|
||||
|
||||
if (!initiallyPaused)
|
||||
g_InputRecordingControls.PauseImmediately();
|
||||
|
||||
NewRecordingFrame* newRecordingFrame = wxGetApp().GetNewRecordingFramePtr();
|
||||
if (newRecordingFrame)
|
||||
{
|
||||
|
@ -971,8 +974,10 @@ void MainEmuFrame::Menu_Recording_New_Click(wxCommandEvent& event)
|
|||
void MainEmuFrame::Menu_Recording_Play_Click(wxCommandEvent& event)
|
||||
{
|
||||
const bool initiallyPaused = g_InputRecordingControls.IsPaused();
|
||||
|
||||
if (!initiallyPaused)
|
||||
g_InputRecordingControls.PauseImmediately();
|
||||
|
||||
wxFileDialog openFileDialog(this, _("Select P2M2 record file."), L"", L"",
|
||||
L"p2m2 file(*.p2m2)|*.p2m2", wxFD_OPEN);
|
||||
if (openFileDialog.ShowModal() == wxID_CANCEL)
|
||||
|
@ -989,6 +994,7 @@ void MainEmuFrame::Menu_Recording_Play_Click(wxCommandEvent& event)
|
|||
g_InputRecordingControls.Resume();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!g_InputRecording.GetInputRecordingData().FromSaveState())
|
||||
StartInputRecording();
|
||||
}
|
||||
|
@ -1036,6 +1042,6 @@ void MainEmuFrame::Menu_Recording_ToggleRecordingMode_Click(wxCommandEvent& even
|
|||
|
||||
void MainEmuFrame::Menu_Recording_VirtualPad_Open_Click(wxCommandEvent& event)
|
||||
{
|
||||
wxGetApp().GetVirtualPadPtr(event.GetId() - MenuId_Recording_VirtualPad_Port0)->Show();
|
||||
g_InputRecording.ShowVirtualPad(event.GetId() - MenuId_Recording_VirtualPad_Port0);
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue