@@ -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> |