| @@ -6,7 +6,7 @@ liblol_a_SOURCES = \ | |||
| audio.cpp audio.h scene.cpp scene.h font.cpp font.h layer.cpp layer.h \ | |||
| map.cpp map.h entity.cpp entity.h ticker.cpp ticker.h lolgl.h \ | |||
| tileset.cpp tileset.h forge.cpp forge.h video.cpp video.h log.cpp log.h \ | |||
| timer.cpp timer.h bitfield.h profiler.cpp profiler.h input.h input.cpp \ | |||
| timer.cpp timer.h bitfield.h profiler.cpp profiler.h \ | |||
| world.cpp world.h sample.cpp sample.h sampler.cpp sampler.h \ | |||
| text.cpp text.h emitter.cpp emitter.h numeric.h hash.cpp hash.h \ | |||
| worldentity.cpp worldentity.h gradient.cpp gradient.h \ | |||
| @@ -28,6 +28,9 @@ liblol_a_SOURCES = \ | |||
| \ | |||
| math/vector.cpp math/real.cpp math/half.cpp math/trig.cpp math/trig.h \ | |||
| \ | |||
| input/input.cpp input/input.h \ | |||
| input/stick.cpp input/stick.h \ | |||
| \ | |||
| gpu/shader.cpp gpu/shader.h \ | |||
| gpu/indexbuffer.cpp gpu/indexbuffer.h \ | |||
| gpu/vertexbuffer.cpp gpu/vertexbuffer.h \ | |||
| @@ -57,12 +57,23 @@ void Camera::TickGame(float seconds) | |||
| { | |||
| WorldEntity::TickGame(seconds); | |||
| int updown = Input::GetButtonState(273 /*SDLK_UP*/) | |||
| - Input::GetButtonState(274 /*SDLK_DOWN*/); | |||
| int rightleft = Input::GetButtonState(275 /*SDLK_RIGHT*/) | |||
| - Input::GetButtonState(276 /*SDLK_LEFT*/); | |||
| int pgupdown = Input::GetButtonState(280 /*SDLK_PAGEUP*/) | |||
| - Input::GetButtonState(281 /*SDLK_PAGEDOWN*/); | |||
| /* Hackish keyboard support */ | |||
| float updown = Input::GetButtonState(273 /*SDLK_UP*/) | |||
| - Input::GetButtonState(274 /*SDLK_DOWN*/); | |||
| float rightleft = Input::GetButtonState(275 /*SDLK_RIGHT*/) | |||
| - Input::GetButtonState(276 /*SDLK_LEFT*/); | |||
| float pgupdown = Input::GetButtonState(280 /*SDLK_PAGEUP*/) | |||
| - Input::GetButtonState(281 /*SDLK_PAGEDOWN*/); | |||
| /* Hackish stick support */ | |||
| static Stick *stick = NULL; | |||
| if (!stick) | |||
| stick = Input::TrackStick(); | |||
| if (stick && stick->GetAxisCount() >= 2) | |||
| { | |||
| rightleft = 2.f * stick->GetAxis(0) * std::abs(stick->GetAxis(0)); | |||
| updown = -2.f * stick->GetAxis(1) * std::abs(stick->GetAxis(1)); | |||
| } | |||
| m_position += vec3(rightleft, pgupdown, -updown) * 200.f * seconds; | |||
| m_target += vec3(rightleft, 0, -updown) * 200.f * seconds; | |||
| @@ -78,7 +78,8 @@ static inline int isnan(float f) | |||
| #include "video.h" | |||
| #include "audio.h" | |||
| #include "scene.h" | |||
| #include "input.h" | |||
| #include "input/input.h" | |||
| #include "input/stick.h" | |||
| #include "profiler.h" | |||
| // Entities | |||
| @@ -1,7 +1,7 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||
| // Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| @@ -48,6 +48,8 @@ private: | |||
| WorldEntity *entities[MAX_ENTITIES]; | |||
| int nentities; | |||
| WorldEntity *lastfocus; | |||
| Array<Stick *> m_sticks; | |||
| } | |||
| inputdata; | |||
| @@ -57,6 +59,7 @@ static InputData * const data = &inputdata; | |||
| * Public Input class | |||
| */ | |||
| #if 0 | |||
| vec2 Input::GetAxis(int axis) | |||
| { | |||
| vec2 ret; | |||
| @@ -80,6 +83,7 @@ vec2 Input::GetAxis(int axis) | |||
| return ret; | |||
| } | |||
| #endif | |||
| ivec2 Input::GetMousePos() | |||
| { | |||
| @@ -194,5 +198,35 @@ void Input::UnsetMouseButton(int index) | |||
| } | |||
| } | |||
| Stick *Input::CreateStick() | |||
| { | |||
| Stick *stick = new Stick(); | |||
| Ticker::Ref(stick); | |||
| data->m_sticks.Push(stick); | |||
| return stick; | |||
| } | |||
| void Input::DestroyStick(Stick *stick) | |||
| { | |||
| for (int i = 0; i < data->m_sticks.Count(); i++) | |||
| if (data->m_sticks[i] == stick) | |||
| data->m_sticks.Remove(i); | |||
| Ticker::Unref(stick); | |||
| } | |||
| Stick *Input::TrackStick() | |||
| { | |||
| /* FIXME: add the possibility to choose amongst sticks */ | |||
| if (!data->m_sticks.Count()) | |||
| return NULL; | |||
| Ticker::Ref(data->m_sticks[0]); | |||
| return data->m_sticks[0]; | |||
| } | |||
| void Input::UntrackStick(Stick *stick) | |||
| { | |||
| Ticker::Unref(stick); | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -13,10 +13,11 @@ | |||
| // ---------------------- | |||
| // | |||
| #if !defined __LOL_INPUT_H__ | |||
| #define __LOL_INPUT_H__ | |||
| #if !defined __LOL_INPUT_INPUT_H__ | |||
| #define __LOL_INPUT_INPUT_H__ | |||
| #include "lol/math/vector.h" | |||
| #include "input/stick.h" | |||
| namespace lol | |||
| { | |||
| @@ -27,7 +28,6 @@ class Input | |||
| { | |||
| public: | |||
| /* These methods are general queries */ | |||
| static vec2 GetAxis(int axis); | |||
| static ivec2 GetMousePos(); | |||
| static ivec3 GetMouseButtons(); | |||
| //BH : Added this, is a v0.1 Alpha version. | |||
| @@ -41,9 +41,19 @@ public: | |||
| static void SetMousePos(ivec2 coord); | |||
| static void SetMouseButton(int index); | |||
| static void UnsetMouseButton(int index); | |||
| /* | |||
| * Joystick handling | |||
| */ | |||
| static Stick *CreateStick(); | |||
| static void DestroyStick(Stick *stick); | |||
| static Stick *TrackStick(); | |||
| static void UntrackStick(Stick *stick); | |||
| }; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_INPUT_H__ | |||
| #endif // __LOL_INPUT_INPUT_H__ | |||
| @@ -0,0 +1,99 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| #include <cstdlib> | |||
| #include <cmath> | |||
| #include "core.h" | |||
| namespace lol | |||
| { | |||
| /* | |||
| * Stick implementation class | |||
| */ | |||
| static class StickData | |||
| { | |||
| friend class Stick; | |||
| public: | |||
| StickData() { } | |||
| private: | |||
| Array<float> m_axes; | |||
| Array<int> m_buttons; | |||
| } | |||
| stickdata; | |||
| /* | |||
| * Public Stick class | |||
| */ | |||
| Stick::Stick() | |||
| : m_data(new StickData()) | |||
| { | |||
| } | |||
| Stick::~Stick() | |||
| { | |||
| delete m_data; | |||
| } | |||
| void Stick::SetAxisCount(int n) | |||
| { | |||
| m_data->m_axes.Empty(); | |||
| for (int i = 0; i < n; i++) | |||
| m_data->m_axes.Push(0.f); | |||
| } | |||
| void Stick::SetButtonCount(int n) | |||
| { | |||
| m_data->m_buttons.Empty(); | |||
| for (int i = 0; i < n; i++) | |||
| m_data->m_buttons.Push(0); | |||
| } | |||
| void Stick::SetAxis(int n, float val) | |||
| { | |||
| m_data->m_axes[n] = val; | |||
| } | |||
| void Stick::SetButton(int n, int val) | |||
| { | |||
| m_data->m_buttons[n] = val; | |||
| } | |||
| int Stick::GetAxisCount() | |||
| { | |||
| return m_data->m_axes.Count(); | |||
| } | |||
| int Stick::GetButtonCount() | |||
| { | |||
| return m_data->m_buttons.Count(); | |||
| } | |||
| float Stick::GetAxis(int n) | |||
| { | |||
| return m_data->m_axes[n]; | |||
| } | |||
| int Stick::GetButton(int n) | |||
| { | |||
| return m_data->m_buttons[n]; | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -0,0 +1,50 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
| // | |||
| // | |||
| // The Stick class | |||
| // --------------- | |||
| // | |||
| #if !defined __LOL_INPUT_STICK_H__ | |||
| #define __LOL_INPUT_STICK_H__ | |||
| #include "entity.h" | |||
| namespace lol | |||
| { | |||
| class StickData; | |||
| class Stick : public Entity | |||
| { | |||
| friend class Input; | |||
| public: | |||
| void SetAxisCount(int n); | |||
| void SetButtonCount(int n); | |||
| void SetAxis(int n, float val); | |||
| void SetButton(int n, int val); | |||
| int GetAxisCount(); | |||
| int GetButtonCount(); | |||
| float GetAxis(int n); | |||
| int GetButton(int n); | |||
| private: | |||
| Stick(); | |||
| ~Stick(); | |||
| StickData *m_data; | |||
| }; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_INPUT_STICK_H__ | |||
| @@ -34,6 +34,9 @@ private: | |||
| void Tick(float seconds); | |||
| static ivec2 GetMousePos(); | |||
| #if defined USE_SDL | |||
| Array<SDL_Joystick *, Stick *> m_joysticks; | |||
| #endif | |||
| }; | |||
| /* | |||
| @@ -41,21 +44,47 @@ private: | |||
| */ | |||
| SdlInput::SdlInput() | |||
| : data(new SdlInputData()) | |||
| : m_data(new SdlInputData()) | |||
| { | |||
| #if defined USE_SDL | |||
| SDL_Init(SDL_INIT_TIMER); | |||
| SDL_Init(SDL_INIT_TIMER | SDL_INIT_JOYSTICK); | |||
| /* Register all the joysticks we can find, and let the input | |||
| * system decide what it wants to track. */ | |||
| SDL_JoystickEventState(SDL_ENABLE); | |||
| for (int i = 0; i < SDL_NumJoysticks(); i++) | |||
| { | |||
| SDL_Joystick *sdlstick = SDL_JoystickOpen(i); | |||
| Stick *stick = Input::CreateStick(); | |||
| stick->SetAxisCount(SDL_JoystickNumAxes(sdlstick)); | |||
| stick->SetButtonCount(SDL_JoystickNumButtons(sdlstick)); | |||
| m_data->m_joysticks.Push(sdlstick, stick); | |||
| } | |||
| #endif | |||
| m_gamegroup = GAMEGROUP_BEFORE; | |||
| } | |||
| SdlInput::~SdlInput() | |||
| { | |||
| #if defined USE_SDL | |||
| /* Unregister all the joysticks we added */ | |||
| while (m_data->m_joysticks.Count()) | |||
| { | |||
| SDL_JoystickClose(m_data->m_joysticks[0].m1); | |||
| Input::DestroyStick(m_data->m_joysticks[0].m2); | |||
| m_data->m_joysticks.Remove(0); | |||
| } | |||
| #endif | |||
| delete m_data; | |||
| } | |||
| void SdlInput::TickGame(float seconds) | |||
| { | |||
| Entity::TickGame(seconds); | |||
| #if !defined _WIN32 | |||
| data->Tick(seconds); | |||
| m_data->Tick(seconds); | |||
| #endif | |||
| } | |||
| @@ -64,7 +93,7 @@ void SdlInput::TickDraw(float seconds) | |||
| Entity::TickDraw(seconds); | |||
| #if defined _WIN32 | |||
| data->Tick(seconds); | |||
| m_data->Tick(seconds); | |||
| #endif | |||
| } | |||
| @@ -101,6 +130,15 @@ void SdlInputData::Tick(float seconds) | |||
| Input::UnsetMouseButton(event.button.button - 1); | |||
| break; | |||
| } | |||
| case SDL_JOYAXISMOTION: | |||
| m_joysticks[event.jaxis.which].m2->SetAxis(event.jaxis.axis, (float)event.jaxis.value / 32768.f); | |||
| break; | |||
| case SDL_JOYBUTTONUP: | |||
| case SDL_JOYBUTTONDOWN: | |||
| m_joysticks[event.jbutton.which].m2->SetButton(event.jbutton.button, event.jbutton.state); | |||
| break; | |||
| } | |||
| } | |||
| @@ -114,11 +152,6 @@ void SdlInputData::Tick(float seconds) | |||
| #endif | |||
| } | |||
| SdlInput::~SdlInput() | |||
| { | |||
| delete data; | |||
| } | |||
| ivec2 SdlInputData::GetMousePos() | |||
| { | |||
| ivec2 ret(-1, -1); | |||
| @@ -34,7 +34,7 @@ protected: | |||
| virtual void TickDraw(float seconds); | |||
| private: | |||
| SdlInputData *data; | |||
| SdlInputData *m_data; | |||
| }; | |||
| } /* namespace lol */ | |||
| @@ -98,7 +98,8 @@ | |||
| <ClCompile Include="..\src\image\codec\ps3-image.cpp" /> | |||
| <ClCompile Include="..\src\image\codec\sdl-image.cpp" /> | |||
| <ClCompile Include="..\src\image\image.cpp" /> | |||
| <ClCompile Include="..\src\input.cpp" /> | |||
| <ClCompile Include="..\src\input\input.cpp" /> | |||
| <ClCompile Include="..\src\input\stick.cpp" /> | |||
| <ClCompile Include="..\src\layer.cpp" /> | |||
| <ClCompile Include="..\src\log.cpp" /> | |||
| <ClCompile Include="..\src\map.cpp" /> | |||
| @@ -149,7 +150,8 @@ | |||
| <ClInclude Include="..\src\hash.h" /> | |||
| <ClInclude Include="..\src\image\image-private.h" /> | |||
| <ClInclude Include="..\src\image\image.h" /> | |||
| <ClInclude Include="..\src\input.h" /> | |||
| <ClInclude Include="..\src\input\input.h" /> | |||
| <ClInclude Include="..\src\input\stick.h" /> | |||
| <ClInclude Include="..\src\layer.h" /> | |||
| <ClInclude Include="..\src\log.h" /> | |||
| <ClInclude Include="..\src\loldebug.h" /> | |||
| @@ -41,6 +41,9 @@ | |||
| <Filter Include="src\platform\xbox"> | |||
| <UniqueIdentifier>{317cb5cc-5dcc-4e14-be90-40a125a2e2ec}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="src\input"> | |||
| <UniqueIdentifier>{94992c0e-ebc5-4185-b766-323b06547dcf}</UniqueIdentifier> | |||
| </Filter> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <ClCompile Include="..\src\image\image.cpp"> | |||
| @@ -100,9 +103,6 @@ | |||
| <ClCompile Include="..\src\hash.cpp"> | |||
| <Filter>src</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\src\input.cpp"> | |||
| <Filter>src</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\src\layer.cpp"> | |||
| <Filter>src</Filter> | |||
| </ClCompile> | |||
| @@ -196,6 +196,12 @@ | |||
| <ClCompile Include="..\src\gpu\indexbuffer.cpp"> | |||
| <Filter>src\gpu</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\src\input\input.cpp"> | |||
| <Filter>src\input</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\src\input\stick.cpp"> | |||
| <Filter>src\input</Filter> | |||
| </ClCompile> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <ClInclude Include="..\src\image\image.h"> | |||
| @@ -258,9 +264,6 @@ | |||
| <ClInclude Include="..\src\hash.h"> | |||
| <Filter>src</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\src\input.h"> | |||
| <Filter>src</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\src\layer.h"> | |||
| <Filter>src</Filter> | |||
| </ClInclude> | |||
| @@ -372,5 +375,11 @@ | |||
| <ClInclude Include="..\src\lol\debug.h"> | |||
| <Filter>src\lol</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\src\input\input.h"> | |||
| <Filter>src\input</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\src\input\stick.h"> | |||
| <Filter>src\input</Filter> | |||
| </ClInclude> | |||
| </ItemGroup> | |||
| </Project> | |||