| @@ -6,7 +6,7 @@ liblol_a_SOURCES = \ | |||||
| audio.cpp audio.h scene.cpp scene.h font.cpp font.h layer.cpp layer.h \ | 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 \ | 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 \ | 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 \ | 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 \ | text.cpp text.h emitter.cpp emitter.h numeric.h hash.cpp hash.h \ | ||||
| worldentity.cpp worldentity.h gradient.cpp gradient.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 \ | 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/shader.cpp gpu/shader.h \ | ||||
| gpu/indexbuffer.cpp gpu/indexbuffer.h \ | gpu/indexbuffer.cpp gpu/indexbuffer.h \ | ||||
| gpu/vertexbuffer.cpp gpu/vertexbuffer.h \ | gpu/vertexbuffer.cpp gpu/vertexbuffer.h \ | ||||
| @@ -57,12 +57,23 @@ void Camera::TickGame(float seconds) | |||||
| { | { | ||||
| WorldEntity::TickGame(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_position += vec3(rightleft, pgupdown, -updown) * 200.f * seconds; | ||||
| m_target += vec3(rightleft, 0, -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 "video.h" | ||||
| #include "audio.h" | #include "audio.h" | ||||
| #include "scene.h" | #include "scene.h" | ||||
| #include "input.h" | |||||
| #include "input/input.h" | |||||
| #include "input/stick.h" | |||||
| #include "profiler.h" | #include "profiler.h" | ||||
| // Entities | // Entities | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // 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 | // 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 | // modify it under the terms of the Do What The Fuck You Want To | ||||
| // Public License, Version 2, as published by Sam Hocevar. See | // Public License, Version 2, as published by Sam Hocevar. See | ||||
| @@ -48,6 +48,8 @@ private: | |||||
| WorldEntity *entities[MAX_ENTITIES]; | WorldEntity *entities[MAX_ENTITIES]; | ||||
| int nentities; | int nentities; | ||||
| WorldEntity *lastfocus; | WorldEntity *lastfocus; | ||||
| Array<Stick *> m_sticks; | |||||
| } | } | ||||
| inputdata; | inputdata; | ||||
| @@ -57,6 +59,7 @@ static InputData * const data = &inputdata; | |||||
| * Public Input class | * Public Input class | ||||
| */ | */ | ||||
| #if 0 | |||||
| vec2 Input::GetAxis(int axis) | vec2 Input::GetAxis(int axis) | ||||
| { | { | ||||
| vec2 ret; | vec2 ret; | ||||
| @@ -80,6 +83,7 @@ vec2 Input::GetAxis(int axis) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| #endif | |||||
| ivec2 Input::GetMousePos() | 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 */ | } /* 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 "lol/math/vector.h" | ||||
| #include "input/stick.h" | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -27,7 +28,6 @@ class Input | |||||
| { | { | ||||
| public: | public: | ||||
| /* These methods are general queries */ | /* These methods are general queries */ | ||||
| static vec2 GetAxis(int axis); | |||||
| static ivec2 GetMousePos(); | static ivec2 GetMousePos(); | ||||
| static ivec3 GetMouseButtons(); | static ivec3 GetMouseButtons(); | ||||
| //BH : Added this, is a v0.1 Alpha version. | //BH : Added this, is a v0.1 Alpha version. | ||||
| @@ -41,9 +41,19 @@ public: | |||||
| static void SetMousePos(ivec2 coord); | static void SetMousePos(ivec2 coord); | ||||
| static void SetMouseButton(int index); | static void SetMouseButton(int index); | ||||
| static void UnsetMouseButton(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 */ | } /* 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); | void Tick(float seconds); | ||||
| static ivec2 GetMousePos(); | static ivec2 GetMousePos(); | ||||
| #if defined USE_SDL | |||||
| Array<SDL_Joystick *, Stick *> m_joysticks; | |||||
| #endif | |||||
| }; | }; | ||||
| /* | /* | ||||
| @@ -41,21 +44,47 @@ private: | |||||
| */ | */ | ||||
| SdlInput::SdlInput() | SdlInput::SdlInput() | ||||
| : data(new SdlInputData()) | |||||
| : m_data(new SdlInputData()) | |||||
| { | { | ||||
| #if defined USE_SDL | #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 | #endif | ||||
| m_gamegroup = GAMEGROUP_BEFORE; | 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) | void SdlInput::TickGame(float seconds) | ||||
| { | { | ||||
| Entity::TickGame(seconds); | Entity::TickGame(seconds); | ||||
| #if !defined _WIN32 | #if !defined _WIN32 | ||||
| data->Tick(seconds); | |||||
| m_data->Tick(seconds); | |||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -64,7 +93,7 @@ void SdlInput::TickDraw(float seconds) | |||||
| Entity::TickDraw(seconds); | Entity::TickDraw(seconds); | ||||
| #if defined _WIN32 | #if defined _WIN32 | ||||
| data->Tick(seconds); | |||||
| m_data->Tick(seconds); | |||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -101,6 +130,15 @@ void SdlInputData::Tick(float seconds) | |||||
| Input::UnsetMouseButton(event.button.button - 1); | Input::UnsetMouseButton(event.button.button - 1); | ||||
| break; | 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 | #endif | ||||
| } | } | ||||
| SdlInput::~SdlInput() | |||||
| { | |||||
| delete data; | |||||
| } | |||||
| ivec2 SdlInputData::GetMousePos() | ivec2 SdlInputData::GetMousePos() | ||||
| { | { | ||||
| ivec2 ret(-1, -1); | ivec2 ret(-1, -1); | ||||
| @@ -34,7 +34,7 @@ protected: | |||||
| virtual void TickDraw(float seconds); | virtual void TickDraw(float seconds); | ||||
| private: | private: | ||||
| SdlInputData *data; | |||||
| SdlInputData *m_data; | |||||
| }; | }; | ||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| @@ -98,7 +98,8 @@ | |||||
| <ClCompile Include="..\src\image\codec\ps3-image.cpp" /> | <ClCompile Include="..\src\image\codec\ps3-image.cpp" /> | ||||
| <ClCompile Include="..\src\image\codec\sdl-image.cpp" /> | <ClCompile Include="..\src\image\codec\sdl-image.cpp" /> | ||||
| <ClCompile Include="..\src\image\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\layer.cpp" /> | ||||
| <ClCompile Include="..\src\log.cpp" /> | <ClCompile Include="..\src\log.cpp" /> | ||||
| <ClCompile Include="..\src\map.cpp" /> | <ClCompile Include="..\src\map.cpp" /> | ||||
| @@ -149,7 +150,8 @@ | |||||
| <ClInclude Include="..\src\hash.h" /> | <ClInclude Include="..\src\hash.h" /> | ||||
| <ClInclude Include="..\src\image\image-private.h" /> | <ClInclude Include="..\src\image\image-private.h" /> | ||||
| <ClInclude Include="..\src\image\image.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\layer.h" /> | ||||
| <ClInclude Include="..\src\log.h" /> | <ClInclude Include="..\src\log.h" /> | ||||
| <ClInclude Include="..\src\loldebug.h" /> | <ClInclude Include="..\src\loldebug.h" /> | ||||
| @@ -41,6 +41,9 @@ | |||||
| <Filter Include="src\platform\xbox"> | <Filter Include="src\platform\xbox"> | ||||
| <UniqueIdentifier>{317cb5cc-5dcc-4e14-be90-40a125a2e2ec}</UniqueIdentifier> | <UniqueIdentifier>{317cb5cc-5dcc-4e14-be90-40a125a2e2ec}</UniqueIdentifier> | ||||
| </Filter> | </Filter> | ||||
| <Filter Include="src\input"> | |||||
| <UniqueIdentifier>{94992c0e-ebc5-4185-b766-323b06547dcf}</UniqueIdentifier> | |||||
| </Filter> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ClCompile Include="..\src\image\image.cpp"> | <ClCompile Include="..\src\image\image.cpp"> | ||||
| @@ -100,9 +103,6 @@ | |||||
| <ClCompile Include="..\src\hash.cpp"> | <ClCompile Include="..\src\hash.cpp"> | ||||
| <Filter>src</Filter> | <Filter>src</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| <ClCompile Include="..\src\input.cpp"> | |||||
| <Filter>src</Filter> | |||||
| </ClCompile> | |||||
| <ClCompile Include="..\src\layer.cpp"> | <ClCompile Include="..\src\layer.cpp"> | ||||
| <Filter>src</Filter> | <Filter>src</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| @@ -196,6 +196,12 @@ | |||||
| <ClCompile Include="..\src\gpu\indexbuffer.cpp"> | <ClCompile Include="..\src\gpu\indexbuffer.cpp"> | ||||
| <Filter>src\gpu</Filter> | <Filter>src\gpu</Filter> | ||||
| </ClCompile> | </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> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ClInclude Include="..\src\image\image.h"> | <ClInclude Include="..\src\image\image.h"> | ||||
| @@ -258,9 +264,6 @@ | |||||
| <ClInclude Include="..\src\hash.h"> | <ClInclude Include="..\src\hash.h"> | ||||
| <Filter>src</Filter> | <Filter>src</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="..\src\input.h"> | |||||
| <Filter>src</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="..\src\layer.h"> | <ClInclude Include="..\src\layer.h"> | ||||
| <Filter>src</Filter> | <Filter>src</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| @@ -372,5 +375,11 @@ | |||||
| <ClInclude Include="..\src\lol\debug.h"> | <ClInclude Include="..\src\lol\debug.h"> | ||||
| <Filter>src\lol</Filter> | <Filter>src\lol</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="..\src\input\input.h"> | |||||
| <Filter>src\input</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="..\src\input\stick.h"> | |||||
| <Filter>src\input</Filter> | |||||
| </ClInclude> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| </Project> | </Project> | ||||