Input - Added normalized cordinates

This commit is contained in:
dean11 2014-02-20 11:27:43 +01:00
parent 263eba782b
commit 53dc42ffc4
7 changed files with 85 additions and 30 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<ShowAllFiles>false</ShowAllFiles> <ShowAllFiles>true</ShowAllFiles>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory> <LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>

View File

@ -36,14 +36,22 @@ namespace Input
/*********************************************************************/ /*********************************************************************/
namespace Struct namespace Struct
{ {
struct SAIPoint2D struct SAIPointInt2D
{ {
int x; int x;
int y; int y;
SAIPoint2D() :x(0), y(0) { } SAIPointInt2D() :x(0), y(0) { }
SAIPoint2D(int _x, int _y) :x(_x), y(_y) { } SAIPointInt2D(int _x, int _y) :x(_x), y(_y) { }
int Length() { return (abs(x) + abs(y)); } int Length() { return (abs(x) + abs(y)); }
}; };
struct SAIPointFloat2D
{
float x;
float y;
SAIPointFloat2D() :x(0.0f), y(0.0f) { }
SAIPointFloat2D(float _x, float _y) :x(_x), y(_y) { }
float Length() { return (fabs(x) + fabs(y)); }
};
struct InputData; struct InputData;
} }

View File

@ -47,7 +47,7 @@ namespace Input
typedef void(*OnMousePressCallback)(Enum::SAMI btn, Mouse* sender); typedef void(*OnMousePressCallback)(Enum::SAMI btn, Mouse* sender);
typedef void(*OnMouseDownCallback)(Enum::SAMI btn, Mouse* sender); typedef void(*OnMouseDownCallback)(Enum::SAMI btn, Mouse* sender);
typedef void(*OnMouseReleaseCallback)(Enum::SAMI btn, Mouse* sender); typedef void(*OnMouseReleaseCallback)(Enum::SAMI btn, Mouse* sender);
typedef void(*OnMouseMoveCallback)(Struct::SAIPoint2D, Mouse* sender); typedef void(*OnMouseMoveCallback)(Struct::SAIPointInt2D, Mouse* sender);
typedef void(*OnMouseScrollCallback)(int delta, Mouse* sender); typedef void(*OnMouseScrollCallback)(int delta, Mouse* sender);
} }
//----------------------------------------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------------------------------------
@ -61,7 +61,7 @@ namespace Input
virtual void OnMousePress ( Enum::SAMI key, Mouse* sender ) { } virtual void OnMousePress ( Enum::SAMI key, Mouse* sender ) { }
virtual void OnMouseDown ( Enum::SAMI key, Mouse* sender ) { } virtual void OnMouseDown ( Enum::SAMI key, Mouse* sender ) { }
virtual void OnMouseRelease ( Enum::SAMI key, Mouse* sender ) { } virtual void OnMouseRelease ( Enum::SAMI key, Mouse* sender ) { }
virtual void OnMouseMove ( Struct::SAIPoint2D coordinate, Mouse* sender ) { } virtual void OnMouseMove ( Struct::SAIPointInt2D coordinate, Mouse* sender ) { }
virtual void OnMouseScroll ( int delta, Mouse* sender ) { } virtual void OnMouseScroll ( int delta, Mouse* sender ) { }
}; };
@ -69,7 +69,8 @@ namespace Input
virtual bool IsBtnUp(Enum::SAMI key) = 0; virtual bool IsBtnUp(Enum::SAMI key) = 0;
virtual bool IsBtnDown(Enum::SAMI key) = 0; virtual bool IsBtnDown(Enum::SAMI key) = 0;
virtual int GetWheelDelta() = 0; virtual int GetWheelDelta() = 0;
virtual Struct::SAIPoint2D GetPixelPosition(Struct::SAIPoint2D targetMem = Struct::SAIPoint2D()) = 0; virtual Struct::SAIPointInt2D GetPixelPosition(Struct::SAIPointInt2D targetMem = Struct::SAIPointInt2D()) = 0;
virtual Struct::SAIPointFloat2D GetNormalizedPosition(Struct::SAIPointFloat2D targetMem = Struct::SAIPointFloat2D()) = 0;
public: public:
void AddOnMousePressCallback( Typedefs::OnMousePressCallback func); void AddOnMousePressCallback( Typedefs::OnMousePressCallback func);
@ -135,7 +136,8 @@ namespace Input
protected: protected:
std::vector<MouseEvent*> mouseSubscribers; std::vector<MouseEvent*> mouseSubscribers;
MouseCallbackList* callbackList; MouseCallbackList* callbackList;
Struct::SAIPoint2D pixelPos; Struct::SAIPointInt2D pixelPos;
Struct::SAIPointFloat2D normalPos;
bool isCurorLocked; bool isCurorLocked;
int wheelDelta; int wheelDelta;
}; };

