Input: Added snes mouse support

This commit is contained in:
Sour 2019-03-15 14:16:27 -04:00
parent 9c82005a5c
commit a8d9b77c98
7 changed files with 120 additions and 20 deletions

View file

@ -8,6 +8,7 @@
#include "IInputProvider.h"
#include "IInputRecorder.h"
#include "SnesController.h"
#include "SnesMouse.h"
#include "../Utilities/Serializer.h"
ControlManager::ControlManager(shared_ptr<Console> console)
@ -100,7 +101,7 @@ shared_ptr<BaseControlDevice> ControlManager::CreateControllerDevice(ControllerT
switch(type) {
case ControllerType::None: break;
case ControllerType::SnesController: device.reset(new SnesController(console, port, cfg.Controllers[port].Keys)); break;
case ControllerType::SnesMouse: break;
case ControllerType::SnesMouse: device.reset(new SnesMouse(console, port)); break;
case ControllerType::SuperScope: break;
}

View file

@ -114,6 +114,7 @@
<ClInclude Include="SettingTypes.h" />
<ClInclude Include="ShortcutKeyHandler.h" />
<ClInclude Include="SnesController.h" />
<ClInclude Include="SnesMouse.h" />
<ClInclude Include="SNES_SPC.h" />
<ClInclude Include="SoundMixer.h" />
<ClInclude Include="SoundResampler.h" />

View file

@ -248,6 +248,9 @@
<ClInclude Include="WaveRecorder.h">
<Filter>Misc</Filter>
</ClInclude>
<ClInclude Include="SnesMouse.h">
<Filter>SNES\Input</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp" />

View file

@ -1,6 +1,9 @@
#include "stdafx.h"
#include "KeyManager.h"
#include "IKeyManager.h"
#include "EmuSettings.h"
#include "Console.h"
#include "VideoDecoder.h"
IKeyManager* KeyManager::_keyManager = nullptr;
MousePosition KeyManager::_mousePosition = { 0, 0 };
@ -31,10 +34,10 @@ bool KeyManager::IsKeyPressed(uint32_t keyCode)
bool KeyManager::IsMouseButtonPressed(MouseButton button)
{
//TODO
/*if(_keyManager != nullptr) {
return _settings->InputEnabled() && _keyManager->IsMouseButtonPressed(button);
}*/
if(_keyManager != nullptr) {
//TODO return _settings->InputEnabled() &&
return _keyManager->IsMouseButtonPressed(button);
}
return false;
}
@ -75,30 +78,29 @@ void KeyManager::SetMouseMovement(int16_t x, int16_t y)
_yMouseMovement += y;
}
MouseMovement KeyManager::GetMouseMovement(double mouseSensitivity)
MouseMovement KeyManager::GetMouseMovement(double videoScale, double mouseSensitivity)
{
//TODO
//double factor = _settings->GetVideoScale() / mouseSensitivity;
double factor = videoScale / mouseSensitivity;
MouseMovement mov = {};
/*mov.dx = (int16_t)(_xMouseMovement / factor);
mov.dx = (int16_t)(_xMouseMovement / factor);
mov.dy = (int16_t)(_yMouseMovement / factor);
_xMouseMovement -= (int16_t)(mov.dx * factor);
_yMouseMovement -= (int16_t)(mov.dy * factor);*/
_yMouseMovement -= (int16_t)(mov.dy * factor);
return mov;
}
void KeyManager::SetMousePosition(double x, double y)
void KeyManager::SetMousePosition(shared_ptr<Console> console, double x, double y)
{
//TODO
/*if(x < 0 || y < 0) {
if(x < 0 || y < 0) {
_mousePosition.X = -1;
_mousePosition.Y = -1;
} else {
OverscanDimensions overscan = _settings->GetOverscanDimensions();
_mousePosition.X = (int32_t)(x * (PPU::ScreenWidth - overscan.Left - overscan.Right) + overscan.Left);
_mousePosition.Y = (int32_t)(y * (PPU::ScreenHeight - overscan.Top - overscan.Bottom) + overscan.Top);
}*/
OverscanDimensions overscan = console->GetSettings()->GetOverscan();
ScreenSize size = console->GetVideoDecoder()->GetScreenSize(false);
_mousePosition.X = (int32_t)(x*size.Width + overscan.Left);
_mousePosition.Y = (int32_t)(y*size.Height + overscan.Top);
}
}
MousePosition KeyManager::GetMousePosition()

