Mesen-SX/Core/InputHud.cpp
2020-12-19 23:30:09 +03:00

215 lines
7.3 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;
}
}
}
}