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

View file

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

View file

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

View file

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

View file

@ -2,6 +2,8 @@
#include "stdafx.h" #include "stdafx.h"
#include "IKeyManager.h" #include "IKeyManager.h"
class Console;
class KeyManager class KeyManager
{ {
private: private:
@ -23,8 +25,8 @@ public:
static void UpdateDevices(); static void UpdateDevices();
static void SetMouseMovement(int16_t x, int16_t y); 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(); 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 "stdafx.h"
#include "../Core/Console.h"
#include "../Core/KeyManager.h" #include "../Core/KeyManager.h"
#include "../Core/ShortcutKeyHandler.h" #include "../Core/ShortcutKeyHandler.h"
extern unique_ptr<IKeyManager> _keyManager; extern unique_ptr<IKeyManager> _keyManager;
extern unique_ptr<ShortcutKeyHandler> _shortcutKeyHandler; extern unique_ptr<ShortcutKeyHandler> _shortcutKeyHandler;
extern shared_ptr<Console> _console;
static string _returnString; static string _returnString;
@ -11,7 +13,7 @@ extern "C"
{ {
DllExport void __stdcall SetMousePosition(double x, double y) 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) DllExport void __stdcall SetMouseMovement(int16_t x, int16_t y)