View File

@ -18,9 +18,12 @@ namespace Input
bool IsBtnUp(Enum::SAMI key) override; bool IsBtnUp(Enum::SAMI key) override;
bool IsBtnDown(Enum::SAMI key) override; bool IsBtnDown(Enum::SAMI key) override;
int GetWheelDelta() override; int GetWheelDelta() override;
Struct::SAIPoint2D GetPixelPosition(Struct::SAIPoint2D targetMem = Struct::SAIPoint2D()) override; Struct::SAIPointInt2D GetPixelPosition(Struct::SAIPointInt2D targetMem = Struct::SAIPointInt2D()) override;
Struct::SAIPointFloat2D GetNormalizedPosition(Struct::SAIPointFloat2D targetMem = Struct::SAIPointFloat2D()) override;
void ProccessMouseData (bool isDown, Enum::SAMI btn, int delta, Struct::SAIPoint2D velocity, unsigned int makeCode); void ProccessMouseData (bool isDown, Enum::SAMI btn, int delta, Struct::SAIPointInt2D velocity, unsigned int makeCode);
bool Create(HWND target);
private: private:
struct Buttons struct Buttons
@ -30,6 +33,7 @@ namespace Input
}; };
static const int MAXBUTTONS = 25; static const int MAXBUTTONS = 25;
Buttons buttons[25]; Buttons buttons[25];
RAWINPUTDEVICE device;
}; };
} }

View File

