diff --git a/pcsx2/Recording/InputRecording.cpp b/pcsx2/Recording/InputRecording.cpp index 31d4d52b30..1281275222 100644 --- a/pcsx2/Recording/InputRecording.cpp +++ b/pcsx2/Recording/InputRecording.cpp @@ -131,7 +131,7 @@ void InputRecording::ControllerInterrupt(u8 &data, u8 &port, u16 &bufCount, u8 b bufVal = tmp; // Update controller data state for future VirtualPad / logging usage. padData[port]->UpdateControllerData(bufIndex, bufVal); - if (virtualPads[port] != NULL && virtualPads[port]->IsShown()) + if (virtualPads[port] && virtualPads[port]->IsShown()) { virtualPads[port]->UpdateControllerData(bufIndex, padData[port]); } @@ -143,7 +143,7 @@ void InputRecording::ControllerInterrupt(u8 &data, u8 &port, u16 &bufCount, u8 b // Update controller data state for future VirtualPad / logging usage. padData[port]->UpdateControllerData(bufIndex, bufVal); - if (virtualPads[port] != NULL && virtualPads[port]->IsShown()) + if (virtualPads[port] && virtualPads[port]->IsShown()) { // If the VirtualPad updated the PadData, we have to update the buffer // before committing it to the recording / sending it to the game @@ -154,9 +154,9 @@ void InputRecording::ControllerInterrupt(u8 &data, u8 &port, u16 &bufCount, u8 b } // If we have reached the end of the pad data, log it out - if (bufIndex == 17) { // TODO constant for end - padData[port]->LogPadData(); - if (virtualPads[port] != NULL && virtualPads[port]->IsShown()) + if (bufIndex == PadData::END_INDEX_CONTROLLER_BUFFER) { + padData[port]->LogPadData(port); + if (virtualPads[port] && virtualPads[port]->IsShown()) { virtualPads[port]->Redraw(); } diff --git a/pcsx2/Recording/InputRecording.h b/pcsx2/Recording/InputRecording.h index 875b07cb2f..4571137cc3 100644 --- a/pcsx2/Recording/InputRecording.h +++ b/pcsx2/Recording/InputRecording.h @@ -108,7 +108,7 @@ private: // Controller Data PadData *padData[2]; - // VirtualPad + // VirtualPads VirtualPad *virtualPads[2]; // Resolve the name and region of the game currently loaded using the GameDB diff --git a/pcsx2/Recording/PadData.cpp b/pcsx2/Recording/PadData.cpp index e4107391a5..1b9160da6b 100644 --- a/pcsx2/Recording/PadData.cpp +++ b/pcsx2/Recording/PadData.cpp @@ -165,7 +165,7 @@ u8 PadData::PollControllerData(u16 bufIndex) bool PadData::IsButtonPressed(ButtonResolver buttonResolver, u8 const &bufVal) { // Rather than the flags being SET if the button is pressed, it is the opposite - // For example: 0111 1111 with left being the first bit indicates left is pressed. + // For example: 0111 1111 with `left` being the first bit indicates `left` is pressed. // So, we are forced to flip the pressed bits with a NOT first return (~bufVal & buttonResolver.buttonBitmask) > 0; } @@ -187,11 +187,15 @@ wxString PadData::RawPadBytesToString(int start, int end) return str; } -void PadData::LogPadData() { +void PadData::LogPadData(u8 const &port) { wxString pressedBytes = RawPadBytesToString(0, 2); wxString rightAnalogBytes = RawPadBytesToString(2, 4); wxString leftAnalogBytes = RawPadBytesToString(4, 6); wxString pressureBytes = RawPadBytesToString(6, 17); - controlLog(wxString::Format("[PAD] Raw Bytes: Pressed = [%s], Right Analog = [%s], Left Analog = [%s]\n", pressedBytes, rightAnalogBytes, leftAnalogBytes)); - controlLog(wxString::Format("[PAD] Raw Bytes: Pressure = [%s]\n", pressureBytes)); + wxString fullLog = + wxString::Format("[PAD %d] Raw Bytes: Pressed = [%s]\n", port + 1, pressedBytes) + + wxString::Format("[PAD %d] Raw Bytes: Right Analog = [%s]\n", port + 1, rightAnalogBytes) + + wxString::Format("[PAD %d] Raw Bytes: Left Analog = [%s]\n", port + 1, leftAnalogBytes) + + wxString::Format("[PAD %d] Raw Bytes: Pressure = [%s]\n", port + 1, pressureBytes); + controlLog(fullLog); } diff --git a/pcsx2/Recording/PadData.h b/pcsx2/Recording/PadData.h index f5eb75283d..91a3a0268b 100644 --- a/pcsx2/Recording/PadData.h +++ b/pcsx2/Recording/PadData.h @@ -19,10 +19,8 @@ class PadData { public: /// Constants - const u8 PRESSURE_BUTTON_UNPRESSED = 0; - const bool BUTTON_PRESSED = true; - const bool BUTTON_UNPRESSED = false; - const u8 ANALOG_VECTOR_CENTER_POS = 127; + static const u8 ANALOG_VECTOR_NEUTRAL = 127; + static const u16 END_INDEX_CONTROLLER_BUFFER = 17; enum class BufferIndex { @@ -47,54 +45,53 @@ public: }; /// Pressure Buttons - 0-255 - u8 circlePressure = PRESSURE_BUTTON_UNPRESSED; - u8 crossPressure = PRESSURE_BUTTON_UNPRESSED; - u8 squarePressure = PRESSURE_BUTTON_UNPRESSED; - u8 trianglePressure = PRESSURE_BUTTON_UNPRESSED; - u8 downPressure = PRESSURE_BUTTON_UNPRESSED; - u8 leftPressure = PRESSURE_BUTTON_UNPRESSED; - u8 rightPressure = PRESSURE_BUTTON_UNPRESSED; - u8 upPressure = PRESSURE_BUTTON_UNPRESSED; - u8 l1Pressure = PRESSURE_BUTTON_UNPRESSED; - u8 l2Pressure = PRESSURE_BUTTON_UNPRESSED; - u8 r1Pressure = PRESSURE_BUTTON_UNPRESSED; - u8 r2Pressure = PRESSURE_BUTTON_UNPRESSED; + u8 circlePressure = 0; + u8 crossPressure = 0; + u8 squarePressure = 0; + u8 trianglePressure = 0; + u8 downPressure = 0; + u8 leftPressure = 0; + u8 rightPressure = 0; + u8 upPressure = 0; + u8 l1Pressure = 0; + u8 l2Pressure = 0; + u8 r1Pressure = 0; + u8 r2Pressure = 0; /// Pressure Button Flags - /// NOTE - It shouldn't be possible to depress a button - /// while also having no pressure (PAD plugin should default to max pressure). + /// NOTE - It shouldn't be possible to depress a button while also having no pressure /// But for the sake of completeness, it should be tracked. - bool circlePressed = BUTTON_UNPRESSED; - bool crossPressed = BUTTON_UNPRESSED; - bool squarePressed = BUTTON_UNPRESSED; - bool trianglePressed = BUTTON_UNPRESSED; - bool downPressed = BUTTON_UNPRESSED; - bool leftPressed = BUTTON_UNPRESSED; - bool rightPressed = BUTTON_UNPRESSED; - bool upPressed = BUTTON_UNPRESSED; - bool l1Pressed = BUTTON_UNPRESSED; - bool l2Pressed = BUTTON_UNPRESSED; - bool r1Pressed = BUTTON_UNPRESSED; - bool r2Pressed = BUTTON_UNPRESSED; + bool circlePressed = false; + bool crossPressed = false; + bool squarePressed = false; + bool trianglePressed = false; + bool downPressed = false; + bool leftPressed = false; + bool rightPressed = false; + bool upPressed = false; + bool l1Pressed = false; + bool l2Pressed = false; + bool r1Pressed = false; + bool r2Pressed = false; /// Normal (un)pressed buttons - bool select = BUTTON_UNPRESSED; - bool start = BUTTON_UNPRESSED; - bool l3 = BUTTON_UNPRESSED; - bool r3 = BUTTON_UNPRESSED; + bool select = false; + bool start = false; + bool l3 = false; + bool r3 = false; /// Analog Sticks - 0-255 (127 center) - u8 leftAnalogX = ANALOG_VECTOR_CENTER_POS; - u8 leftAnalogY = ANALOG_VECTOR_CENTER_POS; - u8 rightAnalogX = ANALOG_VECTOR_CENTER_POS; - u8 rightAnalogY = ANALOG_VECTOR_CENTER_POS; + u8 leftAnalogX = ANALOG_VECTOR_NEUTRAL; + u8 leftAnalogY = ANALOG_VECTOR_NEUTRAL; + u8 rightAnalogX = ANALOG_VECTOR_NEUTRAL; + u8 rightAnalogY = ANALOG_VECTOR_NEUTRAL; // Given the input buffer and the current index, updates the correct field(s) void UpdateControllerData(u16 bufIndex, u8 const &bufVal); u8 PollControllerData(u16 bufIndex); // Prints current PadData to the Controller Log filter which disabled by default - void LogPadData(); + void LogPadData(u8 const &port); private: struct ButtonResolver diff --git a/pcsx2/Recording/VirtualPad/VirtualPad.cpp b/pcsx2/Recording/VirtualPad/VirtualPad.cpp index abb5530eac..497883d2c0 100644 --- a/pcsx2/Recording/VirtualPad/VirtualPad.cpp +++ b/pcsx2/Recording/VirtualPad/VirtualPad.cpp @@ -19,8 +19,8 @@ #include "App.h" #include "Utilities/EmbeddedImage.h" -#include "wx/display.h" #include "wx/dcbuffer.h" +#include "wx/display.h" #include "wx/spinctrl.h" #include "Recording/VirtualPad/VirtualPad.h" @@ -44,7 +44,7 @@ #include "Recording/VirtualPad/img/trianglePressed.h" #include "Recording/VirtualPad/img/upPressed.h" -// TODO - store position of frame in ini file? +// TODO - Store position of frame in an (possibly the main) .ini file VirtualPad::VirtualPad(wxWindow* parent, wxWindowID id, const wxString& title, int controllerPort, const wxPoint& pos, const wxSize& size, long style) : wxFrame(parent, id, title, pos, size, wxDEFAULT_FRAME_STYLE) @@ -56,7 +56,7 @@ VirtualPad::VirtualPad(wxWindow* parent, wxWindowID id, const wxString& title, i // Slight multi-monitor support, will use whatever window pcsx2 is opened with, but won't currently re-init if // windows are dragged between differing monitors! wxDisplay display(wxDisplay::GetFromWindow(this)); - wxRect screen = display.GetClientArea(); + const wxRect screen = display.GetClientArea(); if (screen.height > 1080 && screen.height <= 1440) // 1440p display { scalingFactor = 0.75; @@ -71,29 +71,28 @@ VirtualPad::VirtualPad(wxWindow* parent, wxWindowID id, const wxString& title, i // Use the background image's size to define the window size SetClientSize(virtualPadData.background.width, virtualPadData.background.height); - // TODO - rename to Gui - InitPressureButtonGUIElements(virtualPadData.cross, NewBitmap(EmbeddedImage().Get(), wxPoint(968, 498)), this, wxPoint(1062, 660)); - InitPressureButtonGUIElements(virtualPadData.circle, NewBitmap(EmbeddedImage().Get(), wxPoint(1057, 413)), this, wxPoint(1062, 700)); - InitPressureButtonGUIElements(virtualPadData.triangle, NewBitmap(EmbeddedImage().Get(), wxPoint(968, 325)), this, wxPoint(1062, 740)); - InitPressureButtonGUIElements(virtualPadData.square, NewBitmap(EmbeddedImage().Get(), wxPoint(879, 413)), this, wxPoint(1062, 780)); - InitPressureButtonGUIElements(virtualPadData.down, NewBitmap(EmbeddedImage().Get(), wxPoint(191, 488)), this, wxPoint(199, 660), true); - InitPressureButtonGUIElements(virtualPadData.right, NewBitmap(EmbeddedImage().Get(), wxPoint(255, 429)), this, wxPoint(199, 700), true); - InitPressureButtonGUIElements(virtualPadData.up, NewBitmap(EmbeddedImage().Get(), wxPoint(191, 354)), this, wxPoint(199, 740), true); - InitPressureButtonGUIElements(virtualPadData.left, NewBitmap(EmbeddedImage().Get(), wxPoint(115, 429)), this, wxPoint(199, 780), true); - InitPressureButtonGUIElements(virtualPadData.l1, NewBitmap(EmbeddedImage().Get(), wxPoint(166, 8)), this, wxPoint(294, 20)); - InitPressureButtonGUIElements(virtualPadData.l2, NewBitmap(EmbeddedImage().Get(), wxPoint(166, 81)), this, wxPoint(294, 100)); - InitPressureButtonGUIElements(virtualPadData.r1, NewBitmap(EmbeddedImage().Get(), wxPoint(958, 7)), this, wxPoint(940, 20), true); - InitPressureButtonGUIElements(virtualPadData.r2, NewBitmap(EmbeddedImage().Get(), wxPoint(958, 81)), this, wxPoint(940, 100), true); + InitPressureButtonGuiElements(virtualPadData.cross, NewBitmap(EmbeddedImage().Get(), wxPoint(968, 498)), this, wxPoint(1062, 660)); + InitPressureButtonGuiElements(virtualPadData.circle, NewBitmap(EmbeddedImage().Get(), wxPoint(1057, 413)), this, wxPoint(1062, 700)); + InitPressureButtonGuiElements(virtualPadData.triangle, NewBitmap(EmbeddedImage().Get(), wxPoint(968, 325)), this, wxPoint(1062, 740)); + InitPressureButtonGuiElements(virtualPadData.square, NewBitmap(EmbeddedImage().Get(), wxPoint(879, 413)), this, wxPoint(1062, 780)); + InitPressureButtonGuiElements(virtualPadData.down, NewBitmap(EmbeddedImage().Get(), wxPoint(191, 488)), this, wxPoint(199, 660), true); + InitPressureButtonGuiElements(virtualPadData.right, NewBitmap(EmbeddedImage().Get(), wxPoint(255, 429)), this, wxPoint(199, 700), true); + InitPressureButtonGuiElements(virtualPadData.up, NewBitmap(EmbeddedImage().Get(), wxPoint(191, 354)), this, wxPoint(199, 740), true); + InitPressureButtonGuiElements(virtualPadData.left, NewBitmap(EmbeddedImage().Get(), wxPoint(115, 429)), this, wxPoint(199, 780), true); + InitPressureButtonGuiElements(virtualPadData.l1, NewBitmap(EmbeddedImage().Get(), wxPoint(166, 8)), this, wxPoint(294, 20)); + InitPressureButtonGuiElements(virtualPadData.l2, NewBitmap(EmbeddedImage().Get(), wxPoint(166, 81)), this, wxPoint(294, 100)); + InitPressureButtonGuiElements(virtualPadData.r1, NewBitmap(EmbeddedImage().Get(), wxPoint(958, 7)), this, wxPoint(940, 20), true); + InitPressureButtonGuiElements(virtualPadData.r2, NewBitmap(EmbeddedImage().Get(), wxPoint(958, 81)), this, wxPoint(940, 100), true); - InitNormalButtonGUIElements(virtualPadData.select, NewBitmap(EmbeddedImage().Get(), wxPoint(473, 441)), this, wxPoint(545, 448)); - InitNormalButtonGUIElements(virtualPadData.start, NewBitmap(EmbeddedImage().Get(), wxPoint(710, 440)), this, wxPoint(675, 448)); - InitNormalButtonGUIElements(virtualPadData.l3, NewBitmap(EmbeddedImage().Get(), wxPoint(347, 585)), this, wxPoint(440, 835)); - InitNormalButtonGUIElements(virtualPadData.r3, NewBitmap(EmbeddedImage().Get(), wxPoint(750, 585)), this, wxPoint(844, 835)); + InitNormalButtonGuiElements(virtualPadData.select, NewBitmap(EmbeddedImage().Get(), wxPoint(473, 441)), this, wxPoint(545, 448)); + InitNormalButtonGuiElements(virtualPadData.start, NewBitmap(EmbeddedImage().Get(), wxPoint(710, 440)), this, wxPoint(675, 448)); + InitNormalButtonGuiElements(virtualPadData.l3, NewBitmap(EmbeddedImage().Get(), wxPoint(347, 585)), this, wxPoint(440, 835)); + InitNormalButtonGuiElements(virtualPadData.r3, NewBitmap(EmbeddedImage().Get(), wxPoint(750, 585)), this, wxPoint(844, 835)); InitAnalogStickGuiElements(virtualPadData.leftAnalog, this, wxPoint(418, 656), 105, wxPoint(326, 782), wxPoint(545, 568), false, wxPoint(522, 800), wxPoint(522, 760)); InitAnalogStickGuiElements(virtualPadData.rightAnalog, this, wxPoint(821, 656), 105, wxPoint(730, 782), wxPoint(672, 568), true, wxPoint(720, 800), wxPoint(720, 760), true); - ignoreRealControllerBox = new wxCheckBox(this, wxID_ANY, wxEmptyString, NewScaledPoint(605, 256), wxDefaultSize); + ignoreRealControllerBox = new wxCheckBox(this, wxID_ANY, wxEmptyString, ScaledPoint(605, 256), wxDefaultSize); Bind(wxEVT_CHECKBOX, &VirtualPad::OnIgnoreRealController, this, ignoreRealControllerBox->GetId()); // Bind Window Events @@ -117,14 +116,12 @@ VirtualPad::VirtualPad(wxWindow* parent, wxWindowID id, const wxString& title, i SetDoubleBuffered(true); } -// TODO - test open/close routine - void VirtualPad::OnClose(wxCloseEvent & event) { // Re-bind the Paint event in case this is due to a game being opened/closed manualRedrawMode = false; Bind(wxEVT_PAINT, &VirtualPad::OnPaint, this); - Hide(); // TODO - hide vs closed? + Hide(); } void VirtualPad::OnMouseEvent(wxMouseEvent &evt) @@ -209,7 +206,10 @@ void VirtualPad::Render(wxDC &dc) // After some tests, the performance impact is well within reason, and on the hardware renderer modes, is almost non-existant. while (!renderQueue.empty()) { VirtualPadElement *element = renderQueue.front(); - element->Render(bdc); + if (element) + { + element->Render(bdc); + } renderQueue.pop(); } } @@ -220,34 +220,42 @@ bool VirtualPad::UpdateControllerData(u16 const bufIndex, PadData *padData, bool return virtualPadData.UpdateVirtualPadData(bufIndex, padData, ignoreRealController && !readOnly, readOnly); } -void VirtualPad::OnIgnoreRealController(wxCommandEvent &event) +void VirtualPad::OnIgnoreRealController(wxCommandEvent const &event) { - wxCheckBox* ignoreButton = (wxCheckBox*) event.GetEventObject(); - ignoreRealController = ignoreButton->GetValue(); + const wxCheckBox* ignoreButton = (wxCheckBox*) event.GetEventObject(); + if (ignoreButton) + { + ignoreRealController = ignoreButton->GetValue(); + } } void VirtualPad::OnNormalButtonPress(wxCommandEvent &event) { - wxCheckBox* pressedButton = (wxCheckBox*) event.GetEventObject(); + const wxCheckBox* pressedButton = (wxCheckBox*) event.GetEventObject(); ControllerNormalButton *eventBtn = buttonElements[pressedButton->GetId()]; - eventBtn->pressed = pressedButton->GetValue(); + if (pressedButton) + { + eventBtn->pressed = pressedButton->GetValue(); + } // If the real controller is being bypassed, we move on, otherwise we begin bypassing the controller - if (!eventBtn->isControllerBypassed) { - eventBtn->isControllerBypassed = true; + if (!eventBtn->isControllerPressBypassed) { + eventBtn->isControllerPressBypassed = true; } } void VirtualPad::OnPressureButtonPressureChange(wxCommandEvent &event) { - wxSpinCtrl* pressureSpinner = (wxSpinCtrl*) event.GetEventObject(); + const wxSpinCtrl* pressureSpinner = (wxSpinCtrl*) event.GetEventObject(); ControllerPressureButton *eventBtn = pressureElements[pressureSpinner->GetId()]; - eventBtn->pressure = pressureSpinner->GetValue(); + if (pressureSpinner) + { + eventBtn->pressure = pressureSpinner->GetValue(); + } eventBtn->pressed = eventBtn->pressure > 0; - // If the real controller is being bypassed, we move on, otherwise we begin bypassing the controller if (!eventBtn->isControllerPressureBypassed || !eventBtn->isControllerPressBypassed) { eventBtn->isControllerPressureBypassed = true; eventBtn->isControllerPressBypassed = true; @@ -256,13 +264,15 @@ void VirtualPad::OnPressureButtonPressureChange(wxCommandEvent &event) void VirtualPad::OnAnalogSpinnerChange(wxCommandEvent &event) { - wxSpinCtrl* analogSpinner = (wxSpinCtrl*) event.GetEventObject(); + const wxSpinCtrl* analogSpinner = (wxSpinCtrl*) event.GetEventObject(); AnalogVector *eventVector = analogElements[analogSpinner->GetId()]; - eventVector->val = analogSpinner->GetValue(); + if (analogSpinner) + { + eventVector->val = analogSpinner->GetValue(); + } eventVector->slider->SetValue(eventVector->val); - // If the real controller is being bypassed, we move on, otherwise we begin bypassing the controller if (!eventVector->isControllerBypassed) { eventVector->isControllerBypassed = true; } @@ -270,13 +280,15 @@ void VirtualPad::OnAnalogSpinnerChange(wxCommandEvent &event) void VirtualPad::OnAnalogSliderChange(wxCommandEvent &event) { - wxSlider* analogSlider = (wxSlider*) event.GetEventObject(); + const wxSlider* analogSlider = (wxSlider*) event.GetEventObject(); AnalogVector *eventVector = analogElements[analogSlider->GetId()]; - eventVector->val = analogSlider->GetValue(); + if (analogSlider) + { + eventVector->val = analogSlider->GetValue(); + } eventVector->spinner->SetValue(eventVector->val); - // If the real controller is being bypassed, we move on, otherwise we begin bypassing the controller if (!eventVector->isControllerBypassed) { eventVector->isControllerBypassed = true; } @@ -284,14 +296,27 @@ void VirtualPad::OnAnalogSliderChange(wxCommandEvent &event) /// GUI Element Utility Functions -wxPoint VirtualPad::NewScaledPoint(wxPoint point) +wxPoint VirtualPad::ScaledPoint(wxPoint point, int widgetWidth, bool rightAligned) { - return wxPoint(point.x * scalingFactor, point.y * scalingFactor); + return ScaledPoint(point.x, point.y, widgetWidth, rightAligned); } -wxPoint VirtualPad::NewScaledPoint(int x, int y) +wxPoint VirtualPad::ScaledPoint(int x, int y, int widgetWidth, bool rightAligned) { - return wxPoint(x * scalingFactor, y * scalingFactor); + wxPoint scaledPoint = wxPoint(x * scalingFactor, y * scalingFactor); + if (rightAligned) { + scaledPoint.x -= widgetWidth * scalingFactor; + if (scaledPoint.x < 0) + { + scaledPoint.x = 0; + } + } + return scaledPoint; +} + +wxSize VirtualPad::ScaledSize(int x, int y) +{ + return wxSize(x * scalingFactor, y * scalingFactor); } ImageFile VirtualPad::NewBitmap(wxImage resource, wxPoint point) @@ -307,40 +332,26 @@ ImageFile VirtualPad::NewBitmap(float scalingFactor, wxImage resource, wxPoint p image.image = bitmap; image.width = bitmap.GetWidth(); image.height = bitmap.GetHeight(); - image.coords = NewScaledPoint(point); - + image.coords = ScaledPoint(point); return image; } -void VirtualPad::InitNormalButtonGUIElements(ControllerNormalButton &button, ImageFile image, wxWindow *parentWindow, wxPoint point) +void VirtualPad::InitNormalButtonGuiElements(ControllerNormalButton &button, ImageFile image, wxWindow *parentWindow, wxPoint point) { button.icon = image; - button.pressedBox = new wxCheckBox(parentWindow, wxID_ANY, wxEmptyString, NewScaledPoint(point), wxDefaultSize); - button.isControllerBypassed = false; - button.prevPressedVal = false; + button.pressedBox = new wxCheckBox(parentWindow, wxID_ANY, wxEmptyString, ScaledPoint(point), wxDefaultSize); Bind(wxEVT_CHECKBOX, &VirtualPad::OnNormalButtonPress, this, button.pressedBox->GetId()); buttonElements[button.pressedBox->GetId()] = &button; } -void VirtualPad::InitPressureButtonGUIElements(ControllerPressureButton &button, ImageFile image, wxWindow *parentWindow, wxPoint point, bool rightAlignedPoint) +void VirtualPad::InitPressureButtonGuiElements(ControllerPressureButton &button, ImageFile image, wxWindow *parentWindow, wxPoint point, bool rightAlignedPoint) { - wxPoint scaledPoint = wxPoint(point.x * scalingFactor, point.y * scalingFactor); - if (rightAlignedPoint) { - scaledPoint.x -= 100 * scalingFactor; - if (scaledPoint.x < 0) { - scaledPoint.x = 0; - } - } - wxSpinCtrl *spinner = new wxSpinCtrl(parentWindow, wxID_ANY, wxEmptyString, scaledPoint, wxSize(100 * scalingFactor, wxDefaultSize.GetHeight()), wxSP_ARROW_KEYS, 0, 255, 0); + const int spinnerWidth = 100; + const wxPoint scaledPoint = ScaledPoint(point.x, point.y, spinnerWidth, rightAlignedPoint); + wxSpinCtrl *spinner = new wxSpinCtrl(parentWindow, wxID_ANY, wxEmptyString, scaledPoint, ScaledSize(spinnerWidth, wxDefaultSize.GetHeight()), wxSP_ARROW_KEYS, 0, 255, 0); - // TODO - defaults on the classes' constructor would clean this up button.icon = image; - button.prevPressedVal = 0; button.pressureSpinner = spinner; - button.isControllerPressBypassed = false; - button.isControllerPressureBypassed = false; - button.prevPressedVal = false; - button.prevPressureVal = 0; Bind(wxEVT_SPINCTRL, &VirtualPad::OnPressureButtonPressureChange, this, button.pressureSpinner->GetId()); pressureElements[button.pressureSpinner->GetId()] = &button; } @@ -348,46 +359,31 @@ void VirtualPad::InitPressureButtonGUIElements(ControllerPressureButton &button, void VirtualPad::InitAnalogStickGuiElements(AnalogStick &analog, wxWindow *parentWindow, wxPoint centerPoint, int radius, wxPoint xSliderPoint, wxPoint ySliderPoint, bool flipYSlider, wxPoint xSpinnerPoint, wxPoint ySpinnerPoint, bool rightAlignedSpinners) { AnalogPosition analogPos = AnalogPosition(); - analogPos.centerCoords = NewScaledPoint(centerPoint); - analogPos.endCoords = NewScaledPoint(centerPoint); + analogPos.centerCoords = ScaledPoint(centerPoint); + analogPos.endCoords = ScaledPoint(centerPoint); analogPos.radius = radius * scalingFactor; analogPos.lineThickness = 6 * scalingFactor; - // TODO - make a function to scale wxSize values easier + const int spinnerWidth = 90; + const wxPoint xSpinnerScaledPoint = ScaledPoint(xSpinnerPoint, spinnerWidth, rightAlignedSpinners); + const wxPoint ySpinnerScaledPoint = ScaledPoint(ySpinnerPoint, spinnerWidth, rightAlignedSpinners); - wxSlider *xSlider = new wxSlider(parentWindow, wxID_ANY, 127, 0, 255, NewScaledPoint(xSliderPoint), wxSize(185 * scalingFactor, 30 * scalingFactor)); - wxSlider *ySlider = new wxSlider(parentWindow, wxID_ANY, 127, 0, 255, NewScaledPoint(ySliderPoint), wxSize(30 * scalingFactor, 185 * scalingFactor), flipYSlider ? wxSL_LEFT : wxSL_RIGHT); - - // TODO - function to right-align spinners easier - - wxPoint xSpinnerScaledPoint = NewScaledPoint(xSpinnerPoint); - wxPoint ySpinnerScaledPoint = NewScaledPoint(ySpinnerPoint); - if (rightAlignedSpinners) { - xSpinnerScaledPoint.x -= 90 * scalingFactor; - if (xSpinnerScaledPoint.x < 0) { - xSpinnerScaledPoint.x = 0; - } - - ySpinnerScaledPoint.x -= 90 * scalingFactor; - if (ySpinnerScaledPoint.x < 0) { - ySpinnerScaledPoint.x = 0; - } - } - - wxSpinCtrl *xSpinner = new wxSpinCtrl(parentWindow, wxID_ANY, wxEmptyString, xSpinnerScaledPoint, wxSize(90 * scalingFactor, wxDefaultSize.GetHeight()), wxSP_ARROW_KEYS, 0, 255, 127); - wxSpinCtrl *ySpinner = new wxSpinCtrl(parentWindow, wxID_ANY, wxEmptyString, ySpinnerScaledPoint, wxSize(90 * scalingFactor, wxDefaultSize.GetHeight()), wxSP_ARROW_KEYS, 0, 255, 127); + wxSlider *xSlider = new wxSlider(parentWindow, wxID_ANY, 127, 0, 255, ScaledPoint(xSliderPoint), ScaledSize(185, 30)); + wxSlider *ySlider = new wxSlider(parentWindow, wxID_ANY, 127, 0, 255, ScaledPoint(ySliderPoint), ScaledSize(30, 185), flipYSlider ? wxSL_LEFT : wxSL_RIGHT); + wxSpinCtrl *xSpinner = new wxSpinCtrl(parentWindow, wxID_ANY, wxEmptyString, xSpinnerScaledPoint, ScaledSize(90, wxDefaultSize.GetHeight()), wxSP_ARROW_KEYS, 0, 255, 127); + wxSpinCtrl *ySpinner = new wxSpinCtrl(parentWindow, wxID_ANY, wxEmptyString, ySpinnerScaledPoint, ScaledSize(90, wxDefaultSize.GetHeight()), wxSP_ARROW_KEYS, 0, 255, 127); analog.xVector.slider = xSlider; analog.yVector.slider = ySlider; analog.xVector.spinner = xSpinner; analog.yVector.spinner = ySpinner; analog.positionGraphic = analogPos; - Bind(wxEVT_SPINCTRL, &VirtualPad::OnAnalogSpinnerChange, this, analog.xVector.spinner->GetId()); - Bind(wxEVT_SPINCTRL, &VirtualPad::OnAnalogSpinnerChange, this, analog.yVector.spinner->GetId()); - Bind(wxEVT_SLIDER, &VirtualPad::OnAnalogSliderChange, this, analog.xVector.slider->GetId()); - Bind(wxEVT_SLIDER, &VirtualPad::OnAnalogSliderChange, this, analog.yVector.slider->GetId()); - analogElements[analog.xVector.spinner->GetId()] = &analog.xVector; - analogElements[analog.yVector.spinner->GetId()] = &analog.yVector; - analogElements[analog.xVector.slider->GetId()] = &analog.xVector; - analogElements[analog.yVector.slider->GetId()] = &analog.yVector; + Bind(wxEVT_SLIDER, &VirtualPad::OnAnalogSliderChange, this, xSlider->GetId()); + Bind(wxEVT_SLIDER, &VirtualPad::OnAnalogSliderChange, this, ySlider->GetId()); + Bind(wxEVT_SPINCTRL, &VirtualPad::OnAnalogSpinnerChange, this, xSpinner->GetId()); + Bind(wxEVT_SPINCTRL, &VirtualPad::OnAnalogSpinnerChange, this, ySpinner->GetId()); + analogElements[xSlider->GetId()] = &analog.xVector; + analogElements[ySlider->GetId()] = &analog.yVector; + analogElements[xSpinner->GetId()] = &analog.xVector; + analogElements[ySpinner->GetId()] = &analog.yVector; } diff --git a/pcsx2/Recording/VirtualPad/VirtualPad.h b/pcsx2/Recording/VirtualPad/VirtualPad.h index c23ff0e97f..12ae2c45d4 100644 --- a/pcsx2/Recording/VirtualPad/VirtualPad.h +++ b/pcsx2/Recording/VirtualPad/VirtualPad.h @@ -18,10 +18,10 @@ #include #include -#include "wx/window.h" -#include "wx/frame.h" -#include "wx/checkbox.h" #include "Pcsx2Types.h" +#include "wx/checkbox.h" +#include "wx/frame.h" +#include "wx/window.h" #include "Recording/PadData.h" #include "Recording/VirtualPad/VirtualPadData.h" @@ -37,21 +37,21 @@ public: private: bool manualRedrawMode = false; bool clearScreenRequired = false; - void RedrawBackground(wxDC &dc, ImageFile &img); std::queue renderQueue; /// GUI Creation Utility Functions float scalingFactor = 1.0; - wxPoint NewScaledPoint(wxPoint point); - wxPoint NewScaledPoint(int x, int y); + wxSize ScaledSize(int x, int y); + wxPoint ScaledPoint(wxPoint point, int widgetWidth = 0, bool rightAligned = false); + wxPoint ScaledPoint(int x, int y, int widgetWidth = 0, bool rightAligned = false); ImageFile NewBitmap(wxImage resource, wxPoint point); ImageFile NewBitmap(float scalingFactor, wxImage resource, wxPoint point); - void InitPressureButtonGUIElements(ControllerPressureButton &button, ImageFile image, wxWindow *parentWindow, wxPoint point, bool rightAlignedPoint = false); - void InitNormalButtonGUIElements(ControllerNormalButton &btn, ImageFile image, wxWindow *parentWindow, wxPoint point); + void InitPressureButtonGuiElements(ControllerPressureButton &button, ImageFile image, wxWindow *parentWindow, wxPoint point, bool rightAlignedPoint = false); + void InitNormalButtonGuiElements(ControllerNormalButton &btn, ImageFile image, wxWindow *parentWindow, wxPoint point); void InitAnalogStickGuiElements(AnalogStick &analog, wxWindow *parentWindow, wxPoint centerPoint, int radius, wxPoint xSliderPoint, wxPoint ySliderPoint, bool flipYSlider, wxPoint xSpinnerPoint, wxPoint ySpinnerPoint, bool rightAlignedSpinners = false); /// GUI Elements @@ -61,7 +61,6 @@ private: std::map buttonElements; std::map pressureElements; std::map analogElements; - // TODO - analog stick resolver might need to be a tuple of the slider/spinctrl bool ignoreRealController = false; VirtualPadData virtualPadData; @@ -75,18 +74,12 @@ private: void OnPaint(wxPaintEvent & evt); void Render(wxDC& dc); void OnClose(wxCloseEvent &event); - void OnShow(wxShowEvent &event); void OnMouseEvent(wxMouseEvent &event); void OnFocusEvent(wxFocusEvent &event); - void UpdateVirtualPadComponent(wxDC &dc, ControllerNormalButton &btn); - void UpdateVirtualPadComponent(wxDC &dc, ControllerPressureButton &btn); - void DrawImageFile(wxDC &dc, ImageFile &imgFile); - void UpdateVirtualPadComponent(wxDC &dc, AnalogStick &analogStick); - void OnNormalButtonPress(wxCommandEvent &event); void OnPressureButtonPressureChange(wxCommandEvent &event); void OnAnalogSliderChange(wxCommandEvent &event); void OnAnalogSpinnerChange(wxCommandEvent &event); - void OnIgnoreRealController(wxCommandEvent &event); + void OnIgnoreRealController(wxCommandEvent const &event); }; diff --git a/pcsx2/Recording/VirtualPad/VirtualPadData.h b/pcsx2/Recording/VirtualPad/VirtualPadData.h index 2365f0dba7..e4ede6df81 100644 --- a/pcsx2/Recording/VirtualPad/VirtualPadData.h +++ b/pcsx2/Recording/VirtualPad/VirtualPadData.h @@ -27,22 +27,22 @@ public: /// Pressure Buttons ControllerPressureButton circle; ControllerPressureButton cross; - ControllerPressureButton square; - ControllerPressureButton triangle; ControllerPressureButton down; - ControllerPressureButton left; - ControllerPressureButton right; - ControllerPressureButton up; ControllerPressureButton l1; ControllerPressureButton l2; + ControllerPressureButton left; ControllerPressureButton r1; ControllerPressureButton r2; + ControllerPressureButton right; + ControllerPressureButton square; + ControllerPressureButton triangle; + ControllerPressureButton up; /// Normal (un)pressed buttons - ControllerNormalButton select; - ControllerNormalButton start; ControllerNormalButton l3; ControllerNormalButton r3; + ControllerNormalButton select; + ControllerNormalButton start; /// Analog Sticks AnalogStick leftAnalog; diff --git a/pcsx2/Recording/VirtualPad/VirtualPadResources.cpp b/pcsx2/Recording/VirtualPad/VirtualPadResources.cpp index 822d7526c5..1495b99dc0 100644 --- a/pcsx2/Recording/VirtualPad/VirtualPadResources.cpp +++ b/pcsx2/Recording/VirtualPad/VirtualPadResources.cpp @@ -124,20 +124,19 @@ void AnalogStick::Render(wxDC &dc) analogStick.currentlyRendered = true; } -// TODO - duplicate code between this and the pressure button, inheritance should be able to remove it -bool ControllerNormalButton::UpdateData(bool &padDataVal, bool ignoreRealController, bool readOnly) +bool ControllerButton::UpdateButtonData(bool &padDataVal, bool ignoreRealController, bool readOnly) { - ControllerNormalButton &button = *this; + ControllerButton &button = *this; if (!ignoreRealController) { // If controller is being bypassed and controller's state has changed - bool bypassedWithChangedState = button.isControllerBypassed && padDataVal != button.prevPressedVal; + bool bypassedWithChangedState = button.isControllerPressBypassed && padDataVal != button.prevPressedVal; if (bypassedWithChangedState) { button.prevPressedVal = padDataVal; - button.isControllerBypassed = false; + button.isControllerPressBypassed = false; } // If we aren't bypassing the controller OR the previous condition was met - if (bypassedWithChangedState || !button.isControllerBypassed) { - button.renderRequired = button.pressed != padDataVal; + if (bypassedWithChangedState || !button.isControllerPressBypassed) { + button.widgetUpdateRequired = button.pressed != padDataVal; button.pressed = padDataVal; return false; } @@ -147,24 +146,14 @@ bool ControllerNormalButton::UpdateData(bool &padDataVal, bool ignoreRealControl return button.prevPressedVal != button.pressed; } +bool ControllerNormalButton::UpdateData(bool &padDataVal, bool ignoreRealController, bool readOnly) +{ + return this->UpdateButtonData(padDataVal, ignoreRealController, readOnly); +} + bool ControllerPressureButton::UpdateData(bool &padDataVal, bool ignoreRealController, bool readOnly) { - ControllerPressureButton &button = *this; - if (!ignoreRealController) { - bool bypassedWithChangedState = button.isControllerPressBypassed && padDataVal != button.prevPressedVal; - if (bypassedWithChangedState) { - button.prevPressedVal = padDataVal; - button.isControllerPressBypassed = false; - } - if (bypassedWithChangedState || !button.isControllerPressBypassed) { - button.renderRequired = button.pressed != padDataVal; - button.pressed = padDataVal; - return false; - } - } - button.prevPressedVal = padDataVal; - padDataVal = button.pressed; - return button.prevPressedVal != button.pressed; + return this->UpdateButtonData(padDataVal, ignoreRealController, readOnly); } bool ControllerPressureButton::UpdateData(u8 &padDataVal, bool ignoreRealController, bool readOnly) @@ -177,7 +166,7 @@ bool ControllerPressureButton::UpdateData(u8 &padDataVal, bool ignoreRealControl button.isControllerPressureBypassed = false; } if (bypassedWithChangedState || !button.isControllerPressureBypassed) { - button.renderRequired = button.pressure != padDataVal; + button.widgetUpdateRequired = button.pressure != padDataVal; button.pressure = padDataVal; return false; } @@ -197,7 +186,7 @@ bool AnalogVector::UpdateData(u8 &padDataVal, bool ignoreRealController, bool re vector.isControllerBypassed = false; } if (bypassedWithChangedState || !vector.isControllerBypassed) { - vector.renderRequired = vector.val != padDataVal; + vector.widgetUpdateRequired = vector.val != padDataVal; vector.val = padDataVal; return false; } diff --git a/pcsx2/Recording/VirtualPad/VirtualPadResources.h b/pcsx2/Recording/VirtualPad/VirtualPadResources.h index 3f80b669dc..c33bb2aeb7 100644 --- a/pcsx2/Recording/VirtualPad/VirtualPadResources.h +++ b/pcsx2/Recording/VirtualPad/VirtualPadResources.h @@ -21,15 +21,15 @@ struct ImageFile { wxBitmap image; wxPoint coords; - u32 width; - u32 height; + u32 width = 0; + u32 height = 0; }; struct AnalogVector { // GUI - wxSlider *slider; - wxSpinCtrl *spinner; + wxSlider *slider = 0; + wxSpinCtrl *spinner = 0; u8 val = 127; @@ -46,8 +46,8 @@ struct AnalogPosition wxPoint centerCoords; wxPoint endCoords; - int lineThickness; - int radius; + int lineThickness = 0; + int radius = 0; }; class VirtualPadElement @@ -59,41 +59,43 @@ public: virtual void Render(wxDC &dc) = 0; }; -class ControllerNormalButton : VirtualPadElement +class ControllerButton +{ +public: + bool pressed = false; + bool widgetUpdateRequired = false; + bool isControllerPressBypassed = false; + bool prevPressedVal = false; + + bool UpdateButtonData(bool &padDataVal, bool ignoreRealController, bool readOnly); +}; + +class ControllerNormalButton : public ControllerButton, VirtualPadElement { public: /// GUI ImageFile icon; - wxCheckBox *pressedBox; + wxCheckBox *pressedBox = 0; - bool pressed = false; - - /// State - bool renderRequired = false; - bool isControllerBypassed; - bool prevPressedVal; + /// State void UpdateGuiElement(std::queue *renderQueue, bool &clearScreenRequired) override; void Render(wxDC &dc) override; bool UpdateData(bool &padDataVal, bool ignoreRealController, bool readOnly); }; -class ControllerPressureButton : VirtualPadElement +class ControllerPressureButton : public ControllerButton, VirtualPadElement { public: /// GUI ImageFile icon; - wxSpinCtrl *pressureSpinner; + wxSpinCtrl *pressureSpinner = 0; - bool pressed = false; - u8 pressure; + u8 pressure = 0; /// State Management - bool renderRequired = false; - bool isControllerPressBypassed; - bool isControllerPressureBypassed; - bool prevPressedVal; - u8 prevPressureVal; + bool isControllerPressureBypassed = false; + u8 prevPressureVal = 0; void UpdateGuiElement(std::queue *renderQueue, bool &clearScreenRequired) override; void Render(wxDC &dc) override;