diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2013-04-14 23:36:00 -0500 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2013-04-14 23:36:00 -0500 |
| commit | 7772f0d071cd8f1c6b44036207b4e6f9da4d9bf7 (patch) | |
| tree | 6dbe1cff255abe6e35f51910df73daf5eecbec88 /Source/Core/InputCommon | |
| parent | 8a9fcd3014a4aee23b6fb7008a02679f8bf96200 (diff) | |
| parent | 44bbb54a62a58be4ad39caf6ba55ff98244223d5 (diff) | |
Merge branch 'Android-trash' since it is no longer quite so trashy.
Diffstat (limited to 'Source/Core/InputCommon')
7 files changed, 294 insertions, 1 deletions
diff --git a/Source/Core/InputCommon/CMakeLists.txt b/Source/Core/InputCommon/CMakeLists.txt index 3a8ea1e7a2..8fc2a344c7 100644 --- a/Source/Core/InputCommon/CMakeLists.txt +++ b/Source/Core/InputCommon/CMakeLists.txt @@ -21,6 +21,10 @@ elseif(X11_FOUND) set(SRCS ${SRCS} Src/ControllerInterface/SDL/SDL.cpp Src/ControllerInterface/Xlib/Xlib.cpp) +elseif(ANDROID) + set(SRCS ${SRCS} + Src/ControllerInterface/Android/Android.cpp + Src/Android/ButtonManager.cpp) endif() add_library(inputcommon ${SRCS}) diff --git a/Source/Core/InputCommon/Src/Android/ButtonManager.cpp b/Source/Core/InputCommon/Src/Android/ButtonManager.cpp new file mode 100644 index 0000000000..947f7b0081 --- /dev/null +++ b/Source/Core/InputCommon/Src/Android/ButtonManager.cpp @@ -0,0 +1,90 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include <vector> +#include "GLInterface.h" +#include "Android/TextureLoader.h" +#include "Android/ButtonManager.h" + +extern void DrawButton(GLuint tex, float *coords); + +namespace ButtonManager +{ + std::vector<Button*> m_buttons; + + // XXX: This needs to not be here so we can load the locations from file + // This will allow customizable button locations in the future + // These are the OpenGL on screen coordinates + float m_coords[][8] = { // X, Y, X, EY, EX, EY, EX, Y + {0.75f, -1.0f, 0.75f, -0.75f, 1.0f, -0.75f, 1.0f, -1.0f}, // A + {0.50f, -1.0f, 0.50f, -0.75f, 0.75f, -0.75f, 0.75f, -1.0f}, // B + {-0.10f, -1.0f, -0.10f, -0.80f, 0.10f, -0.80f, 0.10f, -1.0f}, // Start + }; + + void Init() + { + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + + // Initialize our buttons + m_buttons.push_back(new Button("ButtonA.png", BUTTON_A, m_coords[0])); + m_buttons.push_back(new Button("ButtonB.png", BUTTON_B, m_coords[1])); + m_buttons.push_back(new Button("ButtonStart.png", BUTTON_START, m_coords[2])); + } + bool GetButtonPressed(ButtonType button) + { + for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it) + if ((*it)->GetButtonType() == button) + return (*it)->Pressed(); + return false; + } + void TouchEvent(int action, float x, float y) + { + // Actions + // 0 is press + // 1 is let go + // 2 is move + for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it) + { + float *coords = (*it)->GetCoords(); + if ( x >= coords[0] && + x <= coords[4] && + y >= coords[1] && + y <= coords[3]) + { + if (action == 0) + (*it)->SetState(BUTTON_PRESSED); + if (action == 1) + (*it)->SetState(BUTTON_RELEASED); + if (action == 2) + ; // XXX: Be used later for analog stick + } + } + } + void Shutdown() + { + for(auto it = m_buttons.begin(); it != m_buttons.end(); ++it) + delete *it; + } + + void DrawButtons() + { + for(auto it = m_buttons.begin(); it != m_buttons.end(); ++it) + DrawButton((*it)->GetTexture(), (*it)->GetCoords()); + } + +} diff --git a/Source/Core/InputCommon/Src/Android/ButtonManager.h b/Source/Core/InputCommon/Src/Android/ButtonManager.h new file mode 100644 index 0000000000..f21ceedd98 --- /dev/null +++ b/Source/Core/InputCommon/Src/Android/ButtonManager.h @@ -0,0 +1,63 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include <string> +#include "CommonPaths.h" +#include "Android/TextureLoader.h" + +namespace ButtonManager +{ + enum ButtonType + { + BUTTON_A = 0, + BUTTON_B, + BUTTON_START, + }; + enum ButtonState + { + BUTTON_RELEASED = 0, + BUTTON_PRESSED = 1 + }; + class Button + { + private: + GLuint m_tex; + ButtonType m_button; + ButtonState m_state; + float m_coords[8]; + public: + Button(std::string filename, ButtonType button, float *coords) + { + m_tex = LoadPNG((std::string(DOLPHIN_DATA_DIR "/") + filename).c_str()); + m_button = button; + memcpy(m_coords, coords, sizeof(float) * 8); + m_state = BUTTON_RELEASED; + } + void SetState(ButtonState state) { m_state = state; } + bool Pressed() { return m_state == BUTTON_PRESSED; } + ButtonType GetButtonType() { return m_button; } + GLuint GetTexture() { return m_tex; } + float *GetCoords() { return m_coords; } + + ~Button() { glDeleteTextures(1, &m_tex); } + }; + void Init(); + void DrawButtons(); + bool GetButtonPressed(ButtonType button); + void TouchEvent(int action, float x, float y); + void Shutdown(); +} diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp new file mode 100644 index 0000000000..2d01d38f23 --- /dev/null +++ b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp @@ -0,0 +1,67 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Android.h" + +namespace ciface +{ + +namespace Android +{ + +void Init( std::vector<ControllerInterface::Device*>& devices ) +{ + devices.push_back(new Touchscreen()); +} + +// Touchscreens and stuff +std::string Touchscreen::GetName() const +{ + return "Touchscreen"; +} + +std::string Touchscreen::GetSource() const +{ + return "Android"; +} + +int Touchscreen::GetId() const +{ + return 0; +} +Touchscreen::Touchscreen() +{ + AddInput(new Button(ButtonManager::BUTTON_A)); + AddInput(new Button(ButtonManager::BUTTON_B)); + AddInput(new Button(ButtonManager::BUTTON_START)); +} +// Buttons and stuff + +std::string Touchscreen::Button::GetName() const +{ + std::ostringstream ss; + ss << "Button " << (int)m_index; + return ss.str(); +} + +ControlState Touchscreen::Button::GetState() const +{ + return ButtonManager::GetButtonPressed(m_index); +} + +} +} diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h new file mode 100644 index 0000000000..9bdb52a61d --- /dev/null +++ b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h @@ -0,0 +1,57 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _CIFACE_ANDROID_H_ +#define _CIFACE_ANDROID_H_ + +#include "../ControllerInterface.h" +#include "Android/ButtonManager.h" + +namespace ciface +{ +namespace Android +{ + +void Init( std::vector<ControllerInterface::Device*>& devices ); +class Touchscreen : public ControllerInterface::Device +{ +private: + class Button : public Input + { + public: + std::string GetName() const; + Button(ButtonManager::ButtonType index) : m_index(index) {} + ControlState GetState() const; + private: + const ButtonManager::ButtonType m_index; + }; + +public: + bool UpdateInput() { return true; } + bool UpdateOutput() { return true; } + + Touchscreen(); + ~Touchscreen() {} + + std::string GetName() const; + int GetId() const; + std::string GetSource() const; +}; + +} +} + +#endif diff --git a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp index 6a1427406d..6db79605a7 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp @@ -15,6 +15,9 @@ #ifdef CIFACE_USE_SDL #include "SDL/SDL.h" #endif +#ifdef CIFACE_USE_ANDROID + #include "Android/Android.h" +#endif #include "Thread.h" @@ -50,6 +53,9 @@ void ControllerInterface::Initialize() #ifdef CIFACE_USE_SDL ciface::SDL::Init(m_devices); #endif +#ifdef CIFACE_USE_ANDROID + ciface::Android::Init(m_devices); +#endif m_is_init = true; } @@ -100,6 +106,9 @@ void ControllerInterface::Shutdown() // TODO: there seems to be some sort of memory leak with SDL, quit isn't freeing everything up SDL_Quit(); #endif +#ifdef CIFACE_USE_ANDROID + // nothing needed +#endif m_is_init = false; } diff --git a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h index b846bb56e8..59bc49ac51 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h @@ -29,7 +29,10 @@ #if defined(__APPLE__) #define CIFACE_USE_OSX #endif - +#ifdef ANDROID + #define CIFACE_USE_ANDROID +#endif + // idk in case i wanted to change it to double or somethin, idk what's best typedef float ControlState; |
