mirror of
https://github.com/libretro/Mesen-S.git
synced 2024-11-30 03:50:21 +00:00
185 lines
7.1 KiB
C++
185 lines
7.1 KiB
C++
#include "stdafx.h"
|
|
#include "InputHud.h"
|
|
#include "BaseControlDevice.h"
|
|
#include "SnesController.h"
|
|
#include "Multitap.h"
|
|
#include "SnesMouse.h"
|
|
#include "SuperScope.h"
|
|
#include "Console.h"
|
|
#include "EmuSettings.h"
|
|
#include "DebugHud.h"
|
|
#include "ControlManager.h"
|
|
|
|
static constexpr int color[2] = { 0x00111111, 0x00FFFFFF };
|
|
|
|
InputHud::InputHud(Console* console)
|
|
{
|
|
_console = console;
|
|
}
|
|
|
|
void InputHud::DrawController(int port, ControlDeviceState state, int x, int y, int frameNumber)
|
|
{
|
|
|
|
SnesController controller(_console, 0, KeyMappingSet());
|
|
controller.SetRawState(state);
|
|
|
|
shared_ptr<DebugHud> hud = _console->GetDebugHud();
|
|
hud->DrawRectangle(0 + x, 0 + y, 35, 14, 0x80CCCCCC, true, 1, frameNumber);
|
|
hud->DrawRectangle(0 + x, 0 + y, 35, 14, color[0], false, 1, frameNumber);
|
|
hud->DrawRectangle(5 + x, 3 + y, 3, 3, color[controller.IsPressed(SnesController::Buttons::Up)], true, 1, frameNumber);
|
|
hud->DrawRectangle(5 + x, 9 + y, 3, 3, color[controller.IsPressed(SnesController::Buttons::Down)], true, 1, frameNumber);
|
|
hud->DrawRectangle(2 + x, 6 + y, 3, 3, color[controller.IsPressed(SnesController::Buttons::Left)], true, 1, frameNumber);
|
|
hud->DrawRectangle(8 + x, 6 + y, 3, 3, color[controller.IsPressed(SnesController::Buttons::Right)], true, 1, frameNumber);
|
|
hud->DrawRectangle(5 + x, 6 + y, 3, 3, color[0], true, 1, frameNumber);
|
|
|
|
hud->DrawRectangle(27 + x, 3 + y, 3, 3, color[controller.IsPressed(SnesController::Buttons::X)], true, 1, frameNumber);
|
|
hud->DrawRectangle(27 + x, 9 + y, 3, 3, color[controller.IsPressed(SnesController::Buttons::B)], true, 1, frameNumber);
|
|
hud->DrawRectangle(30 + x, 6 + y, 3, 3, color[controller.IsPressed(SnesController::Buttons::A)], true, 1, frameNumber);
|
|
hud->DrawRectangle(24 + x, 6 + y, 3, 3, color[controller.IsPressed(SnesController::Buttons::Y)], true, 1, frameNumber);
|
|
|
|
hud->DrawRectangle(4 + x, 0 + y, 5, 2, color[controller.IsPressed(SnesController::Buttons::L)], true, 1, frameNumber);
|
|
hud->DrawRectangle(26 + x, 0 + y, 5, 2, color[controller.IsPressed(SnesController::Buttons::R)], true, 1, frameNumber);
|
|
|
|
hud->DrawRectangle(13 + x, 9 + y, 4, 2, color[controller.IsPressed(SnesController::Buttons::Select)], true, 1, frameNumber);
|
|
hud->DrawRectangle(18 + x, 9 + y, 4, 2, color[controller.IsPressed(SnesController::Buttons::Start)], true, 1, frameNumber);
|
|
|
|
switch(port) {
|
|
case 0:
|
|
//1
|
|
hud->DrawLine(17 + x, 2 + y, 17 + x, 6 + y, color[0], 1, frameNumber);
|
|
hud->DrawLine(16 + x, 6 + y, 18 + x, 6 + y, color[0], 1, frameNumber);
|
|
hud->DrawPixel(16 + x, 3 + y, color[0], 1, frameNumber);
|
|
break;
|
|
|
|
case 1:
|
|
//2
|
|
hud->DrawLine(16 + x, 2 + y, 18 + x, 2 + y, color[0], 1, frameNumber);
|
|
hud->DrawPixel(18 + x, 3 + y, color[0], 1, frameNumber);
|
|
hud->DrawLine(16 + x, 4 + y, 18 + x, 4 + y, color[0], 1, frameNumber);
|
|
hud->DrawPixel(16 + x, 5 + y, color[0], 1, frameNumber);
|
|
hud->DrawLine(16 + x, 6 + y, 18 + x, 6 + y, color[0], 1, frameNumber);
|
|
break;
|
|
|
|
case 2:
|
|
//3
|
|
hud->DrawLine(16 + x, 2 + y, 18 + x, 2 + y, color[0], 1, frameNumber);
|
|
hud->DrawPixel(18 + x, 3 + y, color[0], 1, frameNumber);
|
|
hud->DrawLine(16 + x, 4 + y, 18 + x, 4 + y, color[0], 1, frameNumber);
|
|
hud->DrawPixel(18 + x, 5 + y, color[0], 1, frameNumber);
|
|
hud->DrawLine(16 + x, 6 + y, 18 + x, 6 + y, color[0], 1, frameNumber);
|
|
break;
|
|
|
|
case 3:
|
|
//4
|
|
hud->DrawLine(16 + x, 2 + y, 16 + x, 4 + y, color[0], 1, frameNumber);
|
|
hud->DrawLine(18 + x, 2 + y, 18 + x, 6 + y, color[0], 1, frameNumber);
|
|
hud->DrawLine(16 + x, 4 + y, 18 + x, 4 + y, color[0], 1, frameNumber);
|
|
break;
|
|
|
|
case 4:
|
|
//5
|
|
hud->DrawLine(16 + x, 2 + y, 18 + x, 2 + y, color[0], 1, frameNumber);
|
|
hud->DrawPixel(16 + x, 3 + y, color[0], 1, frameNumber);
|
|
hud->DrawLine(16 + x, 4 + y, 18 + x, 4 + y, color[0], 1, frameNumber);
|
|
hud->DrawPixel(18 + x, 5 + y, color[0], 1, frameNumber);
|
|
hud->DrawLine(16 + x, 6 + y, 18 + x, 6 + y, color[0], 1, frameNumber);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void InputHud::DrawControllers(OverscanDimensions overscan, int frameNumber)
|
|
{
|
|
vector<ControllerData> controllerData = _console->GetControlManager()->GetPortStates();
|
|
InputConfig cfg = _console->GetSettings()->GetInputConfig();
|
|
|
|
int xStart;
|
|
int yStart;
|
|
int xOffset = cfg.DisplayInputHorizontally ? 38 : 0;
|
|
int yOffset = cfg.DisplayInputHorizontally ? 0 : 16;
|
|
|
|
switch(cfg.DisplayInputPosition) {
|
|
default:
|
|
case InputDisplayPosition::TopLeft:
|
|
xStart = overscan.Left + 3;
|
|
yStart = overscan.Top + 3;
|
|
break;
|
|
case InputDisplayPosition::TopRight:
|
|
xStart = 256 - overscan.Right - 38;
|
|
yStart = overscan.Top + 3;
|
|
xOffset = -xOffset;
|
|
break;
|
|
case InputDisplayPosition::BottomLeft:
|
|
xStart = overscan.Left + 3;
|
|
yStart = 240 - overscan.Bottom - 18;
|
|
yOffset = -yOffset;
|
|
break;
|
|
case InputDisplayPosition::BottomRight:
|
|
xStart = 256 - overscan.Right - 38;
|
|
yStart = 240 - overscan.Bottom - 18;
|
|
xOffset = -xOffset;
|
|
yOffset = -yOffset;
|
|
break;
|
|
}
|
|
|
|
for(int i = 0; i < (int)controllerData.size(); i++) {
|
|
if(controllerData[i].Type == ControllerType::SnesController) {
|
|
if(cfg.DisplayInputPort[i]) {
|
|
DrawController(i, controllerData[i].State, xStart, yStart, frameNumber);
|
|
xStart += xOffset;
|
|
yStart += yOffset;
|
|
}
|
|
} else if(controllerData[i].Type == ControllerType::Multitap) {
|
|
uint64_t rawData = 0;
|
|
for(int j = (int)controllerData[i].State.State.size() - 1; j >= 0; j--) {
|
|
rawData <<= 8;
|
|
rawData |= controllerData[i].State.State[j];
|
|
}
|
|
|
|
ControlDeviceState controllers[4] = {};
|
|
for(int j = 0; j < 4; j++) {
|
|
controllers[j].State.push_back(rawData & 0xFF);
|
|
controllers[j].State.push_back((rawData >> 8) & 0x0F);
|
|
rawData >>= 12;
|
|
}
|
|
|
|
if(cfg.DisplayInputPort[i]) {
|
|
DrawController(i, controllers[0], xStart, yStart, frameNumber);
|
|
xStart += xOffset;
|
|
yStart += yOffset;
|
|
}
|
|
|
|
for(int j = 1; j < 4; j++) {
|
|
if(cfg.DisplayInputPort[j + 1]) {
|
|
DrawController(j + 1, controllers[j], xStart, yStart, frameNumber);
|
|
xStart += xOffset;
|
|
yStart += yOffset;
|
|
}
|
|
}
|
|
} else if(controllerData[i].Type == ControllerType::SuperScope) {
|
|
if(cfg.DisplayInputPort[i]) {
|
|
SuperScope scope(_console, 0, KeyMappingSet());
|
|
scope.SetRawState(controllerData[i].State);
|
|
MousePosition pos = scope.GetCoordinates();
|
|
|
|
shared_ptr<DebugHud> hud = _console->GetDebugHud();
|
|
hud->DrawRectangle(pos.X - 1, pos.Y - 1, 3, 3, 0x00111111, true, 1, frameNumber);
|
|
hud->DrawRectangle(pos.X - 1, pos.Y - 1, 3, 3, 0x80CCCCCC, false, 1, frameNumber);
|
|
}
|
|
} else if(controllerData[i].Type == ControllerType::SnesMouse) {
|
|
if(cfg.DisplayInputPort[i]) {
|
|
SnesMouse mouse(_console, 0);
|
|
mouse.SetRawState(controllerData[i].State);
|
|
|
|
shared_ptr<DebugHud> hud = _console->GetDebugHud();
|
|
hud->DrawRectangle(xStart + 12, yStart, 11, 14, 0x00AAAAAA, true, 1, frameNumber);
|
|
hud->DrawRectangle(xStart + 12, yStart, 11, 14, color[0], false, 1, frameNumber);
|
|
hud->DrawRectangle(xStart + 13, yStart + 1, 4, 5, color[mouse.IsPressed(SnesMouse::Buttons::Left)], true, 1, frameNumber);
|
|
hud->DrawRectangle(xStart + 18, yStart + 1, 4, 5, color[mouse.IsPressed(SnesMouse::Buttons::Right)], true, 1, frameNumber);
|
|
|
|
xStart += xOffset;
|
|
yStart += yOffset;
|
|
}
|
|
}
|
|
}
|
|
}
|