diff options
Diffstat (limited to 'source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp')
-rw-r--r-- | source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp | 333 |
1 files changed, 150 insertions, 183 deletions
diff --git a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp index aa5fc9eb8f3..e8e29fb2769 100644 --- a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp +++ b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp @@ -24,14 +24,18 @@ * * ***** END GPL LICENSE BLOCK ***** */ +#ifndef DISABLE_SDL #include <SDL.h> +#endif + +#include <stdio.h> #include "SCA_Joystick.h" #include "SCA_JoystickPrivate.h" - -SCA_Joystick::SCA_Joystick() +SCA_Joystick::SCA_Joystick(short int index) : + m_joyindex(index), m_axis10(0), m_axis11(0), m_axis20(0), @@ -40,78 +44,100 @@ SCA_Joystick::SCA_Joystick() m_buttonnum(-2), m_hatdir(-2), m_isinit(0), - m_istrig(0) + m_istrig_axis(0), + m_istrig_button(0), + m_istrig_hat(0), + m_axismax(-1), + m_buttonmax(-1), + m_hatmax(-1) { +#ifndef DISABLE_SDL m_private = new PrivateData(); +#endif } SCA_Joystick::~SCA_Joystick() { +#ifndef DISABLE_SDL delete m_private; +#endif } +SCA_Joystick *SCA_Joystick::m_instance[JOYINDEX_MAX]; +int SCA_Joystick::m_refCount = 0; -bool SCA_Joystick::CreateJoystickDevice() +SCA_Joystick *SCA_Joystick::GetInstance( short int joyindex ) { - bool init = false; - init = pCreateJoystickDevice(); - return init; -} - +#ifdef DISABLE_SDL + return NULL; +#else + if (joyindex < 0 || joyindex >= JOYINDEX_MAX) { + echo("Error-invalid joystick index: " << joyindex); + return NULL; + } -void SCA_Joystick::DestroyJoystickDevice() -{ - if(m_isinit) - pDestroyJoystickDevice(); + if (m_refCount == 0) + { + int i; + // do this once only + if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO ) == -1 ){ + echo("Error-Initializing-SDL: " << SDL_GetError()); + return NULL; + } + for (i=0; i<JOYINDEX_MAX; i++) { + m_instance[i] = new SCA_Joystick(i); + m_instance[i]->CreateJoystickDevice(); + } + m_refCount = 1; + } + else + { + m_refCount++; + } + return m_instance[joyindex]; +#endif } - -void SCA_Joystick::HandleEvents() +void SCA_Joystick::ReleaseInstance() { - if(m_isinit) + if (--m_refCount == 0) { - if(SDL_PollEvent(&m_private->m_event)) - { - switch(m_private->m_event.type) - { - case SDL_JOYAXISMOTION: - HANDLE_AXISMOTION(OnAxisMotion); - break; - case SDL_JOYHATMOTION: - HANDLE_HATMOTION(OnHatMotion); - break; - case SDL_JOYBUTTONUP: - HANDLE_BUTTONUP(OnButtonUp); - break; - case SDL_JOYBUTTONDOWN: - HANDLE_BUTTONDOWN(OnButtonDown); - break; - case SDL_JOYBALLMOTION: - HANDLE_BALLMOTION(OnBallMotion); - break; - default: - HANDLE_NOEVENT(OnNothing); - break; +#ifndef DISABLE_SDL + int i; + for (i=0; i<JOYINDEX_MAX; i++) { + if (m_instance[i]) { + m_instance[i]->DestroyJoystickDevice(); + delete m_instance[i]; } + m_instance[i]= NULL; } + + SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO ); +#endif } } - void SCA_Joystick::cSetPrecision(int val) { m_prec = val; } +bool SCA_Joystick::aAnyAxisIsPositive(int axis) +{ + bool result; + int res = pAxisTest(axis); + res > m_prec? result = true: result = false; + return result; +} + bool SCA_Joystick::aRightAxisIsPositive(int axis) { bool result; int res = pGetAxis(axis,1); res > m_prec? result = true: result = false; - m_istrig = result; return result; } @@ -121,7 +147,6 @@ bool SCA_Joystick::aUpAxisIsPositive(int axis) bool result; int res = pGetAxis(axis,0); res < -m_prec? result = true : result = false; - m_istrig = result; return result; } @@ -131,7 +156,6 @@ bool SCA_Joystick::aLeftAxisIsPositive(int axis) bool result; int res = pGetAxis(axis,1); res < -m_prec ? result = true : result = false; - m_istrig = result; return result; } @@ -141,26 +165,40 @@ bool SCA_Joystick::aDownAxisIsPositive(int axis) bool result; int res = pGetAxis(axis,0); res > m_prec ? result = true:result = false; - m_istrig = result; return result; } +bool SCA_Joystick::aAnyButtonPressIsPositive(void) +{ + return (m_buttonnum==-2) ? false : true; +} + +bool SCA_Joystick::aAnyButtonReleaseIsPositive(void) +{ + return (m_buttonnum==-2) ? true : false; +} bool SCA_Joystick::aButtonPressIsPositive(int button) { +#ifdef DISABLE_SDL + return false; +#else bool result; SDL_JoystickGetButton(m_private->m_joystick, button)? result = true:result = false; - m_istrig = result; return result; +#endif } bool SCA_Joystick::aButtonReleaseIsPositive(int button) { +#ifdef DISABLE_SDL + return false; +#else bool result; SDL_JoystickGetButton(m_private->m_joystick, button)? result = false : result = true; - m_istrig = result; return result; +#endif } @@ -169,27 +207,9 @@ bool SCA_Joystick::aHatIsPositive(int dir) bool result; int res = pGetHat(dir); res == dir? result = true : result = false; - m_istrig = result; return result; } - -int SCA_Joystick::pGetButtonPress(int button) -{ - if(button == m_buttonnum) - return m_buttonnum; - return -2; -} - - -int SCA_Joystick::pGetButtonRelease(int button) -{ - if(button == m_buttonnum) - return m_buttonnum; - return -2; -} - - int SCA_Joystick::pGetHat(int direction) { if(direction == m_hatdir){ @@ -198,174 +218,121 @@ int SCA_Joystick::pGetHat(int direction) return 0; } - -bool SCA_Joystick::GetJoyAxisMotion() -{ - bool result = false; - if(m_isinit){ - if(SDL_PollEvent(&m_private->m_event)){ - switch(m_private->m_event.type) - { - case SDL_JOYAXISMOTION: - result = true; - break; - } - } - } - return result; -} - - -bool SCA_Joystick::GetJoyButtonPress() -{ - bool result = false; - if(m_isinit){ - if(SDL_PollEvent(&m_private->m_event)){ - switch(m_private->m_event.type) - { - case SDL_JOYBUTTONDOWN: - result = true; - break; - } - } - } - return result; -} - - -bool SCA_Joystick::GetJoyButtonRelease() -{ - bool result = false; - if(m_isinit) - { - if(SDL_PollEvent(&m_private->m_event)){ - switch(m_private->m_event.type) - { - case SDL_JOYBUTTONUP: - result = true; - break; - } - } - } - return result; -} - - -bool SCA_Joystick::GetJoyHatMotion() -{ - bool result = false; - if(m_isinit){ - if(SDL_PollEvent(&m_private->m_event)){ - switch(m_private->m_event.type) - { - case SDL_JOYHATMOTION: - result = true; - break; - } - } - } - return 0; -} - - int SCA_Joystick::GetNumberOfAxes() { - int number; - if(m_isinit){ - if(m_private->m_joystick){ - number = SDL_JoystickNumAxes(m_private->m_joystick); - return number; - } - } - return -1; + return m_axismax; } int SCA_Joystick::GetNumberOfButtons() { - int number; - if(m_isinit){ - if(m_private->m_joystick){ - number = SDL_JoystickNumButtons(m_private->m_joystick); - return number; - } - } - return -1; + return m_buttonmax; } int SCA_Joystick::GetNumberOfHats() { - int number; - if(m_isinit){ - if(m_private->m_joystick){ - number = SDL_JoystickNumHats(m_private->m_joystick); - return number; - } - } - return -1; + return m_hatmax; } -bool SCA_Joystick::pCreateJoystickDevice() +bool SCA_Joystick::CreateJoystickDevice(void) { +#ifdef DISABLE_SDL + return false; +#else if(m_isinit == false){ - if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO ) == -1 ){ - echo("Error-Initializing-SDL: " << SDL_GetError()); - return false; - } - if(SDL_NumJoysticks() > 0){ - for(int i=0; i<SDL_NumJoysticks();i++){ - m_private->m_joystick = SDL_JoystickOpen(i); - SDL_JoystickEventState(SDL_ENABLE); - m_numjoys = i; - } - echo("Joystick-initialized"); - m_isinit = true; - return true; - }else{ - echo("Joystick-Error: " << SDL_NumJoysticks() << " avaiable joystick(s)"); + if (m_joyindex>=SDL_NumJoysticks()) { + // don't print a message, because this is done anyway + //echo("Joystick-Error: " << SDL_NumJoysticks() << " avaiable joystick(s)"); return false; } + + m_private->m_joystick = SDL_JoystickOpen(m_joyindex); + SDL_JoystickEventState(SDL_ENABLE); + m_isinit = true; + + echo("Joystick " << m_joyindex << " initialized"); + + /* must run after being initialized */ + m_axismax = SDL_JoystickNumAxes(m_private->m_joystick); + m_buttonmax = SDL_JoystickNumButtons(m_private->m_joystick); + m_hatmax = SDL_JoystickNumHats(m_private->m_joystick); } - return false; + return true; +#endif } -void SCA_Joystick::pDestroyJoystickDevice() +void SCA_Joystick::DestroyJoystickDevice(void) { - echo("Closing-"); - for(int i=0; i<SDL_NumJoysticks(); i++){ - if(SDL_JoystickOpened(i)){ +#ifndef DISABLE_SDL + if (m_isinit){ + if(SDL_JoystickOpened(m_joyindex)){ + echo("Closing-joystick " << m_joyindex); SDL_JoystickClose(m_private->m_joystick); } + m_isinit = false; } - SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO ); +#endif } +int SCA_Joystick::Connected(void) +{ +#ifndef DISABLE_SDL + if (m_isinit && SDL_JoystickOpened(m_joyindex)) + return 1; +#endif + return 0; +} void SCA_Joystick::pFillAxes() { - if(GetNumberOfAxes() == 1){ +#ifndef DISABLE_SDL + if(m_axismax == 1){ m_axis10 = SDL_JoystickGetAxis(m_private->m_joystick, 0); m_axis11 = SDL_JoystickGetAxis(m_private->m_joystick, 1); - }else if(GetNumberOfAxes() > 1){ + }else if(m_axismax > 1){ m_axis10 = SDL_JoystickGetAxis(m_private->m_joystick, 0); m_axis11 = SDL_JoystickGetAxis(m_private->m_joystick, 1); m_axis20 = SDL_JoystickGetAxis(m_private->m_joystick, 2); m_axis21 = SDL_JoystickGetAxis(m_private->m_joystick, 3); }else{ - m_axis10 = 0;m_axis11 = 0; - m_axis20 = 0;m_axis21 = 0; + m_axis10 = m_axis11 = m_axis20 = m_axis21 = 0; } +#endif } int SCA_Joystick::pGetAxis(int axisnum, int udlr) { +#ifndef DISABLE_SDL if(axisnum == 1 && udlr == 1)return m_axis10; //u/d if(axisnum == 1 && udlr == 0)return m_axis11; //l/r if(axisnum == 2 && udlr == 0)return m_axis20; //... if(axisnum == 2 && udlr == 1)return m_axis21; +#endif + return 0; +} + +int SCA_Joystick::pAxisTest(int axisnum) +{ +#ifndef DISABLE_SDL + short i1,i2; + if(axisnum == 1) { + i1 = m_axis10; i2 = m_axis11; + } + else if(axisnum == 2) { + i1 = m_axis20; i2 = m_axis21; + } + /* long winded way to do + * return MAX2(abs(i1), abs(i2)) + * avoid abs from math.h */ + if (i1 < 0) i1 = -i1; + if (i2 < 0) i2 = -i2; + if (i1 <i2) return i2; + else return i1; +#else return 0; +#endif } |