View file

@ -2,6 +2,8 @@
#include "stdafx.h"
#include "IKeyManager.h"
class Console;
class KeyManager
{
private:
@ -23,8 +25,8 @@ public:
static void UpdateDevices();
static void SetMouseMovement(int16_t x, int16_t y);
static MouseMovement GetMouseMovement(double mouseSensitivity);
static MouseMovement GetMouseMovement(double videoScale, double mouseSensitivity);
static void SetMousePosition(double x, double y);
static void SetMousePosition(shared_ptr<Console> console, double x, double y);
static MousePosition GetMousePosition();
};

89
Core/SnesMouse.h Normal file
View file

@ -0,0 +1,89 @@
#pragma once
#include "stdafx.h"
#include "BaseControlDevice.h"
#include "IKeyManager.h"
#include "KeyManager.h"
#include "Console.h"
#include "EmuSettings.h"
#include "../Utilities/Serializer.h"
class SnesMouse : public BaseControlDevice
{
private:
uint32_t _stateBuffer = 0;
uint8_t _sensitivity = 0;
protected:
bool HasCoordinates() override { return true; }
enum Buttons { Left = 0, Right };
void Serialize(Serializer &s) override
{
BaseControlDevice::Serialize(s);
s.Stream(_stateBuffer, _sensitivity);
}
string GetKeyNames() override
{
return "LR";
}
void InternalSetStateFromInput() override
{
SetPressedState(Buttons::Left, KeyManager::IsMouseButtonPressed(MouseButton::LeftButton));
SetPressedState(Buttons::Right, KeyManager::IsMouseButtonPressed(MouseButton::RightButton));
SetMovement(KeyManager::GetMouseMovement(
_console->GetSettings()->GetVideoConfig().VideoScale,
_console->GetSettings()->GetInputConfig().MouseSensitivity + 1
));
}
public:
SnesMouse(shared_ptr<Console> console, uint8_t port) : BaseControlDevice(console, port)
{
}
void WriteRam(uint16_t addr, uint8_t value) override
{
StrobeProcessWrite(value);
}
uint8_t ReadRam(uint16_t addr) override
{
uint8_t output = 0;
if((addr == 0x4016 && (_port & 0x01) == 0) || (addr == 0x4017 && (_port & 0x01) == 1)) {
if(_strobe) {
_sensitivity = (_sensitivity + 1) % 3;
}
output = (_stateBuffer & 0x80000000) >> 31;
if(_port >= 2) {
output <<= 1;
}
_stateBuffer <<= 1;
StrobeProcessRead();
}
return output;
}
void RefreshStateBuffer() override
{
MouseMovement mov = GetMovement();
int32_t dx = mov.dx * (1 + _sensitivity);
int32_t dy = mov.dy * (1 + _sensitivity);
uint32_t upFlag = dy < 0 ? 0x80 : 0;
uint32_t leftFlag = dx < 0 ? 0x80 : 0;
dx = std::min(std::abs(dx), 127);
dy = std::min(std::abs(dy), 127);
uint8_t byte1 = 0;
uint8_t byte2 = 0x01 | ((_sensitivity & 0x03) << 4) | (IsPressed(SnesMouse::Buttons::Left) ? 0x40 : 0) | (IsPressed(SnesMouse::Buttons::Right) ? 0x80 : 0);
uint8_t byte3 = dy | upFlag;
uint8_t byte4 = dx | leftFlag;
_stateBuffer = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
}
};

View file

@ -1,9 +1,11 @@
#include "stdafx.h"
#include "../Core/Console.h"
#include "../Core/KeyManager.h"
#include "../Core/ShortcutKeyHandler.h"
extern unique_ptr<IKeyManager> _keyManager;
extern unique_ptr<ShortcutKeyHandler> _shortcutKeyHandler;
extern shared_ptr<Console> _console;
static string _returnString;
@ -11,7 +13,7 @@ extern "C"
{
DllExport void __stdcall SetMousePosition(double x, double y)
{
KeyManager::SetMousePosition(x, y);
KeyManager::SetMousePosition(_console, x, y);
}
DllExport void __stdcall SetMouseMovement(int16_t x, int16_t y)