@ -81,6 +81,7 @@ Mouse::Mouse()
, wheelDelta(0) , wheelDelta(0)
, isCurorLocked(0) , isCurorLocked(0)
, pixelPos() , pixelPos()
, normalPos()
{ {
} }
Mouse::~Mouse() Mouse::~Mouse()
@ -149,6 +150,8 @@ void Mouse::SetPixelPos(int x, int y)
{ {
this->pixelPos.x = x; this->pixelPos.x = x;
this->pixelPos.y = y; this->pixelPos.y = y;
// TODO: Update normalized position
} }
void Mouse::ToggleCursor(bool toggler) void Mouse::ToggleCursor(bool toggler)
{ {

View File

@ -556,7 +556,7 @@ void MapKey(RAWKEYBOARD& rawKB, bool& out_isUp, SAKI& out_key, unsigned int& sCo
rawKB.MakeCode = scanCode; rawKB.MakeCode = scanCode;
sCode = scanCode; sCode = scanCode;
} }
void MapButton(RAWMOUSE& rawMouse, bool &isUp, Enum::SAMI& btn, int& delta, Struct::SAIPoint2D& vel, unsigned int& mcode) void MapButton(RAWMOUSE& rawMouse, bool &isUp, Enum::SAMI& btn, int& delta, Struct::SAIPointInt2D& vel, unsigned int& mcode)
{ {
if(rawMouse.lLastX != 0 || rawMouse.lLastY != 0) if(rawMouse.lLastX != 0 || rawMouse.lLastY != 0)
{ {
@ -647,7 +647,7 @@ void Win32Input::RawInputParser(HWND h, LPARAM l)
bool isUp = true; bool isUp = true;
Enum::SAMI btn = Enum::SAMI_Unknown; Enum::SAMI btn = Enum::SAMI_Unknown;
int delta = 0; int delta = 0;
Struct::SAIPoint2D vel; Struct::SAIPointInt2D vel;
unsigned int mcode = 0; unsigned int mcode = 0;
MapButton(raw->data.mouse, isUp, btn, delta, vel, mcode); MapButton(raw->data.mouse, isUp, btn, delta, vel, mcode);
@ -759,20 +759,15 @@ InputObject* Win32Input::CreateDevice(const SAIType inputType, Typedefs::WindowH
case SAIType_Mouse: case SAIType_Mouse:
{ {
rid.usUsage = RawInput_Usage_mouse;
rid.dwFlags = RIDEV_NOLEGACY | RIDEV_CAPTUREMOUSE;
if(RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)) == TRUE)
{
int i = 0;
val = (InputObject*)1;
Win32Mouse* obj = new Win32Mouse(); Win32Mouse* obj = new Win32Mouse();
this->mouse.push_back(obj); if(!obj->Create(this->targetHwin))
val = obj;
}
else
{ {
delete obj;
return 0; return 0;
} }
this->mouse.push_back(obj);
val = obj;
} }
break; break;
} }

View File

@ -1,7 +1,7 @@
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
// Created by [Dennis Andersen] [2013] // Created by [Dennis Andersen] [2013]
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
#include "..\..\Include\Win32\Win32Mouse.h" #include "..\..\Include\Win32\Win32Input.h"
using namespace Input; using namespace Input;
using namespace Input::Enum; using namespace Input::Enum;
@ -11,6 +11,7 @@ using namespace Input::Typedefs;
Win32Mouse::Win32Mouse() Win32Mouse::Win32Mouse()
{ {
memset(&this->device, 0, sizeof(RAWINPUTDEVICE));
memset(&this->buttons[0], 0, sizeof(Buttons) * MAXBUTTONS); memset(&this->buttons[0], 0, sizeof(Buttons) * MAXBUTTONS);
} }
Win32Mouse::~Win32Mouse() Win32Mouse::~Win32Mouse()
@ -34,13 +35,29 @@ int Win32Mouse::GetWheelDelta()
{ {
return this->wheelDelta; return this->wheelDelta;
} }
Struct::SAIPoint2D Win32Mouse::GetPixelPosition(Struct::SAIPoint2D targetMem) Struct::SAIPointInt2D Win32Mouse::GetPixelPosition(Struct::SAIPointInt2D targetMem)
{ {
targetMem = this->pixelPos; targetMem = this->pixelPos;
return targetMem; return targetMem;
} }
Struct::SAIPointFloat2D Win32Mouse::GetNormalizedPosition(Struct::SAIPointFloat2D targetMem)
{
POINT mousePos;
GetCursorPos( &mousePos );
void Win32Mouse::ProccessMouseData (bool isUp, Enum::SAMI btn, int delta, Struct::SAIPoint2D velocity, unsigned int makeCode) RECT windowVertex;
GetWindowRect( this->device.hwndTarget, &windowVertex );
this->normalPos.x = (float)(mousePos.x - windowVertex.left);
this->normalPos.x /= (float)(windowVertex.right - windowVertex.left);
this->normalPos.y = (float)(mousePos.y - windowVertex.top);
this->normalPos.y /= (float)(windowVertex.bottom - windowVertex.top);
return targetMem;
}
void Win32Mouse::ProccessMouseData (bool isUp, Enum::SAMI btn, int delta, Struct::SAIPointInt2D velocity, unsigned int makeCode)
{ {
if(velocity.Length() != 0) if(velocity.Length() != 0)
{ {
@ -138,4 +155,30 @@ void Win32Mouse::ProccessMouseData (bool isUp, Enum::SAMI btn, int delta, Struct
} }
} }
} }
} }
bool Win32Mouse::Create(HWND target)
{
this->device.usUsagePage = 0x01;
this->device.hwndTarget = target;
this->device.usUsage = Input::RawInput_Usage_mouse;
this->device.dwFlags = RIDEV_NOLEGACY | RIDEV_CAPTUREMOUSE;
if(RegisterRawInputDevices(&this->device, 1, sizeof(RAWINPUTDEVICE)) == TRUE)
{
return true;
}
memset(&this->device, 0, sizeof(RAWINPUTDEVICE));
return false;
}