69 lines
2.5 KiB
C++
69 lines
2.5 KiB
C++
#undef CINTERFACE
|
|
|
|
#include "avs/game.h"
|
|
#include "sdvx_sub.h"
|
|
#include "games/sdvx/sdvx.h"
|
|
#include "hooks/graphics/graphics.h"
|
|
|
|
namespace overlay::windows {
|
|
|
|
SDVXSubScreen::SDVXSubScreen(SpiceOverlay *overlay) : GenericSubScreen(overlay) {
|
|
this->title = "SDVX Sub Screen";
|
|
|
|
bool isValkyrieCabinetMode = avs::game::SPEC[0] == 'G' || avs::game::SPEC[0] == 'H';
|
|
if (!isValkyrieCabinetMode) {
|
|
this->disabled_message = "Valkyrie Model mode is not enabled!";
|
|
} else if (GRAPHICS_WINDOWED) {
|
|
if (GRAPHICS_PREVENT_SECONDARY_WINDOW) {
|
|
this->disabled_message = "Subscreen has been disabled by the user (-sdvxnosub).";
|
|
} else {
|
|
this->disabled_message = "Overlay unavailable in windowed mode! Use the second window instead.";
|
|
}
|
|
}
|
|
|
|
const auto padding = ImGui::GetFrameHeight() / 2;
|
|
|
|
this->init_size = ImVec2(ImGui::GetIO().DisplaySize.x - (padding * 2), 0.f);
|
|
this->init_size.y = (this->init_size.x * 9 / 16) + ImGui::GetFrameHeight();
|
|
|
|
this->init_pos = ImVec2(ImGui::GetIO().DisplaySize.x / 2 - this->init_size.x / 2, 0);
|
|
switch (games::sdvx::OVERLAY_POS) {
|
|
case games::sdvx::SDVX_OVERLAY_TOP:
|
|
this->init_pos.y = padding;
|
|
break;
|
|
case games::sdvx::SDVX_OVERLAY_BOTTOM:
|
|
this->init_pos.y = ImGui::GetIO().DisplaySize.y - this->init_size.y - padding;
|
|
break;
|
|
case games::sdvx::SDVX_OVERLAY_MIDDLE:
|
|
default:
|
|
this->init_pos.y = (ImGui::GetIO().DisplaySize.y / 2) - (this->init_size.y / 2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void SDVXSubScreen::touch_transform(const ImVec2 xy_in, LONG *x_out, LONG *y_out) {
|
|
if (!this->get_active()) {
|
|
return;
|
|
}
|
|
|
|
// SDVX Valkyrie cab needs math to make things work
|
|
// what the game expects from touch screen:
|
|
// [1080, 0 1920, 1080]
|
|
// [0, 0 0, 1920]
|
|
|
|
// actual cursor position given by x_in (on the overlay, normalized):
|
|
// [0, 0 1, 0]
|
|
// [0, 1 1, 1]
|
|
|
|
// Basically, the game operates on rotated coordinates, but on top of that,
|
|
// it needs to be adjusted so they match up with the subscreen overlay.
|
|
|
|
// so the math is:
|
|
// Xin(0, 1) => Yout(0, 1920)
|
|
// Yin(0, 1) => Xout(1080, 0)
|
|
|
|
*x_out = ImGui::GetIO().DisplaySize.x * (1.f - xy_in.y);
|
|
*y_out = ImGui::GetIO().DisplaySize.y * xy_in.x;
|
|
}
|
|
}
|